我目前面临查询缓慢的问题,主要是由于
my_table_local
表太大,当尝试使用ARRAY JOIN操作扩展数据列时,情况变得更加难以忍受。即使是简单的行计数操作也需要几分钟:
SELECT count() FROM my_table_local ARRAY JOIN data
为了解决这个问题,我尝试创建一个名为
my_table_expanded_local
的类似表,其中包含扩展的数据,但令人惊讶的是,对该表的查询速度甚至更慢(慢了 2 倍)。使用 EXPLAIN 命令分析情况后,很明显从扩展表中读取比执行 ARRAY JOIN 慢。
扩展表导致行数比原来大大约 30 倍。
我的具体用例需要使用通用查询。因此,聚合表或物化视图之类的选项是不可行的,除非它们能够无缝支持通用查询。
最常见的查询涉及对各个列(不包括 customerId)进行 GROUP BY 操作,在列顺序和组合方面具有灵活性。
您对如何针对我的用例优化 ARRAY JOIN 的性能有什么建议吗?
为两个表创建 SQL
需要 ARRAY JOIN 的原创
CREATE TABLE default.my_table_local
(
`customerId` String,
`timestamp` DateTime,
`userId` Nullable(String),
`itemId` Nullable(String),
`data` Array(String),
INDEX userId_index userId TYPE bloom_filter(0.001) GRANULARITY 1,
INDEX itemId_index itemId TYPE bloom_filter(0.001) GRANULARITY 1,
)
ENGINE = MergeTree
PARTITION BY (customerId, toYYYYMM(timestamp))
ORDER BY (customerId, timestamp)
SETTINGS index_granularity = 8192
扩展
CREATE TABLE default.my_table_expanded_local
(
`customerId` String,
`timestamp` DateTime,
`userId` Nullable(String),
`itemId` Nullable(String),
`data` String,
INDEX userId_index userId TYPE bloom_filter(0.001) GRANULARITY 1,
INDEX itemId_index itemId TYPE bloom_filter(0.001) GRANULARITY 1,
)
ENGINE = MergeTree
PARTITION BY (customerId, toYYYYMM(timestamp))
ORDER BY (customerId, timestamp)
SETTINGS index_granularity = 8192
你有什么解决办法吗?我遇到了同样的问题