SQL Server:〜2000堆表全部使用GUID Uniqueidentifier-可能的聚集索引吗?

Ste*_*ray 4 sql-server indexing guid clustered-index

我刚刚接管了大约2200张表的数据库。其中有2000多个没有聚集索引(有些根本没有索引)。

所有表都已配置为使用GUID作为唯一标识符。

仅查看查询计划,就可以看到发生了许多表扫描。大多数搜索使用uniqueidentifier进行搜索。

我想知道在GUID上具有聚集索引比根本不具有聚集索引是否更好。我想象在16字节列上的聚集索引将不可避免地导致碎片化。

我可以说可以聚集在其他列上,但是大多数搜索都倾向于通过GUIDS进行搜索或通过GUIDS进行联接。

任何建议都将受到欢迎。我从未见过那么多GUID !!

Gor*_*off 5

通常,我建议将一identity列用作主键,并将其用于集群。这也是joins 的更好选择。

为什么?首先,身份密钥通常比唯一ID短。因此,外键引用和索引较小。

更重要的是,inserts始终位于表的“末端”。使用GUID时,插入常常会导致碎片。如果要插入行,我会说GUID上的二级索引可能比聚集索引更好(碎片仅存在于索引中)。

对于2000个表,我怀疑您会更改结构。您可以使用来改善碎片newsequentialid()


FSo*_*ou1 5

带有随机值的 GUID列通常不是聚集索引的最佳选择,因为它可能是索引碎片的根本原因:

  1. 数据库的预读机会不会有效;
  2. 插入操作的成本将太昂贵,因为在这种情况下,您将有很多页面拆分开销

您可以通过3种方式来实现:

  1. 计划计划索引重组和重建,这将减少索引碎片并自动改善您的统计信息;
  2. 使用 newsequantialid生成此列的值;
  3. 在数据库外部生成GUID值(Guid.Comb Identifier是在NHibernate中解决此问题的一个很好的例子)。