我正在处理一个通常使用GUID作为主键的数据库。
默认情况下,SQL Server会在主键列上放置聚集索引。我理解对于GUID列来说这是一个愚蠢的想法,非聚集索引更好。
你认为,我应该摆脱所有聚集索引,并用非聚集索引取代它们吗?
为什么SQL的性能调整程序不会将此作为建议呈现?
我正在处理一个通常使用GUID作为主键的数据库。
默认情况下,SQL Server会在主键列上放置聚集索引。我理解对于GUID列来说这是一个愚蠢的想法,非聚集索引更好。
你认为,我应该摆脱所有聚集索引,并用非聚集索引取代它们吗?
为什么SQL的性能调整程序不会将此作为建议呈现?
对于聚集索引的重要原因之一是,当您经常需要检索给定列的一系列值的行时。由于数据以该顺序物理排列,因此可以非常有效地提取行。
像 GUID 这样的内容,虽然在主键方面表现出色,但可能会对性能产生显著的负面影响,因为插入操作将具有额外成本,而选择操作则没有明显的好处。
因此,不要在 GUID 上聚集索引。
至于为什么它不作为推荐选项提供,我建议调整器应该意识到这一点。
SELECT OBJECT_NAME (ips.[object_id]) AS 'Object Name',
si.name AS 'Index Name',
ROUND (ips.avg_fragmentation_in_percent, 2) AS 'Fragmentation',
ips.page_count AS 'Pages',
ROUND (ips.avg_page_space_used_in_percent, 2) AS 'Page Density'
FROM sys.dm_db_index_physical_stats
(DB_ID ('MyDatabase'), NULL, NULL, NULL, 'DETAILED') ips
CROSS APPLY sys.indexes si
WHERE si.object_id = ips.object_id
AND si.index_id = ips.index_id
AND ips.index_level = 0;
有一个随机值的聚集索引是没有意义的。
你可能确实需要在数据库中的某些地方使用聚集索引。例如,如果你有一个“作者”表和一个“图书”表,其中“图书”表有一个外键指向“作者”,并且如果你的应用程序中有一个查询语句:“select ... from Book where AuthorId = ..”,那么你将读取一组书籍。如果这些书籍在物理上相邻,磁盘头就不必在扇区之间反复跳动,收集该作者的所有书籍,这样速度会更快。
因此,你需要考虑你的应用程序以及它查询数据库的方式。
进行更改。
然后进行测试,因为你永远不知道...
是的,你应该根据Galwegian上述的原因删除GUID主键上的聚集索引。我们在我们的应用程序中已经这样做了。
这取决于您是否需要进行大量插入,或者是否需要通过主键进行非常快速的查找。