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).
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 OPENQUERY
comportamento in SP3 che stava arrotondando i numeri in una query del server collegato tra SQL Server e Oracle.