Aktualizacja statystyk zablokowała inne transakcje w środku dnia

12-Gru-2014

Paczka SSIS miała właśnie wykonać pewną czynność wymagającą założenia locka exclusive na całej tabeli, co zwykle trwało kilka chwil. Niestety tym razem proces zatrzymał się i stoi już tak od 20 minut… Rzut oka w Activity monitor, a może lepiej w sys.dm_exec_connections lub sp_who2 i już wiadomo co się dzieje. Proces zablokowany przez proces ze spid=18. No ale hola hola… przecież SPID<51 to system! Czy możemy tak po prostu killować proces systemowy!? Osobiście nie polecam takiego postępowania.

Baza danych miała ustawione Auto Create Statistics i Auto Update Statistics na true. Ponieważ tabela nie była mała, przeliczanie statystyk trochę serwerowi zajęło. Trzeba było po prostu cierpliwie poczekać.I tu widać, że Auto Update Statistics warto w takim przypadku wyłączyć, tym bardziej, jeśli administrator zaplanował przeliczanie statystyk jako job w Agencie.

Najtrudniejszym krokiem w tym przypadku było stwierdzenie, że blokującym procesem są rzeczywiście statystyki. Można to było wywnioskować po:’

  • dużej liczbie odczytów zapisów do danego pliku z tego procesu
  • sesji profilera łapiącej zdarzenia związane ze statystykami.

Pamiętajmy, że można pozwolić SQL na utrzymywanie statystyk małych tabel automatycznie, duże zaś oznaczyć jako NORECOMPUTE i utrzymywać w nich statystyki ręcznie. Dokkładniej opisuje to np http://www.mssqltips.com/sqlservertip/1056/norecompute-option-of-update-statistics-in-sql-server/

A tu też ładne demo o statystykach: https://www.simple-talk.com/sql/performance/managing-sql-server-statistics/

Dodaj komentarz:

Autor: Rafał Kraik