我有两张这样的桌子。
A_ID(主键)
A1
A2
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上创建聚簇索引吗?
答案 0 :(得分:3)
不,只需创建一个普通的非聚集索引 - 您的查询速度基本相同,结果也相同。
表B上的A_ID是否保证是唯一的? “B”中不能超过1个条目引用相同的A_ID ??
群集密钥的最佳做法是:
有关其他信息,请参阅Kim Tripp的The Clustered Index Debate continues或Ever-increasing clustering key - the Clustered Index Debate - agin!。
如果无法保证您的群集密钥是唯一的,SQL Server将为其添加一个4字节的uniquifier - 您可能希望尽可能避免这种情况(因为您的群集密钥将添加到每个单独的每个条目中)您桌面上的非聚集索引,如果太宽则会导致浪费空间。
马克
答案 1 :(得分:3)
没有常规的非聚集索引应该可以。在进行范围查询时,聚集索引特别方便(BETWEEN)根据经验,我总是在外键约束中使用的列上创建非聚簇索引。