ClickHouse查询行顺序行为

jan*_*cki 1 clickhouse

SQL 本质上是无序的。
ClickHouse 在这方面的表现如何?我们是否可以期望相同的查询在后续执行中以相同的顺序返回行?它是否取决于表引擎,例如ENGINE = Memory()?如果是这样,请详细说明可能影响订单的引擎情况。
如果无法保证订单结果,那么最便宜的方法是什么?ORDER BY主键/排序键?

小智 5

答案是否定的:除非您要求,否则 ClickHouse 不会按确定顺序返回数据。

更广泛地说,您不应该对 ClickHouse 结果集中数据的默认排序做出任何假设。MergeTree 表引擎系列(这是大型数据集的主力引擎)将数据组织为“部分”,并在它们之间并行运行查询,甚至在单个节点上也是如此。默认情况下,它返回查询处理中出现的每个部分的结果。各部分中的数据通常会按表中的排序顺序返回,但每个部分的结果可以按任何顺序返回。

因此,如果您关心顺序,则应该应用排序。最有效的排序是 CREATE TABLE ORDER BY 子句已经强制执行的顺序。如果您需要完全不同的订单,只需在查询中询问即可。如果结果发现速度很慢(如果您对相同数据有非常不同的查询模式,则可能会出现这种情况),您可以通过添加物化视图将数据排序为特定查询的更好顺序来优化结果。

有关此主题的更一般性问题请查看 ClickHouse 文档,尤其是https://clickhouse.yandex/docs/en/operations/table_engines/mergetree/。几天前我还做了一次 ClickHouse 演讲,探讨了为什么结果集看起来像这样的确切问题。幻灯片在这里:https://www.slideshare.net/Altinity/dangerous-on-clickhouse-in-30-minutes-by-robert-hodges-altinity-ceo