创建统计信息

适用于: Microsoft Fabric 中的 SQL Server 2022 (16.x) 及更高版本 Azure SQL 数据库Azure SQL 托管实例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

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

  2. 选择加号以展开表格文件夹。

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

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

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

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

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

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

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

    Property Description
    Name 显示统计信息中所涉及列的名称。 它可以是单列,也可以是同一表中多个列的组合。
    数据类型 指示统计信息中所涉及列的数据类型。
    Size 显示每列的数据类型大小。
    Identity 如果选中,则指示标识列。
    允许 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
    

后续步骤