【发布时间】:2011-04-18 06:55:26
【问题描述】:
我有一张有 50 万行的表格。
主键是 guid 列。
我发现查询select * from T where id ='xxxx'很慢。
我应该怎么做才能提高性能?
【问题讨论】:
标签: sql performance indexing primary-key guid
我有一张有 50 万行的表格。
主键是 guid 列。
我发现查询select * from T where id ='xxxx'很慢。
我应该怎么做才能提高性能?
【问题讨论】:
标签: sql performance indexing primary-key guid
如果可以的话,我会推荐以下:
删除现有的主键 - 特别是如果它也是集群键(默认情况下)
添加一个新的INT IDENTITY 列
ALTER TABLE dbo.YourTable ADD NewID INT IDENTITY(1,1)
将该 INT 字段设为主键/集群键:
ALTER TABLE dbo.YourTable
ADD CONSTRAINT PK_YourTable PRIMARY KEY(NewID)
GUID 列上的主键(或更准确地说:集群键)是一个可怕的想法,会导致大量索引碎片,从而降低您的 SELECT 性能。
正如Kimberly Tripp - 索引女王 - 和其他人已经多次声明的那样 - 作为集群键的 GUID 并不是最优的,因为由于它的随机性,它会导致大量页面和索引碎片,并一般表现不佳。
是的,我知道 - 在 SQL Server 2005 及更高版本中有 newsequentialid() - 但即使这样也不是真正的完全连续的,因此也会遇到与 GUID 相同的问题 - 只是不太突出。
还有一个需要考虑的问题:表上的聚簇键也将添加到表上每个非聚簇索引的每个条目中 - 因此您确实希望确保它尽可能小.通常,具有 2 亿以上行的 INT 对于绝大多数表来说应该足够了 - 与作为集群键的 GUID 相比,您可以在磁盘和服务器内存中节省数百兆字节的存储空间。
快速计算 - 使用 INT 与 GUID 作为主键和聚类键:
总计:25 MB vs. 106 MB - 这只是在一张桌子上!
更多值得深思的东西 - Kimberly Tripp 的优秀作品 - 阅读,再阅读,消化!这是 SQL Server 索引的福音,真的。
【讨论】: