【发布时间】:2019-07-14 03:38:47
【问题描述】:
SQL 本质上是无序的。
ClickHouse 在这件事上的表现如何?我们可以期望相同的查询在随后的执行中以相同的顺序返回行吗?它是否取决于表引擎,例如ENGINE = Memory()?如果是这样,请详细说明可能影响订单的引擎情况。
如果无法保证订单结果,最便宜的方法是什么? ORDER BY 主键/排序键?
【问题讨论】:
标签: clickhouse
SQL 本质上是无序的。
ClickHouse 在这件事上的表现如何?我们可以期望相同的查询在随后的执行中以相同的顺序返回行吗?它是否取决于表引擎,例如ENGINE = Memory()?如果是这样,请详细说明可能影响订单的引擎情况。
如果无法保证订单结果,最便宜的方法是什么? ORDER BY 主键/排序键?
【问题讨论】:
标签: clickhouse
答案是否定的:除非您要求,否则 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
【讨论】: