怎么选择分区键?

发布于 20 天前 作者 jiayanju 140 次浏览 来自 问答

大家好, 咨询一下分区键的选择问题。 现在项目里面的表简化如下,其中appid会一直增长,会达到数千个。查询基本都是基于eventdate和appid的。 CREATE TABLE test.test_custom_partition ( company_id UInt64, app_id String, event_date DateTime, event_name String ) ENGINE MergeTree() PARTITION BY (toYYYYMMDD(event_date), app_id) ORDER BY (app_id, company_id, event_date) SETTINGS index_granularity = 8192;

select event_name from test_custom_partition where event_date >= ‘2020-07-01 00:00:00’ AND event_date <= '2020-07-15 00:00:00’ AND app_id = ‘test’;

我是想用(toYYYYMMDD(event_date), app_id)作为分区键,这样查询的时候可以过滤掉尽量多的分区目录。 但是看文档里面建议分区不超过1000个,如果用appid的话,分区就会超过1000个。 A merge only works for data parts that have the same value for the partitioning expression. This means you shouldn’t make overly granular partitions (more than about a thousand partitions). Otherwise, the SELECT query performs poorly because of an unreasonably large number of files in the file system and open file descriptors. 我的问题是:

  1. 分区不超过1000个是对整个表来说的,还是单次select查询用到的分区数
  2. 分区目录多影响查询性能,是针多那些方面来说影响性能的?
  3. 对应分区键,有什么比较好的实践建议吗?

谢谢大家

1 回复

分区不超过1000个是对于整个表来说的,分区过多对各方面都有影响,查询要打开的文件符过多 小文件过多等等等等,所以每次查询的时候结果值会返回的很慢,关于你这个表的 分区键可以单独使用 toYYYYMMDD(eventdate)或者eventdate 就好(按照你们业务的数据存储天数来,如果要存储三年以上数据还是建议按照月分区) 没必要加appid 可以把 eventdate和appid放到order by里边,如果按照eventdate分区了就不要在order by里放了,根据你这个查询语句来看的话 建议按照 toYYYYMMDD(eventdate)分区 order by的顺序是 eventdate,appid哦

回到顶部