Manfaat menggunakan DENGAN TABLOCK pada INSERT


15

Dalam beberapa keadaan, melakukan suatu INSERT INTO <tablename> (WITH TABLOCK)akan lebih cepat karena penebangan yang minimal. Keadaan tersebut termasuk memiliki database dalam BULK_LOGGEDmodel pemulihan.

Apakah ada manfaat kinerja potensial lainnya untuk digunakan WITH TABLOCKpada INSERTtabel kosong ketika database ( tempdb ) menggunakan SIMPLEmodel pemulihan?

Saya bekerja dengan SQL Server 2012 Edisi Standar.

Kasus penggunaan saya adalah untuk membuat dan kemudian segera mengisi tabel temp dalam prosedur tersimpan menggunakan INSERT...SELECT, yang dapat berisi sebanyak beberapa juta baris. Saya mencoba menghindari penyalahgunaan tempdb semacam itu , tetapi kadang-kadang diperlukan.

Saya mencoba membuat case untuk dibutuhkan TABLOCK. Sepertinya itu tidak akan menyakiti apa pun, dan mungkin memiliki manfaat. Saya mencoba mencari tahu apakah ada potensi manfaat yang cukup untuk menambahkannya di mana saja di seluruh basis kode kami, di mana saya yakin tidak ada proses lain yang ingin menulis ke tabel.

Saya biasanya memasukkan ke dalam tabel temp lokal yang baru dibuat dengan PK berkerumun, tetapi kadang-kadang menggunakan heap.

Jawaban:


17

Saya tahu beberapa manfaat tetapi kebanyakan situasional.

  1. Menggunakan TABLOCKakan mengurangi konkurensi tetapi akan segera mengambil kunci meja di tabel target. Selama Anda dapat menjamin bahwa hanya satu sesi akan dimasukkan ke dalam tabel, ini akan menghindari kunci baris atau halaman yang tidak perlu dan akan mencegah eskalasi kunci . Lagi pula, jika Anda memasukkan begitu banyak data sehingga Anda akan mendapatkan kunci eskalasi mengapa tidak melakukannya di muka?
  2. Jika Anda memasukkan ke tumpukan kosong halaman-terkompresi tanpa TABLOCKsemua halaman akan memiliki kompresi baris, bukan kompresi halaman :

Baris yang baru saja dimasukkan dikompresi-halaman:

  • jika baris baru menuju ke halaman yang ada dengan kompresi halaman

  • jika baris baru dimasukkan melalui BULK INSERT dengan TABLOCK

  • jika baris baru dimasukkan melalui INSERT INTO ... (TABLOCK) SELECT FROM

Jika tidak, baris dikompresi baris.

  1. Dalam SQL Server 2016 TABLOCKpetunjuk diperlukan untuk mendapatkan masukkan paralel ke tumpukan , CCI (Indeks Columnstore Clustered) , dan tabel temp lokal . Ada banyak batasan, beberapa di antaranya tidak didokumentasikan. Tidak boleh ada IDENTITYkolom, sisipan tidak bisa dilakukan melalui OUTPUT, dll.

Lihat juga Panduan Kinerja Pemuatan Data

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.