Auto Update Stats aktualisiert Statistiken nicht


8

SQL SERVER 2012Ich benutze Ich habe mein Auto Update Stats ON in meiner Datenbank.

Über den folgenden Link habe ich erfahren, dass die Auto-Update-Statistiken für jede SQRT(1000 * Table rows)Änderung in Tabellenzeilen ausgelöst werden. https://blogs.msdn.microsoft.com/srgolla/2012/09/04/sql-server-statistics-explained/

Ich habe eine Tabelle mit 1000 Datensätzen erstellt

SELECT TOP 500 Row_number()OVER (ORDER BY (SELECT NULL)) rn,
                name
INTO   stst
FROM   sys.objects 

Statistiken erstellen

CREATE STATISTICS rn  
    ON stst (rn)  

CREATE STATISTICS name  
    ON stst (name)  

Überprüfen der erstellten Statistiken

DBCC show_statistics('stst', rn)  -- Rows 500 

DBCC show_statistics('stst', name) -- Rows 500

Nach der Formel

select SQRT(1000 * 500) -- 707.106781186548

Wenn ich also 707.106781186548Datensätze in meiner Tabelle hinzufüge / ändere, sollte die automatische Aktualisierungsstatistik ausgelöst werden

Fügen Sie 1000meiner Tabelle weitere Datensätze hinzu, die mehr als genug sein sollten, um ausgelöst zu werdenauto update stats

INSERT INTO stst(rn,name)
SELECT TOP 1000 Row_number()OVER (ORDER BY (SELECT NULL)) rn,
                a.name
FROM   sys.objects a 

Um die zu feuern auto update stats

Select * from stst

Überprüfen der Statistiken

DBCC show_statistics('stst', rn)  -- Rows 500 

DBCC show_statistics('stst', name) -- Rows 500

Leider immer noch das Rowsist 500nur.

Selbst nach dem Einfügen von 1000Datensätzen in meine Tabelle, was offensichtlich größer ist als 707.106781186548beim Ausführen, SELECTwarum die Auto-Update-Statistiken nicht ausgelöst wurden. Was fehlt mir hier?


7
Ihnen fehlen ein paar Dinge. Die verbesserte Berechnung wird nur in Versionen vor 2016 verwendet, wenn Sie das Trace-Flag 2371 aktiviert haben. Statistiken werden nicht aktualisiert, wenn Daten geändert werden. Sie werden aktualisiert, nachdem Daten geändert wurden und von einer Abfrage verwendet werden müssen (vorausgesetzt, sie haben den Änderungsschwellenwert erreicht).
Erik Darling

7
Auch eine triviale Abfrage (z. B. SELECT * ohne WHERE-Klausel) löst keine Statistikaktualisierung aus. Versuchen Sie, eine Abfrage auszuführen, die die Engine tatsächlich dazu bringt, etwas zu tun, wo die Statistiken nützlich sein könnten (z. B. Gleichheit oder Bereich in der führenden Schlüsselspalte).
Aaron Bertrand

2
@sp_BlitzErik Danke für die Info auf Trace Flag weiß das nie ..
P ரதீப்

3
Fühle dich nicht dumm, ich habe etwas aus den Antworten auf deine Frage gelernt. Und ich stimme zu, dass @sp_BlitzErik und / oder AaronBertrand ihre Antworten veröffentlichen sollten.
SqlZim

8
Ich werde @AaronBertrand seine als Antwort posten lassen. Er konnte die Punkte benutzen.
Erik Darling

Antworten:


11

Die neue Berechnung wird nur verwendet, wenn das Ablaufverfolgungsflag 2371 aktiviert ist, außer unter SQL Server 2016, wenn die Kompatibilitätsstufe der Kontextdatenbank auf 130 festgelegt ist, wobei dies das Standardverhalten ist. Siehe Microsoft KB 2754171:

Steuern des Autostat-Verhaltens (AUTO_UPDATE_STATISTICS) in SQL Server

Statistiken werden nicht aktualisiert, wenn Daten geändert werden. Eine Statistikaktualisierung wird ausgelöst, wenn die kostenbasierte Optimierung feststellt, dass interessante Statistiken für die Abfrage veraltet sind.

Der Optimierer gibt keine kostenbasierte Optimierung für sehr einfache ("triviale") Abfragen ein, bei denen ein einzelner offensichtlicher Plan immer optimal ist. In diesem Szenario werden keine Statistikaktualisierungen durchgeführt.

Weitere Informationen finden Sie im Microsoft White Paper Plan Caching und Neukompilierung in SQL Server 2012 von Greg Low.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.