使用 QuestDB 时,符号列是否有利于每个行的大量行的性能?

When working with QuestDB, are symbol columns good for performance for huge amounts of rows each?

使用常规 SQL 数据库时,索引对于获取几行很有用,但当您从 table 获取大量数据时就没那么有用了。例如,假设您有一个 table 随着时间的推移,股票估值为 10 只股票:

|------+--------+-------+
| time |  stock | value |
|------+--------+-------+
|  ... | stock1 | ...   |
|  ... | stock2 | ...   |
|  ... | ...    | ...   |
|------+--------+-------+

据我所知,如果您想在很长一段时间内获取数据,按股票索引(即使使用 enum/int/foreign 键)在像 Postgres 这样的数据库中通常不是很有用。你最终得到一个跨越 table 大部分的索引,并且它最终会更快地让数据库进行顺序扫描,例如,获取每只股票的整个数据集的平均值:

SELECT stock, avg(value) FROM stock_values GROUP BY stock

鉴于 QuestDB 是面向行的,我猜想为每只股票设置一个单独的列会带来更好的性能。

那么,对于这种情况,QuestDB 中推荐的模式是什么?每只股票一列,或者即使每行有数百万个结果,每个股票代码的 symbol column 是否同样好(或足够好)?

在 QuestDB 中不容易实现每个股票的列。如果你这样创建 table

|----------------------------------|
| time |  stock1 | stock1 | stock3 |
|----------------------------------|

然后您必须将所有值一起插入一行,否则最终会出现空白

|----------------------------------|
| time |  stock1 | stock1 | stock3 |
|----------------------------------|
| t1   |     1.1 |        |        |
| t2   |         |   3.45 |        |
| t3   |         |        | 103.45 |
|----------------------------------|

即使对于 t1 == t2 == t3,当您执行 insert as 3 操作时,它仍然会产生 3 行。

所以符号在这里是更好的选择。

符号可以被索引,也可以不被索引,当非索引符号的不同数量很少时,您可能会受益于非索引符号。读取完整 table 与按索引读取是索引选择性的问题,而不是数据范围。如果选择性很高(例如,不同的符号计数为 10k),则按索引获取比范围扫描更快。