创建统计信息

适用于: SQL Server 2022 (16.x) Azure SQL 数据库 Azure SQL 托管实例

可以使用 SQL Server Management Studio 或 Transact-SQL 在 SQL Server 中针对表或索引视图的一列或多列创建查询优化统计信息。 对于大多数查询,查询优化器已为高质量查询计划生成必要的统计信息;但在少数一些情况下,你需要创建附加的统计信息。

限制和局限

在使用 CREATE STATISTICS 语句创建统计信息前,请确认在数据库级别设置了 AUTO_CREATE_STATISTICS 选项。 这将确保查询优化器继续定期为查询谓词列创建单列统计信息。

每个统计信息对象至多可列出 32 列。

不能删除、重命名或更改在筛选的统计信息谓词中定义的表列的定义。

权限

要求用户是表或索引视图所有者,或者是以下角色之一的成员: sysadmin 固定服务器角色、 db_owner 固定数据库角色或 db_ddladmin 固定数据库角色。

使用 SQL Server Management Studio

  1. 在“对象资源管理器”中,选择加号以展开要在其中创建新统计信息的数据库。

  2. 选择加号以便展开“表”文件夹

  3. 选择加号以展开要在其中创建新统计信息的表。

  4. 右键单击“统计信息”文件夹,然后选择“新建统计信息…”

    将在“新建表 table_name 的统计信息”对话框的“常规”页面上显示以下属性。

    properties 说明
    表名 显示统计信息中所涉及表的名称。
    统计信息名称 显示存储统计信息的数据库对象的名称。
    统计信息列 此网格显示该组统计信息中所涉及的列。 网格中的所有值都是只读的。
    Name 显示统计信息中所涉及列的名称。 它可以是单个的列或单个表中的列组合。
    数据类型 指示统计信息中所涉及列的数据类型。
    大小 显示每列的数据类型大小。
    标识 如果选中此项,则指示标识列。
    允许 Null 指示列是否接受空值。
    添加 将表中的更多列添加到统计信息网格。
    删除 从统计信息网格中删除所选列。
    上移 将所选列移动到统计信息网格中更靠前的位置。 网格中的位置可能会显著影响统计信息的有用性。
    “下移” 将所选列移到统计信息网格中更后面的位置。
    上次更新了这些列的统计信息 指示统计信息的存在时间。 如果统计信息是最新的,则会更有价值。 在对数据进行较大的更改或者添加异常数据之后,请更新统计信息。 对于数据分布一致的表,其统计信息更新频率应较低。
    更新这些列的统计信息 选中此项后将在对话框关闭时更新统计信息。

    将在“新建表 table_name 的统计信息”对话框的“筛选器”页面上显示以下属性。

    properties 说明
    筛选表达式 定义要将哪些数据行包含在筛选的统计信息中。 例如: Production.ProductSubcategoryID IN ( 1, 2, 3 )
  5. “新建表 table_name 的统计信息”对话框的“常规”页面上,选择“添加”

    “选择列” 对话框中显示以下属性: 此信息为只读信息。

    properties 说明
    Name 显示统计信息中所涉及列的名称。 它可以是单个的列或单个表中的列组合。
    数据类型 指示统计信息中所涉及列的数据类型。
    大小 显示每列的数据类型大小。
    标识 如果选中,则指示标识列。
    允许 Null 指示列是否接受空值。
  6. 在“选择列”对话框中,选中要为其创建统计信息的每个列旁边的复选框,然后选择“确定”

  7. “新建表 table_name 的统计信息”对话框中,选择“确定”

使用 Transact-SQL

  1. “对象资源管理器” 中,连接到 数据库引擎的实例。

  2. 在标准栏上,选择“新建查询” 。

  3. 将以下示例复制并粘贴到查询窗口中,然后选择“执行”。

    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
    
  4. 上面创建的统计信息可能会改进以下查询的结果。

    USE AdventureWorks2022;
    GO
    SELECT LastName, FirstName
    FROM Person.Person
    WHERE EmailPromotion = 2
    ORDER BY LastName, FirstName;
    GO
    

后续步骤