SQL本质上是无序的。
ClickHouse在这件事上的表现如何?我们可以期望相同的查询在随后的执行中以相同的顺序返回行吗?它是否取决于表引擎,例如ENGINE = Memory()
?如果是这样,请详细说明可能影响订单的引擎情况。
如果无法保证订购结果,最便宜的方法是什么? ORDER BY
主键/排序键?
答案 0 :(得分:2)
答案是否定的:除非您要求,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