引用列上的数据库聚簇索引

时间:2009-08-07 10:49:02

标签: database indexing

我有两张这样的桌子。

表A

A_ID(主键)
A1
A2

表B

B_ID(主键)
B1
B2 A_ID(外键但未在数据库中强制执行,不是唯一的)

虽然默认情况下SQL Server在B_ID上创建聚簇索引,但我在B上有很多选择查询,这取决于A_ID

类似这样的事情

SELECT * FROM B WHERE B.A_ID ='SOME ID'

我应该在表B的A_ID上创建聚簇索引吗?

2 个答案:

答案 0 :(得分:3)

不,只需创建一个普通的非聚集索引 - 您的查询速度基本相同,结果也相同。

表B上的A_ID是否保证是唯一的? “B”中不能超过1个条目引用相同的A_ID ??

群集密钥的最佳做法是:

  • 尽可能小(狭窄)
  • 独特
  • 稳定(或静态 - 它永远不会改变)
  • 不断增加

有关其他信息,请参阅Kim Tripp的The Clustered Index Debate continuesEver-increasing clustering key - the Clustered Index Debate - agin!

如果无法保证您的群集密钥是唯一的,SQL Server将为其添加一个4字节的uniquifier - 您可能希望尽可能避免这种情况(因为您的群集密钥将添加到每个单独的每个条目中)您桌面上的非聚集索引,如果太宽则会导致浪费空间。

马克

答案 1 :(得分:3)

没有常规的非聚集索引应该可以。在进行范围查询时,聚集索引特别方便(BETWEEN)根据经验,我总是在外键约束中使用的列上创建非聚簇索引。