我必须阅读存储过程以更新我公司的统计信息,每个命令都有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
我认为这是列数据。创建索引时自动创建的统计信息是索引统计信息。
我不明白为什么他们会使用索引更新统计数据'列数据。令我惊讶的是它可以成功运行这两个命令。
你知道吗?我理解正确吗?答案 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]);
}