Heute wurde ich durch einen Blogeintrag im Sqlservercode-Weblog auf die Datenbank-Option AUTO_UPDATE_STATISTICS_ASYNC aufmerksam. Dort wird aus den Books Online zitiert:
In SQL Server 2005, the database option AUTO_UPDATE_STATISTICS_ASYNC provides asynchronous statistics updating. When this option is set to ON, queries do not wait for the statistics to be updated before compiling. Instead, the out-of-date statistics are put on a queue for updating by a worker thread in a background process. The query and any other concurrent queries compile immediately by using the existing out-of-date statistics. Because there is no delay for updated statistics, query response times are predictable; however, the out-of-date statistics may cause the query optimizer to choose a less-efficient query plan.
Das ist interessant für Datenbanken deren Inhalte sich häufig ändert, z.B. regelmäßig viele Datensätze eingegeben oder gelöscht werden. Ich kann mich durchaus an mehrere Fälle in der Vergangenheit erinnern in denen unregelmäßig die Ausführung von Statements viel länger dauerte als es erklärbar war. Im Nachhinein deutet vieles daraufhin, dass da die Statistiken nicht mehr aktuell waren und vor der Zusammenstellung des Zugriffsplans aktualisiert werden mussten. Das wird mir aber erst jetzt klar.
Statistiken werden für jeden Index angelegt, man kann sie manuell anlegen (auch für indexierte Views) und manchmal werden sie automatisch angelegt, wenn zu wenige Indexes auf der Tabelle liegen. Das Verhalten kann also jeden treffen. Die Option einzuschalten ist aber nur dann sinnvoll, wenn auch ein Zugriffsplan basierend auf veralteten Statistiken noch eine akzeptable Performance bietet. Ich würde vermuten, dass dies bei sinnvoll vergebenen "clustered indexes" meist der Fall ist und die "dicksten" Abfragen den Clustred-Index verwenden. Da muss man aber jeweils genauer hinsehen.
Generell begeistert mich der Gedanke, dass der SQL-Server-2005 diese zeitaufwändige Aktion dann macht, wenn er gerade wenig zu tun hat. Aber logischerweise bringt die Option nur dann einen Vorteil, wenn die (mehrfache) Ausführung eines Statements mit einem "alten" Zugriffsplan immer noch schneller ist als die Aktualisierung der Statistik(en) und die anschließende (mehrfache) Ausführung des Statements.