状況によっては、ロギングが最小限であるため、INSERT INTO <tablename> (WITH TABLOCK)
の方が高速になります。それらの状況には、データベースをBULK_LOGGED
復旧モデルに含めることが含まれます。
データベース(tempdb)がINSERT
復旧モデルを使用しているときに、空のテーブルのSIMPLE
でWITH TABLOCK
を使用することで、他の潜在的なパフォーマンス上の利点はありますか? ?
SQL Server 2012 Standard Editionを使用しています。
私の使用例は、INSERT...SELECT
を使用してストアドプロシージャ内に一時テーブルを作成し、すぐに入力することです。このテーブルには、数百万行を含めることができます。私はそのようなtempdbの乱用を避けようとしますが、時にはそれが必要になります。
TABLOCK
が必要なケースを作成しようとしています。それは何かを傷つけるようには見えないし、利益をもたらすかもしれません。私は、コードベース全体のどこにでも追加できる潜在的なメリットがあるかどうかを確認しようとしています。そのため、テーブルに書き込むプロセスが他にないはずです。
通常、クラスター化されたPKで新しく作成されたローカル一時テーブルに挿入しますが、ヒープを使用することもあります。
私はいくつかの利点を知っていますが、それらはほとんど状況依存的です。
TABLOCK
を使用すると、同時実行性は低下しますが、ターゲットテーブルのテーブルロックがすぐに行われます。 1つのセッションだけがテーブルに挿入することが保証できる限り、これにより、不要な行またはページのロックが回避され、 lock escalation が防止されます。結局のところ、とにかくロックのエスカレーションが発生するほど多くのデータを挿入している場合は、それを事前に実行してみませんか?TABLOCK
のない空のページ圧縮ヒープに挿入する場合、すべてのページに ページ圧縮ではなく行圧縮 が含まれます。新しく挿入された行はページ圧縮されます。
新しい行がページ圧縮で既存のページに移動する場合
tABLOCKを指定したBULK INSERTによって新しい行が挿入された場合
新しい行がINSERT INTO ...(TABLOCK)SELECT FROMによって挿入された場合
それ以外の場合、行は行圧縮されます。
TABLOCK
ヒントが必要です 。多くの制限があり、その一部は文書化されていません。 IDENTITY
列を含めることはできません。挿入はOUTPUT
を介して行うことはできません。