Clickhouse - 数组连接非常慢

问题描述 投票:0回答:1

我目前面临查询缓慢的问题,主要是由于

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 
sql database performance relational-database clickhouse
1个回答
0
投票

你有什么解决办法吗?我遇到了同样的问题

© www.soinside.com 2019 - 2024. All rights reserved.