L'aggiornamento di esempio di SQL Server delle statistiche manca il RANGE_HI_KEY più alto nella colonna chiave crescente


10

Sto cercando di capire come funziona il campionamento delle statistiche e se è previsto il comportamento previsto di seguito sugli aggiornamenti delle statistiche campionati.

Abbiamo una grande tabella partizionata per data con un paio di miliardi di righe. La data della partizione è la data commerciale precedente e quindi è una chiave crescente. Carichiamo i dati in questa tabella solo per il giorno precedente.

Il caricamento dei dati viene eseguito durante la notte, quindi venerdì 8 aprile abbiamo caricato i dati per il 7.

Dopo ogni esecuzione aggiorniamo le statistiche, anche se prendiamo un campione, piuttosto che un FULLSCAN.

Forse sono ingenuo, ma mi sarei aspettato che SQL Server identificasse la chiave più alta e la chiave più bassa dell'intervallo per garantire che ottenesse un esempio di intervallo accurato. Secondo questo articolo :

Per il primo bucket, il limite inferiore è il valore più piccolo della colonna su cui viene generato l'istogramma.

Tuttavia, non menziona l'ultimo bucket / valore più grande.

Con l'aggiornamento statistico campionato la mattina dell'8, il campione ha perso il valore più alto nella tabella (il 7).

inserisci qui la descrizione dell'immagine

Poiché eseguiamo molte query sui dati del giorno precedente, ciò ha comportato una stima imprecisa della cardinalità e un certo numero di query scadute.

SQL Server non dovrebbe identificare il valore più alto per quella chiave e utilizzarlo come massimo RANGE_HI_KEY? O è solo uno dei limiti dell'aggiornamento senza usare FULLSCAN?

Versione SQL Server 2012 SP2-CU7. Al momento non è possibile eseguire l'aggiornamento a causa di un cambiamento nel OPENQUERYcomportamento in SP3 che stava arrotondando i numeri in una query del server collegato tra SQL Server e Oracle.

Risposte:


11

SQL Server non dovrebbe identificare il valore più alto per quella chiave e utilizzarlo come massimo RANGE_HI_KEY? O è solo uno dei limiti dell'aggiornamento senza usare FULLSCAN?

È una limitazione dell'attuale implementazione delle statistiche campionate. Allo stato attuale, utilizza la raccolta di statistiche campionate TABLESAMPLE SYSTEM, che utilizza una scansione dell'ordine di allocazione e sceglie le pagine dalla scansione per campionare. Solo le pagine scelte contribuiscono all'istogramma.

Poiché la scansione è ordinata per allocazione (anziché ordinata per indice), non è possibile dare la preferenza alla prima e all'ultima pagina nell'ordine delle chiavi.

Per ulteriori informazioni, consultare questa domanda correlata:

Come funziona il campionamento durante l'aggiornamento delle statistiche?

e il mio articolo, Allocation Order Scans

Per soluzioni alternative, vedere Statistiche sulle colonne ascendenti di Fabiano Amorim


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.