适用于: SQL Server 2022 (16.x)及更高版本
Azure SQL 数据库
Azure SQL 托管实例
Microsoft Fabric Preview 中的 SQL 数据库
可以使用 SQL Server Management Studio 或 Transact-SQL 在 SQL Server 中针对表或索引视图的一列或多列创建查询优化统计信息。 对于大多数查询,查询优化器已为高质量查询计划生成必要的统计信息;但在少数一些情况下,你需要创建附加的统计信息。
限制和局限
在使用 CREATE STATISTICS 语句创建统计信息前,请确认在数据库级别设置了 AUTO_CREATE_STATISTICS 选项。 这将确保查询优化器继续定期为查询谓词列创建单列统计信息。
每个统计信息对象至多可列出 32 列。
不能删除、重命名或更改在筛选的统计信息谓词中定义的表列的定义。
Permissions
要求用户是表或索引视图所有者,或者是以下角色之一的成员: sysadmin 固定服务器角色、 db_owner 固定数据库角色或 db_ddladmin 固定数据库角色。
使用 SQL Server Management Studio
- 在“对象资源管理器”中,选择加号以展开要在其中创建新统计信息的数据库。 
- 选择加号以便展开“表”文件夹。 
- 选择加号以展开要在其中创建新统计信息的表。 
- 右键单击“统计信息”文件夹,然后选择“新建统计信息…”。 - 将在“新建表 table_name 的统计信息”对话框的“常规”页面上显示以下属性。 - Property - Description - Table Name - 显示统计信息中所涉及表的名称。 - Statistics Name - 显示存储统计信息的数据库对象的名称。 - Statistics Columns - 此网格显示该组统计信息中所涉及的列。 网格中的所有值都是只读的。 - Name - 显示统计信息中所涉及列的名称。 它可以是单个的列或单个表中的列组合。 - Data Type - 指示统计信息中所涉及列的数据类型。 - Size - 显示每列的数据类型大小。 - Identity - 如果选中此项,则指示标识列。 - Allow NULLs - 指示列是否接受空值。 - Add - 将表中的更多列添加到统计信息网格。 - Remove - 从统计信息网格中删除所选列。 - Move Up - 将所选列移动到统计信息网格中更靠前的位置。 网格中的位置可能会显著影响统计信息的有用性。 - Move Down - 将所选列移到统计信息网格中更后面的位置。 - 上次更新了这些列的统计信息 - 指示统计信息的存在时间。 如果统计信息是最新的,则会更有价值。 在对数据进行较大的更改或者添加异常数据之后,请更新统计信息。 对于数据分布一致的表,其统计信息更新频率应较低。 - 更新这些列的统计信息 - 选中此项后将在对话框关闭时更新统计信息。 - 将在“新建表 table_name 的统计信息”对话框的“筛选器”页面上显示以下属性。 - Property - Description - Filter Expression - 定义要将哪些数据行包含在筛选的统计信息中。 例如: - Production.ProductSubcategoryID IN ( 1, 2, 3 )
- 在“新建表 table_name 的统计信息”对话框的“常规”页面上,选择“添加”。 - “选择列” 对话框中显示以下属性: 此信息为只读信息。 - Property - Description - Name - 显示统计信息中所涉及列的名称。 它可以是单个的列或单个表中的列组合。 - Data Type - 指示统计信息中所涉及列的数据类型。 - Size - 显示每列的数据类型大小。 - Identity - 如果选中,则指示标识列。 - Allow NULLs - 指示列是否接受空值。 
- 在“选择列”对话框中,选中要为其创建统计信息的每个列旁边的复选框,然后选择“确定”。 
- 在“新建表 table_name 的统计信息”对话框中,选择“确定”。 
Use Transact-SQL
- 在 “对象资源管理器” 中,连接到 数据库引擎的实例。 
- 在标准栏上,选择“新建查询” 。 
- 将以下示例复制并粘贴到查询窗口中,然后选择“执行”。 - USE AdventureWorks2022; GO -- Create new statistic object called ContactMail1 -- on the BusinessEntityID and EmailPromotion columns in the Person.Person table. CREATE STATISTICS ContactMail1 ON Person.Person (BusinessEntityID, EmailPromotion); GO
- 上面创建的统计信息可能会改进以下查询的结果。 - USE AdventureWorks2022; GO SELECT LastName, FirstName FROM Person.Person WHERE EmailPromotion = 2 ORDER BY LastName, FirstName; GO