一尘不染

主键排序

sql

表是由其主键本质上排序的吗?如果我有一个在BigInt标识列上具有主键的表,我可以相信查询将始终返回按键排序的数据,还是我明确需要添加“ ORDER
BY”。性能差异很大。


阅读 262

收藏
2021-03-10

共1个答案

一尘不染

数据通过聚簇索引进行物理存储,聚簇索引通常是主键,但不一定是主键。

如果没有ORDER BY子句,则不能保证SQL中的数据具有顺序。当您需要按特定顺序排列数据时,应始终指定ORDER
BY子句。如果表已经按照这种方式排序,那么优化器将不会做任何额外的工作,因此在其中放置表不会有任何危害。

如果没有ORDER
BY子句,则RDBMS在等待从磁盘读入记录时可能会返回与您的查询匹配的缓存页面。在这种情况下,即使表上有索引,数据也可能不会以索引的顺序出现。(请注意,这只是一个示例-
我不知道,甚至不认为现实世界中的RDBMS会做到这一点,但这对于SQL实现来说是可以接受的。)

编辑

如果排序时对性能的影响与不排序时对性能的影响有关,则可能是在没有索引(聚集或其他)的一列(或一组列)上进行排序。鉴于这是一个时间序列,您可能基于时间进行排序,但是聚簇索引位于主要bigint上。SQL
Server不知道两者的增长方式相同,因此必须采取一切措施。

如果时间列和主键列是按顺序关联的(当且仅当另一个增加或保持相同时,一个才会增加),请改为按主键进行排序。如果它们不是这种关系,则将聚簇索引从主键移至要作为排序依据的任何列。

2021-03-10