INSERTでWITH TABLOCKを使用する利点


14

状況INSERT INTO <tablename> (WITH TABLOCK)によっては、ロギングが最小限であるため、実行が高速になります。これらの状況には、BULK_LOGGED復旧モデルにデータベースを含めることが含まれます。

データベース(tempdb)が復旧モデルを使用しているときに、空のテーブルで使用することWITH TABLOCKでパフォーマンス上の利点は他INSERTにありますか?SIMPLE

SQL Server 2012 Standard Editionを使用しています。

私のユースケースは、を使用してストアドプロシージャ内に一時テーブルを作成し、すぐにデータを取り込むINSERT...SELECTことです。私はそのようなtempdbの乱用を避けようとしますが、時々必要になります。

私は必要なケースを構築しようとしていますTABLOCK。それは何も傷つけないようで、利益があるかもしれません。コードベースのどこにでもそれを追加するのに十分な潜在的な利点があるかどうかを把握しようとしています。テーブルに書き込みたい他のプロセスがないと確信しています。

通常、クラスター化されたPKで新しく作成されたローカル一時テーブルに挿入しますが、時々ヒープを使用します。

回答:


15

いくつかの利点を知っていますが、それらは主に状況依存です。

  1. を使用TABLOCKすると、同時実行性が低下しますが、ターゲットテーブルのテーブルロックがすぐに取得されます。1つのセッションのみがテーブルに挿入されることを保証できる限り、これにより不必要な行またはページのロックが回避され、ロックのエスカレーションが防止されます。結局のところ、ロックエスカレーションが発生するほど多くのデータを挿入している場合、それを前もってやってみませんか?
  2. TABLOCKすべてのページなしで空のページ圧縮ヒープに挿入する場合、ページ圧縮ではなく行圧縮が行われます

新しく挿入された行はページ圧縮されます:

  • 新しい行がページ圧縮を使用して既存のページに移動する場合

  • 新しい行がTABLOCKを使用したBULK INSERTによって挿入された場合

  • INSERT INTO ...(TABLOCK)SELECT FROMを使用して新しい行が挿入された場合

それ以外の場合、行は行圧縮されます。

  1. SQL Server 2016では、ヒープCCI(クラスター化された列ストアインデックス)、およびローカル一時テーブルTABLOCKへの並列挿入を行うためのヒントが必要です。多くの制限があり、そのいくつかは文書化されていません。列は存在できません。挿入などはできません。IDENTITYOUTPUT

データ読み込みパフォーマンスガイドもご覧ください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.