集群键
在 Databend 中,您可以选择通过集群表来增强查询性能。这涉及向 Databend 提供明确的指令,以如何组织和分组存储中的行,而不仅仅依赖于数据摄取的顺序。您可以通过定义一个集群键来集群表,通常由一个或多个列或表达式组成。因此,Databend 根据此集群键排列数据,将相似的行分组到相邻的块中。这些块对 应于 Databend 用于数据存储的 Parquet 文件。有关更多详细信息,请参阅 Databend 数据存储:快照、段和块。
在大多数情况下,设置集群键并非必要。集群或重新集群表需要时间并消耗您的信用点,尤其是在 Databend Cloud 环境中。Databend 建议主要为查询性能较慢的大表定义集群键。
集群键作为 Databend 元服务层中的元数据与存储块(Parquet 文件)之间的连接。一旦为表定义了集群键,表的元数据将建立一个键值列表,指示列或表达式值与其各自存储块之间的连接。当执行查询时,Databend 可以使用元数据快速定位正确的块,并读取比未设置集群键时更少的行。
集群键的工作原理
让我们考虑一个包含加拿大所有城市温度的表,具有三列:城市、温度和 省份。
CREATE TABLE T (
城市 VARCHAR(255),
温度 DECIMAL(10, 2),
省份 VARCHAR(255)
);
如果您的查询主要涉及根据温度检索城市,请将集群键设置为温度列。以下说明了给定表的数据如何在块中存储:
行根据每个块(文件)中的温度列进行排序。然而,块之间可能存在重叠的温度范围。如果查询恰好落在块的重叠范围内,则需要读取多个块。在这种情况下涉及的块数量称为“深度”。因此,深度越小越好。这意味着在查询期间读取的相关块越少,查询性能越好。
要查看表的集群情况,请使用函数 CLUSTERING_INFORMATION。 注意:此函数仅适用于已集群的表。 例如,
SELECT * FROM clustering_information('default','T');
*************************** 1. row ***************************
cluster_key: (id)
total_block_count: 451
constant_block_count: 0
unclustered_block_count: 0
average_overlaps: 2.1774
average_depth: 2.4612
block_depth_histogram: {"00001":32,"00002":217,"00003":164,"00004":38}
1 row in set (0.02 sec)
Read 1 rows, 448.00 B in 0.015 sec., 67.92 rows/sec., 29.71 KiB/sec.
参数 | 描述 |
---|---|
cluster_key | 定义的集群键。 |
total_block_count | 当前块的数量。 |
constant_block_count | 最小/最大值相等的块数量,意味着每个块仅包含一个(组)集群键值。 |
unclustered_block_count | 尚未集群的块数量。 |
average_overlaps | 给定范围内重叠块的平均比例。 |
average_depth | 集群键的平均重叠分区深度。 |
block_depth_histogram | 每个深度级别的分区数量。较低深度级别的分区集中度越高,表示表的集群效果越好。 |
选择集群键
集群键可以是表中的一个或多个列,或者是基于这些列的表达式。通常,您定义的集群键应与数据查询中的主要过滤器一致。例如,如果大多数查询涉及按 order_id
过滤数据,建议将 order_id
列设置为表的集群键。
CREATE TABLE sales (
order_id INT,
order_date TIMESTAMP,
product_id INT,
is_secondhand BOOLEAN,
quantity INT,
region VARCHAR,
product_category VARCHAR,
-- 其他列...
) CLUSTER BY (order_id);