SQL Server:我不明白为什么我可以在同一统计信息上使用列/索引更新stat

时间:2016-09-02 03:57:15

标签: sql sql-server

我必须阅读存储过程以更新我公司的统计信息,每个命令都有2条更新统计信息。

例如

stat name '_WA_Sys_00000002_0BC6C43E'

他们有2个更新stat的命令

update statistics [dbo].[Table_1] [_WA_Sys_00000002_0BC6C43E] with columns
update statistics [dbo].[Table_1] [_WA_Sys_00000002_0BC6C43E] with index

我认为这是列数据。创建索引时自动创建的统计信息是索引统计信息。

我不明白为什么他们会使用索引更新统计数据'列数据。令我惊讶的是它可以成功运行这两个命令。

你知道吗?我理解正确吗?

1 个答案:

答案 0 :(得分:0)

如果有疑问,你必须查看官方文档。

这是更新统计数据的语法..

ALL | COLUMNS | INDEX

现在参加相关部分..

update stats

这是MSDN对此有何看法..

  

更新所有现有统计信息,在一列或多列上创建的统计信息或为索引创建的统计信息。如果未指定任何选项,则UPDATE STATISTICS语句将更新表或索引视图上的所有统计信息。

因此,当您指定列时,您只更新列上的统计信息,当您指定索引时,您只更新索引列上的统计信息。

通常,您可以使用以下命令,该命令将使用默认采样更新列和索引上的所有统计信息。

  

EXEC sp_updatestats;

维护工作,如索引重建/统计更新/任何维护工作都在周末完成。因此,当您重建索引并在重建后运行更新统计信息时,您正在进行双重工作并且还会抵消完全扫描的影响..

通常当我们运行索引重建时,它会使用完全扫描重建索引并更新索引列上的统计信息,然后我们运行UPDATE STATISTICS dbo.SalesOrderDetail WITH FULLSCAN, COLUMNS ,它再次使用默认采样率重建索引列和表的统计信息..,这应该要避免..这是covered by Benjamin Nevarej here

在这种情况下,你可以在下面做..

1.运行指数重建
2.现在只运行列的更新统计信息..

// Create a table of five different people.
    // ... Store their size and sex.
    DataTable table = new DataTable("Players");
    table.Columns.Add(new DataColumn("Size", typeof(int)));
    table.Columns.Add(new DataColumn("Sex", typeof(char)));

    table.Rows.Add(100, 'f');
    table.Rows.Add(235, 'f');
    table.Rows.Add(250, 'm');
    table.Rows.Add(310, 'm');
    table.Rows.Add(150, 'm');

    // Search for people above a certain size.
    // ... Require certain sex.
    DataRow[] result = table.Select("Size >= 230 AND Sex = 'm'");
    foreach (DataRow row in result)
    {
        Console.WriteLine("{0}, {1}", row[0], row[1]);
    }