ClickHouse/src/Storages/StorageValues.h
Azat Khuzhin 3c4f638bd7 Disable parallelize_output_from_storages for storages with only one block
$ clickhouse-benchmark -i 10000 -d 0 --parallelize_output_from_storages=0 -q "select * from values('foo')"
    Loaded 1 queries.

    Queries executed: 10000.

    localhost:9000, queries 10000, QPS: 2800.490, RPS: 2800.490, MiB/s: 0.032, result RPS: 2800.490, result MiB/s: 0.032.

    0.000%          0.000 sec.
    10.000%         0.000 sec.
    20.000%         0.000 sec.
    30.000%         0.000 sec.
    40.000%         0.000 sec.
    50.000%         0.000 sec.
    60.000%         0.000 sec.
    70.000%         0.000 sec.
    80.000%         0.000 sec.
    90.000%         0.000 sec.
    95.000%         0.000 sec.
    99.000%         0.001 sec.
    99.900%         0.001 sec.
    99.990%         0.001 sec.

    $ clickhouse-benchmark -i 10000 -d 0 --parallelize_output_from_storages=1 -q "select * from values('foo')"
    Loaded 1 queries.

    Queries executed: 10000.

    localhost:9000, queries 10000, QPS: 1259.805, RPS: 1259.805, MiB/s: 0.014, result RPS: 1259.805, result MiB/s: 0.014.

    0.000%          0.001 sec.
    10.000%         0.001 sec.
    20.000%         0.001 sec.
    30.000%         0.001 sec.
    40.000%         0.001 sec.
    50.000%         0.001 sec.
    60.000%         0.001 sec.
    70.000%         0.001 sec.
    80.000%         0.001 sec.
    90.000%         0.001 sec.
    95.000%         0.001 sec.
    99.000%         0.001 sec.
    99.900%         0.001 sec.
    99.990%         0.003 sec.

Signed-off-by: Azat Khuzhin <a.khuzhin@semrush.com>
2023-06-14 19:11:23 +03:00

47 lines
1.4 KiB
C++

#pragma once
#include <Storages/IStorage.h>
namespace DB
{
/* One block storage used for values table function
* It's structure is similar to IStorageSystemOneBlock
*/
class StorageValues final : public IStorage
{
public:
StorageValues(
const StorageID & table_id_, const ColumnsDescription & columns_, const Block & res_block_, const NamesAndTypesList & virtuals_ = {});
std::string getName() const override { return "Values"; }
Pipe read(
const Names & column_names,
const StorageSnapshotPtr & storage_snapshot,
SelectQueryInfo & query_info,
ContextPtr context,
QueryProcessingStage::Enum processed_stage,
size_t max_block_size,
size_t num_streams) override;
/// Why we may have virtual columns in the storage from a single block?
/// Because it used as tmp storage for pushing blocks into views, and some
/// views may contain virtual columns from original storage.
NamesAndTypesList getVirtuals() const override
{
return virtuals;
}
/// FIXME probably it should return false, but StorageValues is used in ExecutingInnerQueryFromViewTransform (whatever it is)
bool supportsTransactions() const override { return true; }
bool parallelizeOutputAfterReading(ContextPtr) const override { return false; }
private:
Block res_block;
NamesAndTypesList virtuals;
};
}