UNIQUEIDENTIFIER列上的统计信息

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介:

问题重现(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行的正确估计。

感谢关注!



本文转自Woodytu博客园博客,原文链接:http://www.cnblogs.com/woodytu/p/4720240.html,如需转载请自行联系原作者

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
相关文章
|
6月前
|
关系型数据库 MySQL
Mysql语句_查询数据百分比、人员年龄、数据排序、添加查询时的列属性、合并查询结果
Mysql语句_查询数据百分比、人员年龄、数据排序、添加查询时的列属性、合并查询结果
39 0
|
关系型数据库 MySQL 索引
一个表中索引的数量是不是越多越好?
往InnoDB表新增数据时,都会基于主键给自动建立聚簇索引。 随着我们不停的在表里插入数据,会不停的在数据页里插入数据。一个数据页放满后,就会分裂成多个数据页,这时就需要索引页去指向各个数据页。
125 0
|
6月前
|
算法 Oracle 关系型数据库
数据库等值查询与统计信息
简介: 统计信息是为优化器的 cost 估算提供数据支撑,其中很重要的一点需求便是等值查询(EQUALS, IN 等) 场景下的基数估算。
105 0
数据库等值查询与统计信息
|
SQL 关系型数据库 MySQL
检索单个列
mysql检索单个列
108 0
|
数据库 索引 数据可视化
如何查看表和索引的统计信息
原文:如何查看表和索引的统计信息     这几天要求做一个服务器的统计信息,主要针对表和索引。下面我就简单分享几个查询数据表和索引统计信息的方法: 1.使用T-SQL 语句实现: select schema_name(t.
1203 0
|
关系型数据库 MySQL 索引