我的 SQL Server 2005 数据库中有一个联结表,它由两列组成:
object_id(唯一标识符)
property_id (整数)
这些值共同构成一个复合主键。
为 SELECT 性能创建此 PK 索引的最佳方法是什么?
如果列是两个整数,我将只使用复合聚集索引(默认)。但是,当涉及到 uniqueidentifiers 时,我听说过关于聚集索引的坏事。
有人有这种情况的经验吗?
我的 SQL Server 2005 数据库中有一个联结表,它由两列组成:
object_id(唯一标识符)
property_id (整数)
这些值共同构成一个复合主键。
为 SELECT 性能创建此 PK 索引的最佳方法是什么?
如果列是两个整数,我将只使用复合聚集索引(默认)。但是,当涉及到 uniqueidentifiers 时,我听说过关于聚集索引的坏事。
有人有这种情况的经验吗?
是的,GUID 对聚集索引非常不利,因为 GUID 在设计上是非常随机的,因此会导致大量碎片,从而导致性能问题。
请参阅 Kim Tripp 的博客 - 最值得注意的是“集群索引辩论仍在继续”和“ GUID 作为主键和/或集群键”——了解许多有价值的背景信息。
如果您确实需要在这两列上建立索引,我建议您使用非聚集索引 - 它可以是主索引 - 最好不要使用聚集索引。
马克
我将创建一个标识列,然后将其设为您的主键和聚集索引。然后,您可以根据需要在 objectid propertyid 上创建非聚集索引。
您可以创建唯一约束以确保密钥的唯一性。
这样做的原因是行将按顺序插入,因此您的减少页面拆分。此外,为您的 PK 使用整数意味着您的聚集索引值较小。
一种替代方法是使用所谓的代理键(顺便说一下,它也可以指定为主键)。
例如,添加一个标识列,该列可用于唯一标识表中的每一行,即主键。
了解 GUID 用于在 SQL Server 中全局标识一条记录(可以说这不是一种关系上正确的做法,但这不是我们关心的问题)。
标识列,现在也是主键,可以/将应用聚集索引。然后可以将单独的非聚集索引应用于原始发布者描述的复合键。
This practice avoids the issue of frequent page splits occurring within the clustered index (inserts into a random GUID primary key) as well as producing a smaller and more efficient clustered index, whilst also preserving the relationships defined within the database.
Surrogate Key Definition: http://en.wikipedia.org/wiki/Surrogate_key