如何在 UPDATE STATISTICS ... WITH ROWCOUNT 后重置统计信息

Dan*_*her 11 sql-server index-statistics sql-server-2014

出于查询优化和测试的目的,您可以通过运行UPDATE STATISTICS. 但是你如何重新计算/重置统计数据到表格的实际内容?

--- Create a table..
CREATE TABLE dbo.StatTest (
    i      int NOT NULL,
    CONSTRAINT PK_StatTest PRIMARY KEY CLUSTERED (i)
);
GO

--- .. and give it a thousand-or-so rows:
DECLARE @i int=1;
INSERT INTO dbo.StatTest (i) VALUES (@i);

WHILE (@i<1000) BEGIN;
    INSERT INTO dbo.StatTest (i) SELECT @i+i FROM dbo.StatTest;
    SET @i=@i*2;
END;
Run Code Online (Sandbox Code Playgroud)

一个虚拟查询:

SELECT i%100, COUNT(*) FROM dbo.StatTest GROUP BY i%100;
Run Code Online (Sandbox Code Playgroud)

... 将返回以下查询计划(索引扫描中的行估计为 1024 行)。

10 000 行

运行UPDATE STATISTICS命令..

UPDATE STATISTICS dbo.StatTest WITH ROWCOUNT=10000000;
Run Code Online (Sandbox Code Playgroud)

...计划看起来像这样,现在估计有 1000 万行:

1000 万行

如何在不使用的情况下将行数重置为表的实际内容WITH ROWCOUNT

我试过WITH FULLSCAN,WITH RESAMPLEWITH SAMPLE n ROWS,但统计行数仍然是 1000 万行。插入一行甚至删除所有行都不会更新统计信息,因为更改太小了。

Pau*_*ite 15

DBCC UPDATEUSAGECOUNT_ROWS选项一起使用。

DBCC UPDATEUSAGE 
(   { database_name | database_id | 0 } 
    [ , { table_name | table_id | view_name | view_id } 
    [ , { index_name | index_id } ] ] 
) [ WITH [ NO_INFOMSGS ] [ , ] [ COUNT_ROWS ] ] 
Run Code Online (Sandbox Code Playgroud)

文档