dfa*_*ang 2 sql indexing performance guid primary-key
我有一张五十万行的桌子.
主键是guid列.
我发现查询select * from T where id ='xxxx'非常慢.
我该怎么做才能提高性能?
如果可以,我会建议如下:
删除现有的主键 - 特别是如果它是聚类键(默认情况下是这样)
添加新INT IDENTITY列
ALTER TABLE dbo.YourTable ADD NewID INT IDENTITY(1,1)
Run Code Online (Sandbox Code Playgroud)使INT字段成为主/集群密钥:
ALTER TABLE dbo.YourTable
ADD CONSTRAINT PK_YourTable PRIMARY KEY(NewID)
Run Code Online (Sandbox Code Playgroud)GUID列上的主键(或更准确地说:聚类键)是一个可怕的想法,导致大量索引碎片,从而杀死您的SELECT性能.
正如Kimberly Tripp--索引女王 - 和其他人已多次声明 - GUID因为聚类键不是最佳的,因为由于其随机性,它将导致大量页面和索引碎片以及通常不良的性能.
是的,我知道 - newsequentialid()在SQL Server 2005及更高版本中 - 但即使这样也不是真正的,完全顺序的,因此也会遇到与GUID相同的问题 - 只是不那么突出.
然后还有另一个需要考虑的问题:表格上的聚类键也会添加到表格中每个非聚集索引的每个条目上 - 因此,您确实希望确保它尽可能小.通常,对于绝大多数表来说,具有2亿行的INT应该足够了 - 并且与作为群集密钥的GUID相比,您可以在磁盘和服务器内存中节省数百兆字节的存储空间.
快速计算 - 使用INT与GUID作为主要和群集密钥:
总计:25 MB对106 MB - 这只是在一张桌子上!
还有一些值得思考的东西 - 金伯利·特里普的优秀作品 - 阅读,再读一遍,消化它!这是SQL Server索引福音,真的.