出于查询调优和测试目的,您可以通过运行手动将行数和页数分配给表的索引统计信息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;
一个虚拟查询:
SELECT i%100, COUNT(*) FROM dbo.StatTest GROUP BY i%100;
... 将返回以下查询计划(索引扫描中的行估计为 1024 行)。
运行UPDATE STATISTICS
命令..
UPDATE STATISTICS dbo.StatTest WITH ROWCOUNT=10000000;
...计划看起来像这样,现在估计有 1000 万行:
如何在不使用的情况下将行数重置为表的实际内容WITH ROWCOUNT
?
我试过WITH FULLSCAN
,WITH RESAMPLE
和WITH SAMPLE n ROWS
,但统计行数仍然是 1000 万行。插入一行甚至删除所有行都不会更新统计信息,因为更改太小了。
DBCC UPDATEUSAGE
与COUNT_ROWS
选项一起使用。文档