Ask Learn
Preview
Please sign in to use this experience.
Sign inThis browser is no longer supported.
Upgrade to Microsoft Edge to take advantage of the latest features, security updates, and technical support.
Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
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 ヒントを付与するだけで、パフォーマンス向上が期待できるこの機能。ぜひお試し下さい。
Please sign in to use this experience.
Sign in