ClickHouse 查询行顺序行为

ClickHouse query row order behaviour

SQL 本质上是无序的。
ClickHouse 在这方面的表现如何?我们能否期望在后续执行中以相同的顺序对 return 行进行相同的查询?它是否依赖于 table 引擎,例如 ENGINE = Memory()?如果是,请详细说明可能影响订单的引擎场景。
如果无法保证订单结果,最便宜的方法是什么? ORDER BY primary/sorted 键?

答案是否定的:ClickHouse 不会return 确定数据,除非您要求它。

更广泛地说,您不应对 ClickHouse 结果集中数据的默认排序做出任何假设。 MergeTree table 引擎系列(大型数据集的主力引擎)在 'parts' 中组织数据并在它们之间并行运行查询,即使在单个节点上也是如此。默认情况下,它 return 是每个部分从查询处理中出现的结果。部分中的数据通常会 return 按照 table 的排序顺序,但每个部分的结果可以 return 以任何顺序排列。

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

有关此主题的更多一般性问题,请查看 ClickHouse 文档,尤其是 https://clickhouse.yandex/docs/en/operations/table_engines/mergetree/. I also did a ClickHouse talk a couple days ago on looking into the exact issue of why result sets look they way they do. Slides are here: https://www.slideshare.net/Altinity/dangerous-on-clickhouse-in-30-minutes-by-robert-hodges-altinity-ceo