我有一个包含 3 个表的 QuestDB 数据库。
大多数列都是字符串或长数据类型。所有表均按 DAY 分区。
40 天的生产使用约 120GB 磁盘空间收集数据。
服务器有 4 个 CPU 核心和 4 GB RAM
我尝试 JOIN 两个表时通过 pg 协议进行的所有查询执行时间都太长(每个查询最多几分钟)。
示例查询:
WITH joined_bar_and_foo AS
(
SELECT *
FROM 'foo'
INNER JOIN 'bar' ON 'foo'.trigger_id = 'bar'.trigger_id
WHERE 'bar'.some_internal_id = 24
AND 'bar'.timestamp > '2023-08-01T00:00:00.000Z'
AND 'bar'.timestamp < '2023-08-01T23:59:59.999Z'
AND 'foo'.another_internal_id = 777666
)
SELECT count_distinct(trigger_id)
FROM joined_bar_and_foo
WHERE some_field = 1
AND (another_internal_id=100 or another_internal_id=150);
最初我的服务器有 2 个 CPU 核心,我将其增加到 4 个 CPU 核心,但没有帮助。
有关共享工作人员和编写器页面大小的所有 server.conf 设置均设置为默认值。
Influx-line-protocol 的写入性能良好。
如何提高阅读性能以及我的配置有什么问题?
我是否应该使用某种索引来重新创建新表,因为它存在于每个表中并且我使用它来加入?
也许更改“Writer页面大小”配置会有帮助?
也许我应该使用一些东西而不是WITH关键字来组成我的连接查询?
WITH
子句通常不会加速查询,相反可能会阻止优化器消除一些开销。
SELECT count_distinct(trigger_id)
FROM 'foo'
INNER JOIN 'bar' ON 'foo'.trigger_id = 'bar'.trigger_id
WHERE 'bar'.some_internal_id = 24
AND 'bar'.timestamp > '2023-08-01T00:00:00.000Z'
AND 'bar'.timestamp < '2023-08-01T23:59:59.999Z'
AND 'foo'.another_internal_id = 777666
AND some_field = 1
AND (another_internal_id=100 or another_internal_id=150)
如果您可以通过指定时间戳来限制
foo
,则可以产生最佳优化,因为它将减少扫描的数据量。
硬件方面,添加更多 RAM 或更快的磁盘将提高查询速度。