31

在 Sql Server 中,我有一个带有 Identity 主键的表。通常我想要最新的几条新记录,所以我获取按主键降序排序的 Top n。我应该将主键索引定义为降序,还是没有区别?即,如果它们按升序排列,那么 sql 可以同样有效地向后工作吗?

4

2 回答 2

43

从纯粹查询的角度来看,如果您想提取 N 个最近的或 N 个最旧的记录,您的键是降序还是升序没有区别:

无论键的存储顺序如何,SQL Server 的内部算法都可以在单列索引上双向有效地导航。例如,在单列索引上指定 DESC 不会使使用 ORDER BY IndexKeyCol DESC 子句的查询比为索引指定 ASC 时运行得更快。

http://msdn.microsoft.com/en-us/library/aa933132(SQL.80).aspx

但是,在几乎任何正常情况下,您都希望您的主键是升序并按顺序排列以防止碎片。SQL Server 针对将新记录物理附加到数据库文件末尾进行了优化。如果它需要在顶部插入每条新记录并将所有内容下推,则可能会导致近 100% 的碎片。

于 2009-03-16T05:04:43.490 回答
4

这完全没有区别。

我什至无法想象为什么可以以任何一种方式声明它。

于 2009-03-16T05:00:20.913 回答