如何提高QuestDB的查询性能? qdb 索引会有帮助吗?或者我应该使用WITH 关键字来代替?

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

我有一个包含 3 个表的 QuestDB 数据库。

  • Table Foo - 15 列
  • 表格栏 - 30 列
  • 表格 Baz - 23 列

大多数列都是字符串或长数据类型。所有表均按 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关键字来组成我的连接查询?

sql performance join storage questdb
1个回答
0
投票

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 或更快的磁盘将提高查询速度。

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