Azure SQL Data Warehouse での統計の作成と更新
Microsoft Japan Data Platform Tech Sales Team
高木 英朗
Azure SQL Data Warehouse の概要について、以前の Blog で触れました。
また、先日の de:code 2016 のブレイクアウト セッション(DBP-009) で、アーキテクチャとパフォーマンスを意識した設計のポイントについても解説致しましたが、Azure SQL Data Warehouse でパフォーマンスを引き出すためのもう一つ大事なポイントが統計情報です。統計情報は、さまざまなクエリの実行方法のコストを評価して、クエリの実行プランを作成するための情報を提供します。 適切な統計が無い場合、Azure SQL Data Warehouse で実現される最適なパフォーマンスは得られません。 SQL Server とは異なり、 Azure SQL Data Warehouse では統計情報が自動的に作成されないため、手動での作成および更新が必要になります。
統計には以下の2種類があります。
(1) 単一列統計
- 1 つの列の値の範囲と出現頻度に関する情報を含むオブジェクトです。
- オプティマイザはこのヒストグラムを使用してクエリ結果の行数を推定し、クエリを最適化する方法に関する決定に直接影響します。
(2) 複数列統計
- 列のリストで作成される統計です。
- この統計には、リストの最初の列の単一列統計に加え、密度と呼ばれる列間の相関関係情報が含まれます。
- 複合結合やグループ化などの一部の操作では、複数列統計によってクエリのパフォーマンス向上が期待できます。
どの列に統計を作成するか
もっとも簡単な方法としては、すべての列にサンプリングされた統計を作成することです。しかしこの場合は、統計を更新するコストが高くなってしまう場合があります。その場合は統計を作成する列を限定することを検討しましょう。例えば新しい値が毎日追加されるような日付列だったり JOIN、GROUP BY、ORDER BY、DISTINCT 等に使われる列に統計を作成することを検討してください。
統計の作成方法
CREATE STATISTICS <統計名> ON <スキーマ>.<テーブル>(<カラム>)
- デフォルトは 20% のサンプリング、パーセンテージの変更、FULLSCAN 、Where 句を使ったフィルターも指定可能です。
- 大抵はデフォルトのサンプル統計で十分ですが、以下のようにサンプリングレートを調整することも可能です。<レート> にはパーセンテージの数値を指定します。
CREATE STATISTICS <統計名> ON <スキーマ>.<テーブル>(<カラム>) WITH SAMPLE = <レート> PERCENT;
- テーブル全体をサンプリングする場合は以下の構文を使用します。
CREATE STATISTICS <統計名> ON <スキーマ>.<テーブル>(<カラム>) WITH FULLSCAN;
統計の更新方法
UPDATE STATISTICS <スキーマ>.<テーブル>(<統計名>)
- 統計情報名を指定せず、テーブルの全ての統計を更新することも可能です。
- テーブルの全ての統計を更新する場合、統計情報毎にテーブルのスキャンをしてサンプリングするので、テーブルが大きく多数の列と統計が存在する場合には、個別に統計を更新した方が良い場合もあります。
データベース内のデータの分布が変わった際には統計を更新する必要があります。統計が最新でない場合、生成される実行プランが最適なプランではない可能性があります。そのため、特にデータのロードや大量更新・削除等が発生した後には統計情報を更新するジョブなどを、データウェアハウスの管理ルーチンに含めるようにしましょう。統計を管理する方法については今後の記事でお伝えする予定です。
統計は Azure SQL Data Warehouse のパフォーマンスを最大限に引き出すために運用の中で重要なポイントになりますので、ご活用いただければ幸いです。