SQL Server 2016 で INSERT..SELECT 操作を実行するとパフォーマンスが低下する

現象
Microsoft SQL Server 2016 は、次の条件でパフォーマンスが低下する可能性があります。 
  • 同時に複数の INSERT...SELECT 操作を一時テーブルに実行するとき。 
  • sys.dm_os_waiting_tasks にクエリを実行するとき。この場合、resource_description 列には、複数の要求に対する Page Free Space (PFS) ページの待機が示されます。
原因
INSERT...SELECT 操作の INSERT 並列処理は、SQL Server 2016 で導入されました。ローカル一時テーブル (## プレフィックスで識別されたグローバル一時テーブルではなく、# プレフィックスで識別された一時テーブルのみ) への INSERT が、非一時テーブルに必要な TABLOCK ヒントを指定しなくても、自動的に並列処理で有効になります。 

通常、INSERT 並列処理によりクエリ パフォーマンスが向上しますが、一時テーブルの同時実行 INSERT...SELECT 操作が多数ある場合、PFS ページに対する競合が重大になる可能性があります。場合によっては、これによりパフォーマンスが全体的に低下する可能性があります。
解決方法
この問題は、SQL Server 2016 Service Pack 1 で最初に修正されています。SQL Server 2016 SP1 を適用すると、ローカル一時テーブルに対する INSERT..SELECT の並列 INSERT は既定で無効になります。これにより、PFS ページの競合が削減され、同時実行ワークロードの全体的なパフォーマンスが向上します。ローカル一時テーブルへの並列 INSERT が必要な場合は、ローカル一時テーブルに挿入するときに TABLOCK ヒントを使用する必要があります。

「回避策」のセクションで説明されているトレース フラグ 9495 を有効にしている場合は、TABLOCK ヒントに関係なくトレース フラグ 9495 が並列挿入を無効にするため、SQL Server 2016 SP1 の適用後にトレース フラグを無効にして削除することをお勧めします。

累積的な更新プログラムの情報

この問題は、次の SQL Server 2016 用の累積的な更新プログラムで修正されました。SQL Server 用の累積的な更新プログラムについて
SQL Server の新しい累積的な更新プログラムには、以前の累積的な更新プログラムに含まれていたすべての修正プログラムおよびセキュリティ修正プログラムが含まれています。SQL Server の最新の累積的な更新プログラムを確認してください。

SQL Server 2016 の最新の累積的な更新プログラム


回避策
この問題を回避するには、次のうち 1 つまたは複数の方法を使用します。
  • トレース フラグ 9495 を有効にして、INSERT...SELECT 操作の挿入中に並列処理を無効にします。このトレース フラグは、INSERT...SELECT 操作の INSERT 部分に対してのみ並列処理を無効にし、一時テーブルとユーザー テーブルの両方に適用されます。このトレース フラグを有効にするには、起動時のパラメーター (-T9495) として使用するか、新しいセッションから DBCC TRACEON (9495, -1) を使用します。サーバーの起動時に毎回 DBCC TRACEON フラグを実行する必要がないように、実稼働配置には起動時のパラメーターを使用することをお勧めします。

    SQL Server 2016 の累積的な更新プログラム 1 (CU1) をインストールした場合、このトレース フラグを次の方法で使用することもできます。
    • セッション レベルで DBCC TRACEON (9495) を使用します。
    • ステートメントごとのレベルで OPTION QUERYTRACEON (9495) を使用します。
  • 一時テーブルにインデックスを作成します。「現象」セクションに記載されている問題は、一時テーブルのヒープでのみ発生します。
  • 問題のある INSERT...SELECT 操作については、MAXDOP 1 クエリ ヒントを使用してください。

関連情報 

トレース フラグを構成する方法の詳細については、次の SQL Server オンライン ブック トピックの「解説」を参照してください。


プロパティ

文書番号:3180087 - 最終更新日: 11/30/2016 17:11:00 - リビジョン: 4.0

Microsoft SQL Server 2016 Developer, Microsoft SQL Server 2016 Standard, Microsoft SQL Server 2016 Enterprise

  • KB3180087
フィードバック