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). 
{
public:
    Pipe read(
        const Names & column_names,
        const StorageMetadataPtr & metadata_snapshot,
        SelectQueryInfo & query_info,
        const Context & context,
        QueryProcessingStage::Enum processed_stage,
        size_t max_block_size,
        unsigned num_streams) override;
    NamesAndTypesList getVirtuals() const override;
private:
    bool hasStateColumn(const Names & column_names, const StorageMetadataPtr & metadata_snapshot) const;
protected:
    const FormatSettings format_settings;
    StorageSystemPartsBase(const StorageID & table_id_, NamesAndTypesList && columns_);
    virtual void processNextStorage(MutableColumns & columns, const StoragesInfo & info, bool has_state_column) = 0;
};
}