Как сбросить статистику после ОБНОВЛЕНИЯ СТАТИСТИКИ… С ROWCOUNT

11

В целях настройки запросов и тестирования вы можете вручную запустить rowcount и pagecount для статистики индекса таблицы 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 строки).

10 000 строк

Запустите UPDATE STATISTICSкоманду ..

UPDATE STATISTICS dbo.StatTest WITH ROWCOUNT=10000000;

... и план выглядит так, теперь с оценкой в ​​10 миллионов строк:

10 миллионов строк

Как мне сбросить количество строк до фактического содержимого таблицы без использования WITH ROWCOUNT?

Я пытался WITH FULLSCAN, WITH RESAMPLEи WITH SAMPLE n ROWS, но статистика по количеству строк остается 10 миллионов строк. Вставка строки или даже удаление всех строк не обновляет статистику, потому что изменение слишком мало.

Даниэль Хутмахер
источник

Ответы:

15

Используйте DBCC UPDATEUSAGEс COUNT_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 ] ] 

Документация

Пол Уайт 9
источник