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 auto active = (*active_column)[next_row].get<UInt64>();
            if (active == 0)
                info.need_inactive_parts = true;
        }
        info.storage = storages.at(std::make_pair(info.database, info.table));
        try
        {
            
            info.table_lock = info.storage->lockForShare(query_id, settings.lock_acquire_timeout);
        }
        catch (const Exception & e)
        {
            /** There are case when IStorage::drop was called,
              *  but we still own the object.
              * Then table will throw exception at attempt to lock it.
              * Just skip the table.
              */
            if (e.code() == ErrorCodes::TABLE_IS_DROPPED)
                continue;
            throw;
        }
        info.engine = info.storage->getName();
        info.data = dynamic_cast<MergeTreeData *>(info.storage.get());
        if (!info.data)
            throw Exception("Unknown engine " + info.engine, ErrorCodes::LOGICAL_ERROR);
        return info;
    }
    return {};
}
Pipe StorageSystemPartsBase::read(