表中有一个主键,定义如下:

PRIMARY KEY CLUSTERED ([c_number], [property])

数据库是否在默认情况下保持表按C_编号升序排序?是否可以在声明中添加一个ASC澄清器来确保这一点?
它部署在Microsoft azure SQL数据库上。

最佳答案

在sql server中,数据按照聚集索引的顺序存储在数据页中,而不管哪个索引被定义为主键。
如果未指定聚集索引(或任何索引)的排序顺序,则默认情况下,该顺序为升序。
您应该关心的主要原因是,如果您在与这些查询相关的键上进行集群,那么您是否有大量的范围查询可能能够执行顺序I/O,以及防止表的碎片化。
主键不必聚集,但在大多数情况下,您绝对应该为每个表(否则它是堆表)定义一个聚集索引,并且,如果您的主键以任何有意义的方式是连续的,那么您的主键通常是聚集键是有意义的。
但是,根据您显示的sql,您的问题的答案是yes—数据将按您指定的主集群键的升序存储。取决于数据是什么,您可能正在为极端碎片化设置表(组合集群键很少是一个好主意)。
索引处于c_number, property状态,这意味着索引将按c_编号升序排列,然后按属性升序排列,这意味着数据也将以这种方式存储。当数据页填满时,如果要按以下顺序执行插入:
(1,1)
(1,2)
(2,1)
(1,3)
您将导致碎片,因为必须拆分页面才能在(1,2)和(2,1)之间插入(1,3)值。
我建议,除非这种情况永远不会发生,或者除非您的查询几乎总是对这两列进行排序、分组或筛选,否则您应该在不同的列上进行集群(不一定要更改主键的列)。
在任何情况下,如果最终得到的是碎片表,请在维护窗口期间,在碎片失控时重建聚集索引。由于减少了随机I/O,它将大大提高响应时间。

关于sql - 主集群键默认顺序是否升序?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23162781/

10-14 16:52