Perché la statistica creata automaticamente su questa colonna è vuota?


8

Informazioni

La mia domanda si riferisce a una tabella moderatamente grande (~ 40 GB di spazio dati) che è un heap
(sfortunatamente, non sono autorizzato ad aggiungere un indice cluster alla tabella dai proprietari dell'applicazione)

È stata creata una statistica creata automaticamente su una colonna Identity ( ID), ma è vuota.

  • Le statistiche di creazione automatica e di aggiornamento automatico sono attive
  • Sono state apportate modifiche nella tabella
  • Esistono altre statistiche (create automaticamente) che vengono aggiornate
  • C'è un'altra statistica sulla stessa colonna creata da un indice (duplicato)
  • Costruzione: 12.0.5546

La statistica duplicata viene aggiornata: inserisci qui la descrizione dell'immagine

La vera domanda

A mio avviso, è possibile utilizzare tutte le statistiche e tenere traccia delle modifiche, anche se ci sono due statistiche esattamente sulle stesse colonne (duplicati), quindi perché questa statistica rimane vuota?

Informazioni statistiche

inserisci qui la descrizione dell'immagine

Informazioni statistiche DB

inserisci qui la descrizione dell'immagine

Dimensioni della tavola

inserisci qui la descrizione dell'immagine

Colonna Informazioni su cui viene creata la statistica

inserisci qui la descrizione dell'immagine

[ID] [int] IDENTITY(1,1) NOT NULL

Colonna identità

select * from sys.stats  
where name like '%_WA_Sys_0000000A_6B7099F3%';

inserisci qui la descrizione dell'immagine Auto creato

Ottenere alcune informazioni su un'altra statistica

select * From sys.dm_db_stats_properties (1802541555, 3)  

inserisci qui la descrizione dell'immagine

In confronto al mio stat vuoto:

inserisci qui la descrizione dell'immagine

Statistiche + istogramma da "genera script":

/****** Object:  Statistic [_WA_Sys_0000000A_6B7099F3]    Script Date: 2/1/2019 10:18:19 AM ******/

    CREATE STATISTICS [_WA_Sys_0000000A_6B7099F3] ON [dbo].[table]([ID]) WITH STATS_STREAM = 0x01000000010000000000000000000000EC03686B0000000040000000000000000000000000000000380348063800000004000A00000000000000000000000000

Quando si crea una copia delle statistiche, non sono presenti dati

CREATE STATISTICS [_WA_Sys_0000000A_6B7099F3_TEST] ON [dbo].[table]([ID]) WITH STATS_STREAM = 0x01000000010000000000000000000000EC03686B0000000040000000000000000000000000000000380348063800000004000A00000000000000000000000000

inserisci qui la descrizione dell'immagine

Quando aggiornano manualmente le statistiche, vengono aggiornate.

UPDATE STATISTICS [dbo].[Table]([_WA_Sys_0000000A_6B7099F3_TEST])

inserisci qui la descrizione dell'immagine

Risposte:


9

Sono stato in grado di riprodurlo, sia con una statistica vuota, sia con una statistica popolata. Ho organizzato la creazione di una statistica automatica su una tabella vuota e l'indice è stato creato successivamente:

IF OBJECT_ID(N'dbo.Heap', N'U') IS NOT NULL
BEGIN
    DROP TABLE dbo.Heap;
END;
GO
CREATE TABLE dbo.Heap 
(
    id integer NOT NULL IDENTITY,
    val integer NOT NULL,
);
GO
-- Add 1000 rows
INSERT dbo.Heap
    WITH (TABLOCKX)
    (val)
SELECT
    SV.number
FROM master.dbo.spt_values AS SV
WHERE
    SV.[type] = N'P'
    AND SV.number BETWEEN 1 AND 1000;
GO
SELECT COUNT_BIG(*) 
FROM dbo.Heap AS H
JOIN dbo.Heap AS H2
    ON H2.id = H.id
WHERE H.id > 0
AND H2.id > 0;
GO
-- Empty table
TRUNCATE TABLE dbo.Heap;
GO
-- Repeat exact same query (RT = 500 + 0.2 * 1000 = 700)
GO
SELECT COUNT_BIG(*) 
FROM dbo.Heap AS H
JOIN dbo.Heap AS H2
    ON H2.id = H.id
WHERE H.id > 0
AND H2.id > 0;
GO
-- Add 1000 rows
INSERT dbo.Heap
    WITH (TABLOCKX)
    (val)
SELECT
    SV.number
FROM master.dbo.spt_values AS SV
WHERE
    SV.[type] = N'P'
    AND SV.number BETWEEN 1 AND 1000;
GO
-- Add index
ALTER TABLE dbo.Heap ADD 
    CONSTRAINT [PK dbo.Heap id]
    PRIMARY KEY NONCLUSTERED (id);
GO
SELECT
    S.[name],
    S.auto_created,
    DDSP.stats_id,
    DDSP.last_updated,
    DDSP.[rows],
    DDSP.rows_sampled,
    DDSP.steps,
    DDSP.unfiltered_rows,
    DDSP.modification_counter
FROM sys.stats AS S
CROSS APPLY sys.dm_db_stats_properties(S.[object_id], S.stats_id) AS DDSP
WHERE 
    S.[object_id] = OBJECT_ID(N'dbo.Heap', N'U');

Produzione

Ho scoperto che le modifiche continuano a essere monitorate accuratamente su tutti i duplicati non vuoti, ma solo una statistica viene aggiornata automaticamente (indipendentemente dall'impostazione asincrona).

Gli aggiornamenti automatici delle statistiche si verificano solo quando Query Optimizer necessita di una statistica particolare e rileva che non è aggiornato (una ricompilazione relativa all'ottimalità).

L'ottimizzatore sceglie tra statistiche duplicate come indicato nel documento Plan Caching and Compompilations in SQL Server 2012 :

Un problema non direttamente correlato all'argomento di questo documento è: date più statistiche sullo stesso set di colonne nello stesso ordine, in che modo lo strumento di ottimizzazione delle query decide quali caricare durante l'ottimizzazione delle query? La risposta non è semplice, ma Query Optimizer utilizza linee guida come: dare la preferenza a statistiche recenti rispetto a statistiche precedenti; Dare la preferenza alle statistiche calcolate usando l' FULLSCANopzione a quelle calcolate usando il campionamento; e così via.

Il punto è che l'ottimizzatore sceglie una delle statistiche duplicate disponibili (la "migliore") e che viene automaticamente aggiornata se viene trovata obsoleta.

Credo che si tratti di un cambiamento nel comportamento rispetto alle versioni precedenti - o almeno la documentazione suggerisce che tutte le statistiche non aggiornate per un oggetto verrebbero aggiornate come parte di questo processo, ma non ho idea di quando cambierà. Fu certamente dopo l'agosto 2013 che Matt Bowler pubblicò Duplicate Statistics , che contiene un utile repository basato su AdventureWorks. Lo script ora porta ad aggiornare solo uno degli oggetti statistici, mentre al momento entrambi lo erano.

La spiegazione sopra riportata corrisponde a tutti i comportamenti che ho osservato durante il tentativo di riprodurre il tuo scenario, ma dubito che sia esplicitamente documentato ovunque. Sembra un'ottimizzazione sensata, poiché c'è poco valore nel mantenere i duplicati completamente aggiornati.

Questo è probabilmente tutto a un livello di dettaglio inferiore a quello che Microsoft è disposto a supportare. Questo significa anche che potrebbe cambiare senza preavviso.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.