【发布时间】:2018-03-03 22:34:28
【问题描述】:
我刚刚接管了一个包含大约 2200 个表的数据库。其中超过 2000 个没有聚集索引(有些根本没有索引)。
所有表都已配置为使用 GUID 作为唯一标识符。
仅查看查询计划,我可以看到发生了许多表扫描。大多数搜索使用唯一标识符进行搜索。
我想知道在 GUID 上有一个聚集索引是否比根本没有聚集索引更好。我想在 16 字节列上的聚集索引将不可避免地导致碎片。
可以说我可以聚集在其他列上,但大多数搜索倾向于通过 GUIDS 搜索或加入。
非常欢迎任何建议。我从来没有见过这么多的GUID!
【问题讨论】:
-
一如既往——视情况而定。这个数据库是重读轻写,还是相反?有很多查询只需要一行,还是有很多查询需要扫描整个表?如果有许多行查找和许多插入,一种方法是添加一个标识,在该标识上进行聚类,然后将非聚集索引添加到 GUID 列。该索引会分片,但如果它只用于行查找,这没什么大不了的。
-
如果 GUID 是由
NEWID()默认约束生成的,则该框中的另一个技巧是将它们修补到NEWSEQUENTIALID()。这至少会减少新插入的碎片。 -
感谢 Jeroen - 我的另一个困境是我只是其中的 DBA,并且添加字段(在本例中为身份)的权力是由第 3 方开发人员负责的。根据我最近与他们的谈话,我很确定他们将不愿意添加这样的功能!他们真的可以在 INT 上使用 Identity,但不确定他们为什么要使用这么多 GUIDS。
-
明确一点:您不需要说服开发人员开始使用整数 ID。如果有很多行查找,在由数据库自动生成但完全未使用的顺序 ID 上添加聚集索引,以及在 GUID 上添加非聚集索引已经可以改善问题。当然,如果他们要求根本不改变表格,你的工作就更难了……但是他们应该为自己的烂摊子负责。您只能从数据库层本身做很多事情。
-
从来没有一个更真实的词!!!感谢您的建议
标签: sql-server indexing guid clustered-index