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). 
const Names & column_names,
    const StorageMetadataPtr & metadata_snapshot,
    SelectQueryInfo & query_info,
    const Context & context,
    QueryProcessingStage::Enum ,
    const size_t ,
    const unsigned )
{
    bool has_state_column = hasStateColumn(column_names, metadata_snapshot);
    StoragesInfoStream stream(query_info, context);
    
    MutableColumns res_columns = metadata_snapshot->getSampleBlock().cloneEmptyColumns();
    if (has_state_column)
        res_columns.push_back(ColumnString::create());
    while (StoragesInfo info = stream.next())
    {
        processNextStorage(res_columns, info, has_state_column);
    }
    Block header = metadata_snapshot->getSampleBlock();
    if (has_state_column)
        header.insert(ColumnWithTypeAndName(std::make_shared<DataTypeString>(), "_state"));
    UInt64 num_rows = res_columns.at(0)->size();
    Chunk chunk(std::move(res_columns), num_rows);
    return Pipe(std::make_shared<SourceFromSingleChunk>(std::move(header), std::move(chunk)));
}
StorageSystemPartsBase::StorageSystemPartsBase(const StorageID & table_id_, NamesAndTypesList && columns_)