Como redefinir as estatísticas após atualizar estatísticas ... COM ROWCOUNT

11

Para fins de ajuste e teste de consulta, é possível atribuir manualmente um número de linhas e um número de páginas às estatísticas de índice de uma tabela executando UPDATE STATISTICS. Mas como você recalcula / redefine as estatísticas para o conteúdo real da tabela?

--- 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;

Uma consulta fictícia:

SELECT i%100, COUNT(*) FROM dbo.StatTest GROUP BY i%100;

... retornará o seguinte plano de consulta (a estimativa de linha na Varredura de índice é 1024 linhas).

10 000 linhas

Execute o UPDATE STATISTICScomando

UPDATE STATISTICS dbo.StatTest WITH ROWCOUNT=10000000;

... e o plano fica assim, agora com uma estimativa de 10 milhões de linhas:

10 milhões de linhas

Como redefinir a contagem de linhas para o conteúdo real da tabela sem usar WITH ROWCOUNT?

Eu tentei WITH FULLSCAN, WITH RESAMPLEe WITH SAMPLE n ROWS, mas o número de linhas estatísticas permanece 10 milhões de linhas. Inserir uma linha ou até excluir todas as linhas não atualiza as estatísticas, porque a alteração é muito pequena.

Daniel Hutmacher
fonte

Respostas:

15

Use DBCC UPDATEUSAGEcom a COUNT_ROWSopção

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

Documentação

Paul White 9
fonte