Share via


SQL Server 2016 新機能  INSERT…SELECT のパラレル処理

Microsoft Japan Data Platform Tech Sales Team

北澤

2016 年 6 月 1 日に出荷開始された SQL Server 2016

新機能の情報も色々な媒体で目にする事も多いと思います。

この記事では、数多くある新機能の中ではあまり目立たないのですが、バッチ処理のパフォーマンスを向上させる SQL Server 2016 の新機能「 INSERT…SELECT のパラレル処理」についてご紹介致します。

「 INSERT…SELECT 」は、 SELECT で検索したクエリ結果を指定したテーブルに INSERT する処理で、バッチ処理などで中間テーブルを生成したり、サマリーテーブルを生成する、という用途で良く使われる処理です。バッチ処理の中で時間がかかっている、と実感されている方も多いのではないでしょうか。

SQL Server 2014 までは、SELECT の部分はパラレル処理、 INSERT の部分はシリアル処理、という動作でしたので、コアを多く搭載したサーバーで、ストレージ に SSD 等を利用している様な環境において、SELECT の部分はコアを使いきれるが、INSERT の部分で コアを使いきれない、という状況になっていました。
SQL Server 2016 からは SELECT の部分も INSERT の部分もパラレル処理になりますので、コアをより有効活用する事ができ、大幅なパフォーマンス向上が見込めます。

実は SQL Server 2014 から 「 SELECT INTO 」( 新しいテーブルを生成し、そのテーブルに SELECT のクエリ結果を INSERT する処理) の INSERT 処理が、パラレル実行できる様になっていました。さらに SQL Server 2016 では 「 INSERT…SELECT 」の INSERT 処理も、パラレル実行できる様になりましたので、新規に生成されたテーブルに対しても、既存表に対してもパラレルで INSERT する事が可能になります。

構文的には INSERT…SELECT に TABLOCK ヒントを付ける必要があります。

  例) INSERT target_table WITH (TABLOCK) SELECT * FROM source_table.

 

パラレルで動作しているかどうかは実行計画で確認できます。

 

シリアルで INSERT している時の実行計画 image

 

image

 

 

パラレルで INSERT している時の実行計画 image image

 

並列度の変更

並列度は、クエリヒントを利用しない場合 max degree of parallelism ( MAXDOP ) サーバー構成オプションの値で決定されます。
SELECT 部分も INSERT 部分も同じ並列度になります。
MAXDOP の規定値は 0 で、その場合は使用可能な全てのプロセッサ (最大 64 プロセッサ) での並列度となり、クエリに MAXDOP クエリヒントを指定する事で MAXDOP 値を上書きできます。

  例) INSERT target_table WITH(TABLOCK) SELECT * FROM source_table OPTION (MAXDOP 2)

 

image

 

image

 

 

INSERT 先のテーブルとインデックスの組み合わせにより INSERT …SELECT でのパラレル INSERT の可否が決まりますのでご留意ください。

 

格納方式

INSERT 先のオブジェクト

INSERT…SELECT でのパラレル INSERT の可否

ディスクベース

ヒープ

OK

ヒープ + 非クラスタ化インデックス

NG

ヒープ + 非クラスタ化列ストアインデックス

NG

クラスター化インデックス

NG

クラスター化インデックス + 非クラスター化インデックス

NG

クラスター化インデックス + 非クラスター化列ストアインデックス

NG

クラスター化列ストアインデックス

OK

クラスター化列ストアインデックス + 非クラスター化インデックス

NG

メモリベース

メモリ最適化テーブル

NG

メモリ最適化テーブル + ハッシュインデックス

NG

メモリ最適化テーブル + 非クラスター化インデックス

NG

メモリ最適化テーブル + クラスター化列ストアインデックス

NG

 

 

下記の SQL Server Customer Advisory Team の blog に、パフォーマンステストの結果などの詳細な情報が掲載されています。ご興味のある方はご覧ください。

https://blogs.msdn.microsoft.com/sqlcat/2016/07/06/sqlsweet16-episode-3-parallel-insert-select/ https://blogs.msdn.microsoft.com/sqlcat/2016/07/21/real-world-parallel-insert-what-else-you-need-to-know/

 

SQL Server 2016 に アップグレードして、INSERT…SELECT に TABLOCK ヒントを付与するだけで、パフォーマンス向上が期待できるこの機能。ぜひお試し下さい。