主要群集密钥默认顺序是否升序?

时间:2014-04-18 21:37:03

标签: sql database azure-sql-database

我有一个主键作为我的表的一部分定义如下:

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

数据库是否会默认按c_number对表进行排序?是否可以在声明中放置ASC澄清器以确保这一点?

这部署在Microsoft Azure SQL数据库上。

1 个答案:

答案 0 :(得分:1)

在SQL Server中,无论将哪个索引定义为主键,数据都按聚簇索引的顺序存储在数据页中。

如果没有为聚集索引(或任何索引)指定排序顺序,默认情况下顺序将是升序。

您应该关注的主要原因是,如果您在与这些查询相关的密钥上进行聚类,以及打击/避免碎片,那么您可能有大量范围查询可能会执行顺序I / O操作你的桌子。

主键不必是集群的,但在大多数情况下,你绝对应该为每个表定义一个聚簇索引(否则它是一个堆表),如果你的主键是以任何有意义的方式顺序的,那么它通常有理由让您的主键成为群集密钥。

但同样,根据您显示的SQL,您的问题的答案是肯定的 - 数据将按您指定的主群集密钥以升序存储。根据数据的不同,您可能会将表设置为极端碎片(复合聚类键很少是个好主意)。

您的索引在c_number, property上,这意味着索引将按c_number升序排序,然后按属性升序排序,这意味着数据也将以这种方式存储。如果要按以下顺序执行插入,则填充数据页时:

(1,1) (1,2) (2,1) (1,3)

您将导致碎片化,因为必须拆分页面以在(1,2)和(2,1)之间插入(1,3)值。

我建议,除非这种情况永远不会发生,或者除非您的查询几乎总是对这两列进行排序,分组或过滤,否则您将在不同的列上进行集群(不一定要更改列主键)。

在任何情况下,如果您最终得到一个碎片表,只要碎片失控,就可以在维护窗口期间重建聚簇索引。由于随机I / O减少,它将大大缩短响应时间。