ClickHouse MergeTree 使用 ORDER BY 进行慢速选择

Posted

技术标签:

【中文标题】ClickHouse MergeTree 使用 ORDER BY 进行慢速选择【英文标题】:ClickHouse MergeTree slow SELECT with ORDER BY 【发布时间】:2019-12-16 15:47:21 【问题描述】:

我开始学习 CH 并且在尝试提高查询速度时似乎遇到了死胡同,表是这样创建的

CREATE TABLE default.stats(
  aa String, 
  ab String, 
  user_id UInt16, 
  ac UInt32,  
  ad UInt8, 
  ae UInt8, 
  created_time DateTime, 
  created_date Date, 
  af UInt8, 
  ag UInt32, 
  ah UInt32, 
  ai String, 
  aj String) 
ENGINE = MergeTree 
PARTITION BY toYYYYMM(created_time) 
ORDER BY(created_time, user_id)

我正在运行这样的查询

SELECT ad, created_time, ab, aa, user_id, ac, ag, af 
FROM stats 
WHERE user_id = 1 AND lowerUTF8(ab) = 'xxxxxxxxx' AND ad != 12 
ORDER BY created_time DESC 
LIMIT 50 OFFSET 0

这是 50 行集合中的结果。经过:2.881 秒。处理了 7462 万行

如果我在没有订单部分的情况下运行相同的查询,集合中有 50 行。经过:0.020 秒。处理了 49150 行

如果理论上查询只需要订购大约 10k(所有返回的行没有限制)行,为什么它似乎处理了表中的所有行?我错过了什么和/或如何提高 CH 的速度?

【问题讨论】:

【参考方案1】:

尝试 ORDER BY created_time DESC, user_id

optimize_read_in_order 功能已在 ClickHouse 版本 19.14.3.3,2019-09-10 中实现

【讨论】:

大致相同的结果,没有顺序 50 行集合。经过:0.021 秒。处理了 16.38 万行,订单集 50 行。经过:1.855 秒。处理了 2431 万行,我还将我的 CH 版本更新为 19.17.5 修订 54428 没有where WHERE 1的查询的统计信息如何 你在这之后吗? 74818400 行在集合中。经过:14.823 秒。处理了 7482 万行,4.31 GB(505 万行/秒,290.91 MB/秒。)【参考方案2】:
CH 19.17.4.11
CREATE TABLE stats
(
    `aa` String,
    `ab` String,
    `user_id` UInt16,
    `ac` UInt32,
    `ad` UInt8,
    `ae` UInt8,
    `created_time` DateTime,
    `created_date` Date,
    `af` UInt8,
    `ag` UInt32,
    `ah` UInt32,
    `ai` String,
    `aj` String
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(created_time)
ORDER BY (created_time, user_id)

insert into stats(created_time, user_id) select toDateTime(intDiv(number,100)), number%103 from numbers(100000000)


SELECT ad, created_time, ab, aa, user_id, ac, ag, af
FROM stats
ORDER BY created_time DESC
LIMIT 5 OFFSET 0

5 rows in set. Elapsed: 0.013 sec. Processed 835.84 thousand rows,


set  optimize_read_in_order = 0

SELECT ad, created_time, ab, aa, user_id, ac, ag, af
FROM stats
ORDER BY created_time DESC
LIMIT 5 OFFSET 0

5 rows in set. Elapsed: 0.263 sec. Processed 100.00 million rows

检查差异 设置 optimize_read_in_order = 0 VS 设置 optimize_read_in_order = 1

我不明白为什么 optimize_read_in_order 在你的情况下不起作用。

【讨论】:

以上是关于ClickHouse MergeTree 使用 ORDER BY 进行慢速选择的主要内容,如果未能解决你的问题,请参考以下文章

大数据ClickHouse进阶:MergeTree表引擎

客快物流大数据项目(九十二):ClickHouse的MergeTree系列引擎介绍和MergeTree深入了解

ClickHouse 合并树表引擎 MergeTree 原理分析

大数据ClickHouse:MergeTree系列表引擎之AggregatingMergeTree

大数据ClickHouse:MergeTree系列表引擎之SummingMergeTree

ClickHouse MergeTree 使用 ORDER BY 进行慢速选择