UNIQUEIDENTIFIER列上的统计信息
UNIQUEIDENTIFIER列上的统计信息非常有意思,在它上面有一些很令人讨厌的行为。我们来看下。
问题重现(The repro)
为了向你展示我们刚抱怨的行为,我用下列简单的表定义创建了一个数据库,我在UNIQUEIDENTIFIER列上强制主键约束。这意味着SQL Server在后台会生成唯一聚集索引,聚集索引本身有一个统计信息对象来描述那列的数据分布情况。当然,数据分布是线性的,因为在UNIQUEIDENTIFIER列每个值本身都是唯一的。
1 -- Create a new table with a UNIQUEIDENTIFIER column as primary key. 2 -- SQL Server will enforce the primary key constraint through unique clustered index in the background. 3 CREATE TABLE CustomersTableGuid 4 ( 5 ID UNIQUEIDENTIFIER NOT NULL PRIMARY KEY, 6 FirstName VARCHAR(50), 7 LastName VARCHAR(50) 8 ) 9 GO
下一步我往表里插入1百万条记录。
1 -- Insert 1 million records 2 DECLARE @i INT = 0 3 WHILE (@i <= 1000000) 4 BEGIN 5 INSERT INTO CustomersTableGuid (ID, FirstName, LastName) 6 VALUES 7 ( 8 NEWID(), 9 'FirstName' + CAST(@i AS VARCHAR), 10 'LastName' + CAST(@i AS VARCHAR) 11 ) 12 13 SET @i +=1 14 END 15 GO
现在我们用FULLSCAN在表上更新我们的统计信息。FULLSCAN意味着SQL Server扫描整个表内在数据来更新统计信息对象。
1 -- Let's update the Statistics with a FULLSCAN. 2 UPDATE STATISTICS CustomersTableGuid WITH FULLSCAN 3 GO
但当你现在查看统计信息对象时,你会看到在直方图里SQL Server只生成了4个步长。
1 sp_helpindex 'dbo.CustomersTableGuid' 2 3 DBCC SHOW_STATISTICS('dbo.CustomersTableGuid', 'PK__Customer__3214EC271273C1CD')
在表头信息里你可以看到,在统计信息更新期间,1百万行被采样,但直方图只显示了4个步长!但当你现在用更小采样区间来更新统计信息对象,事情就会改变:
1 -- Let's update the Statistics with a smaller sampling interval. 2 UPDATE STATISTICS CustomersTableGuid WITH SAMPLE 50 PERCENT 3 GO
当你现在看下直方图,你会看到我们有很多不同的步长:
小结
当你在数据库设计里用UNIQUEIDENTIFIER列时要记住这点了。只要这些值是唯一的,你就会有性能上的问题,因为对于直方图里,你有的巨量区间,AVG_RANGE_ROW 只能做出1行的正确估计。
感谢关注!
参考文章:
https://www.sqlpassion.at/archive/2015/03/16/statistics-uniqueidentifier-columns/
注:此文章为WoodyTu学习MS SQL技术,收集整理相关文档撰写,欢迎转载,请在文章页面明显位置给出此文链接!
若您觉得这篇文章还不错请点击下右下角的推荐,有了您的支持才能激发作者更大的写作热情,非常感谢!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?