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.
パラレルで動作しているかどうかは実行計画で確認できます。
並列度の変更
並列度は、クエリヒントを利用しない場合 max degree of parallelism ( MAXDOP ) サーバー構成オプションの値で決定されます。
SELECT 部分も INSERT 部分も同じ並列度になります。
MAXDOP の規定値は 0 で、その場合は使用可能な全てのプロセッサ (最大 64 プロセッサ) での並列度となり、クエリに MAXDOP クエリヒントを指定する事で MAXDOP 値を上書きできます。
例) INSERT target_table WITH(TABLOCK) SELECT * FROM source_table OPTION (MAXDOP 2)
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 ヒントを付与するだけで、パフォーマンス向上が期待できるこの機能。ぜひお試し下さい。