【トレースフラグ 2389】──昇順のキー列に対して統計情報範囲外の検索があった場合に、現在の最大値の統計情報を追加するSQL Serverトレースフラグレファレンス(35)

「Microsoft SQL Server」が稼働するデータベースシステムを運用する管理者に向け、「トレースフラグ」の活用を軸にしたトラブル対策のためのノウハウを紹介していきます。今回は「トレースフラグ2389の詳細と使い方」を解説します。

» 2018年07月27日 05時00分 公開
[椎名武史@IT]

SQL Serverトレースフラグレファレンス一覧

 本連載では、「Microsoft SQL Server(以下、SQL Server)」で発生するトラブル対策を踏まえた「SQL Serverのトレースフラグ」の使いこなしTipsを紹介していきます。

 今回は「トレースフラグ2389」の詳細と使い方を解説します。

 トレースフラグ2389は、昇順のキー列に対して統計情報範囲外の検索があった場合に、現在の最大値の統計情報を追加する設定です。SQL Server 2012 SP1以降に対応します。

 日々の売り上げなどのテーブルは、常に昇順でデータを挿入します。SQL Serverで条件を指定して検索する場合は、過去に作成された既存の統計情報を基に、出力される行数を予測し、最適と考えられる実行プランを作成します。

 しかし過去に作成された統計情報を使用した場合、検索対象のデータを統計内に含んでおらず、正しく行数を見積もれないまま、非効率な実行プランが作成される場合があります。

 トレースフラグ2389は、互換性レベル110以下の昇順のキー列に対して、現在の最大値を含めた統計情報を一時的に追加して、実行プランを作成します。既存の統計情報が含んでいない最新の値が使用されるため、効率的な実行プランが作成されやすくなります。

設定可能なスコープ

トレースフラグ2389
設定方法 可/不可 要/不要
スタートアップ
グローバルスコープ
セッションスコープ
クエリスコープ
トレースフラグ 3604/3605 不要

動作例

 SQL Serverが昇順のキー列と判断するためには、統計情報を更新した際にキー列が3回連続で増加している必要があります。つまり統計情報を4回更新し、初回に比べて2回目が、2回目に比べて3回目が、3回目に比べて4回目が増加しているデータだと、昇順のキー列だと判断できます。

 動作を確認するため、以下のようにDatetime2型の列に対してデータを挿入し、統計情報を4回更新しました。その後追加のデータを挿入しますが、統計情報は更新しません。

CREATE TABLE Table1 (Col1 DATETIME2)
GO
CREATE NONCLUSTERED INDEX Index1 ON Table1 (Col1)
GO
INSERT INTO Table1 VALUES ('2018-01-01')
GO 100
UPDATE STATISTICS Table1 WITH FULLSCAN
GO
INSERT INTO Table1 VALUES ('2018-01-02')
GO 100
UPDATE STATISTICS Table1 WITH FULLSCAN
GO
INSERT INTO Table1 VALUES ('2018-01-03')
GO 100
UPDATE STATISTICS Table1 WITH FULLSCAN
GO
INSERT INTO Table1 VALUES ('2018-01-04')
GO 100
UPDATE STATISTICS Table1 WITH FULLSCAN
GO
INSERT INTO Table1 VALUES ('2018-01-05')
GO 100

 この状態で1月5日のデータを検索しても、統計情報には1月4日までのデータしか含まれていないため、予測行数が1行の実行プランが作成されます(図1)。

図1 図1 統計情報範囲外のデータを検索しているため、予測行数が1となってしまった

 トレースフラグ2389が有効な場合は、統計情報範囲外のデータを検索しても現在の最大値を使用した統計情報を一時的に追加するため、より精度の高い予測行数を算出します。

図2 図2 統計情報範囲外のデータを検索しているが、トレースフラグ2389が有効なため、予測行数は100となった

 トレースフラグ2389を利用すると、クエリ実行時に追加の統計情報を作成するオーバーヘッドが加わったり、実行プランの差異により実行プランが変化したりする可能性がありますので、実装する際には検証環境で十分なテストが必要です。

 なお、互換性レベルが120以上の場合は予測行数のアルゴリズムが変更されて、行数予測の精度が向上しました。このときトレースフラグ2389を有効にしても動作は変わりません。

 ※本Tipsは、Windows Server 2012 R2上に「SQL Server 2016 SP1 CU3」をインストールした環境で解説しています。

筆者紹介

内ヶ島 暢之(うちがしま のぶゆき)

ユニアデックス株式会社 NUL System Services Corporation所属。Microsoft MVP for Data Platform(2011〜)。OracleやSQL Serverなど商用データベースの重大障害や大型案件の設計構築、プリセールス、社内外の教育、新技術評価を担当。2016年IoTビジネス開発の担当を経て、現在は米国シリコンバレーにて駐在員として活動中。目標は生きて日本に帰ること。

椎名 武史(しいな たけし)

ユニアデックス株式会社所属。Microsoft MVP for Data Platform(2017〜)。入社以来 SQL Serverの評価/設計/構築/教育などに携わりながらも、主にサポート業務に従事。SQL Serverのトラブル対応で社長賞の表彰を受けた経験も持つ。休日は学生時代の仲間と市民駅伝に参加し、銭湯で汗を流してから飲み会へと流れる。


Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。