When user requested single column from the table we still calculating all of them. Calculation of some columns is quite expensive (need to do stat calls / read files etc). 
{
    bool has_state_column = false;
    Names real_column_names;
    for (const String & column_name : column_names)
    {
        if (column_name == "_state")
            has_state_column = true;
        else
            real_column_names.emplace_back(column_name);
    }
    
    if (!(has_state_column && real_column_names.empty()))
        metadata_snapshot->check(real_column_names, {}, getStorageID());
    return has_state_column;
}
MergeTreeData::DataPartsVector
StoragesInfo::getParts(MergeTreeData::DataPartStateVector & state, bool has_state_column) const
{
    using State = MergeTreeData::DataPartState;
    if (need_inactive_parts)
    {
        
        if (!has_state_column)
            return data->getDataPartsVector({State::Committed, State::Outdated}, &state);
        return data->getAllDataPartsVector(&state);
    }
    return data->getDataPartsVector({State::Committed}, &state);
}
StoragesInfoStream::StoragesInfoStream(const SelectQueryInfo & query_info, const Context & context)