sql - 主键排序

标签 sql sql-server indexing

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

最佳答案

数据通过聚集索引物理存储,该索引通常是主键,但并非必须如此。

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

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

编辑

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

如果时间列和主键列按顺序相关(当且仅当另一个列增加或保持不变时,一个列才会增加),则改为按主键排序。如果它们不以这种方式相关,请将聚集索引从主键移动到您要排序的任何列。

关于sql - 主键排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1110339/

相关文章:

mysql - 需要输出记录

sql-server - SQL Server 中的数字数据右对齐

mysql - MSSQL 按百分比分组

php - 问题 : Writing a MySQL parser to split JOIN's and run them as individual queries (denormalizing the query dynamically)

SQL Server - 将字符串添加到文本列(相当于 concat)

sql - 使用不带 ORDER BY ID 的 Row_Number() 选择行

mysql索引 'and'总是选择第一个创建的索引?

mysql - 在聚合查询中获取非聚合数据

url - Google 仅索引特定域

mysql - SQL - 检查列是否自动递增