Sql Server:uniqueidentifier加整数复合PK ...使用什么类型的索引?

时间:2009-05-24 18:41:56

标签: sql-server database indexing primary-key uniqueidentifier

我的SQL Server 2005数据库中有一个包含两列的联结表:

  • object_id(uniqueidentifier)

  • property_id(整数)

这些值一起构成复合主键。

为SELECT性能创建此PK索引的最佳方法是什么?

如果列是两个整数,我只会使用复合聚簇索引(默认值)。但是,当涉及uniqueidentifier时,我听到有关聚簇索引的错误信息。

任何人都有这方面的经验吗?

3 个答案:

答案 0 :(得分:2)

是的,GUID对于聚簇索引非常糟糕,因为GUID在设计上非常随机,因此会导致大量碎片,从而导致性能问题。

请参阅Kim Tripp的博客 - 最值得注意的是“The CLustered Index Debate continues”和“GUIDs as PRIMARY and/or CLUSTERED key” - 以获取大量有价值的背景信息。

如果你真的需要在这两个列上有一个索引,我会建议一个非聚集索引 - 它可以是一个主索引 - 更好的不是聚簇索引。

马克

答案 1 :(得分:0)

我会创建一个标识列&然后把它作为你的主要钥匙&聚集索引。然后,您可以根据需要在objectid propertyid上创建非聚簇索引。

您可以创建唯一约束以确保密钥的唯一性。

原因是行将按顺序插入,因此您的缩小页面将被拆分。另外,为PK使用整数意味着您的聚簇索引的值较小。

答案 2 :(得分:0)

一种替代方法是使用所谓的代理键(顺便提一下也可以将其指定为主键)。

例如,添加一个标识列,该标识列可用于唯一标识表中的每一行,即主键。

了解GUID用于在SQL Server中全局标识记录(可以说这不是一种关系正确的做法,但这不是我们关注的问题)。

标识列,现在也是主键,可以/将应用聚簇索引。然后可以将单独的非聚集索引应用于原始海报所描述的复合键。

这种做法避免了在聚簇索引中发生频繁页面拆分的问题(插入到随机GUID主键中)以及生成更小更高效的聚簇索引,同时还保留了数据库中定义的关系。

代理键定义:http://en.wikipedia.org/wiki/Surrogate_key