Korzyści z używania WITH TABLOCK na INSERT

15

W niektórych okolicznościach robienie tego INSERT INTO <tablename> (WITH TABLOCK)będzie szybsze ze względu na minimalne rejestrowanie. Okoliczności te obejmują posiadanie bazy danych w BULK_LOGGEDmodelu odzyskiwania.

Czy istnieją inne potencjalne korzyści wydajność do korzystania WITH TABLOCKna zasadzie INSERTna pustym stole, gdy baza danych ( tempdb ) jest przy użyciu SIMPLEmodelu odzyskiwania?

Pracuję z SQL Server 2012 Standard Edition.

Mój przypadek użycia dotyczy utworzenia, a następnie natychmiastowego zapełnienia tabeli tymczasowej w ramach procedury składowanej za pomocą polecenia INSERT...SELECT, które może zawierać nawet kilka milionów wierszy. Staram się unikać tego rodzaju nadużyć tempdb , ale czasami jest to potrzebne.

Staram się zbudować wymaganie TABLOCK. Nie wydaje się, żeby coś to zaszkodziło i mogłoby przynieść korzyści. Próbuję dowiedzieć się, czy istnieje wystarczająca potencjalna korzyść, aby dodać ją w dowolnym miejscu w naszej bazie kodu, gdzie jestem pewien, że nie ma innego procesu, który chciałby pisać do tabeli.

Zwykle wstawiam do nowo utworzonej lokalnej tabeli temp z klastrowanym PK, ale czasami używam sterty.

Mark Freeman
źródło

Odpowiedzi:

17

Znam kilka korzyści, ale są one głównie sytuacyjne.

  1. Użycie TABLOCKzmniejszy współbieżność, ale natychmiast zablokuje tabelę na tabeli docelowej. Tak długo, jak możesz zagwarantować, że tylko jedna sesja wstawi się do tabeli, pozwoli to uniknąć niepotrzebnych blokad wierszy lub stron i zapobiegnie eskalacji blokad . W końcu, jeśli wstawiasz tyle danych, że i tak otrzymasz eskalację blokady, dlaczego nie zrobić tego z góry?
  2. Jeśli wstawiasz do pustej sterty ze skompresowanymi TABLOCKstronami, a wszystkie strony nie będą miały kompresji wierszy zamiast kompresji strony :

Nowo wstawiony wiersz jest skompresowany:

  • jeśli nowy wiersz przejdzie do istniejącej strony z kompresją strony

  • jeśli nowy wiersz zostanie wstawiony przez WSTAWANIE LUZEM za pomocą TABLOCK

  • jeśli nowy wiersz zostanie wstawiony przez INSERT INTO ... (TABLOCK) WYBIERZ

W przeciwnym razie wiersz zostanie skompresowany.

  1. W SQL Server 2016 TABLOCKpodpowiedź jest wymagana, aby uzyskać równoległe wstawianie do stosów , CCI (indeks klastrowany magazynu kolumn) i lokalnych tabel tymczasowych . Istnieje wiele ograniczeń, z których niektóre nie są udokumentowane. Nie może być IDENTITYkolumny, wstawki nie można wykonać za pomocąOUTPUT itp.

Zobacz także Przewodnik wydajności ładowania danych

Joe Obbish
źródło