Vantaggi dell'utilizzo di WITH TABLOCK su un INSERT


15

In alcune circostanze, fare un INSERT INTO <tablename> (WITH TABLOCK)sarà più veloce a causa della registrazione minima. Tali circostanze includono la presenza del database nel BULK_LOGGEDmodello di recupero.

Esistono altri potenziali vantaggi in termini di prestazioni nell'uso WITH TABLOCKsu una INSERTtabella vuota quando il database ( tempdb ) utilizza il SIMPLEmodello di recupero?

Sto lavorando con SQL Server 2012 Standard Edition.

Il mio caso d'uso è la creazione e il popolamento immediato di una tabella temporanea all'interno di una procedura memorizzata utilizzando un INSERT...SELECT, che può contenere fino a qualche milione di righe. Cerco di evitare quel tipo di abuso di tempdb , ma a volte è necessario.

Sto cercando di costruire un caso da richiedere TABLOCK. Non sembra farebbe male a nulla e potrebbe avere un vantaggio. Sto cercando di capire se ci sono abbastanza potenziali benefici per aggiungerlo ovunque nella nostra base di codice, dove sono sicuro che non ci sono altri processi che vogliono scrivere sulla tabella.

Di solito inserisco una tabella temporanea locale appena creata con un PK in cluster, ma a volte uso un heap.

Risposte:


17

Conosco alcuni vantaggi, ma sono principalmente situazionali.

  1. L'utilizzo TABLOCKridurrà la concorrenza ma richiederà immediatamente un blocco della tabella nella tabella di destinazione. Finché puoi garantire che solo una sessione verrà inserita nella tabella, questo eviterà inutili blocchi di riga o di pagina e impedirà l' escalation dei blocchi . Dopotutto, se stai inserendo così tanti dati che otterrai comunque l'escalation dei blocchi perché non farlo in anticipo?
  2. Se si inserisce in un heap compresso di pagina vuoto senza TABLOCKtutte le pagine, si avrà la compressione di riga anziché la compressione di pagina :

La riga appena inserita è compressa in pagine:

  • se la nuova riga passa a una pagina esistente con compressione della pagina

  • se la nuova riga viene inserita tramite BULK INSERT con TABLOCK

  • se la nuova riga viene inserita tramite INSERT INTO ... (TABLOCK) SELEZIONA DA

Altrimenti, la riga è compressa.

  1. In SQL Server 2016 il TABLOCKsuggerimento è necessario per ottenere l'inserimento parallelo in heap , CCI (Indici Columnstore cluster) e tabelle temporanee locali . Ci sono molte restrizioni, alcune delle quali non sono documentate. Non può esserci una IDENTITYcolonna, l'inserimento non può essere eseguito tramite un OUTPUT, ecc.

Vedi anche La Guida alle prestazioni di caricamento dei dati

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.