web-dev-qa-db-ja.com

INSERTでWITH TABLOCKを使用する利点

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

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

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

私の使用例は、INSERT...SELECTを使用してストアドプロシージャ内に一時テーブルを作成し、すぐに入力することです。このテーブルには、数百万行を含めることができます。私はそのようなtempdbの乱用を避けようとしますが、時にはそれが必要になります。

TABLOCKが必要なケースを作成しようとしています。それは何かを傷つけるようには見えないし、利益をもたらすかもしれません。私は、コードベース全体のどこにでも追加できる潜在的なメリットがあるかどうかを確認しようとしています。そのため、テーブルに書き込むプロセスが他にないはずです。

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

16
Mark Freeman

私はいくつかの利点を知っていますが、それらはほとんど状況依存的です。

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

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

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

  • tABLOCKを指定したBULK INSERTによって新しい行が挿入された場合

  • 新しい行がINSERT INTO ...(TABLOCK)SELECT FROMによって挿入された場合

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

  1. SQL Server 2016では、並列挿入を ヒープCCI(クラスター化列ストアインデックス) 、および ローカル一時テーブルに取得するには、TABLOCKヒントが必要です 。多くの制限があり、その一部は文書化されていません。 IDENTITY列を含めることはできません。挿入はOUTPUTを介して行うことはできません。

参照 データ読み込みパフォーマンスガイド

17
Joe Obbish