...

Adaptive Server Enterprise

by user

on
Category: Documents
30

views

Report

Comments

Transcript

Adaptive Server Enterprise
パフォーマンス&チューニング・シリーズ:
クエリ処理と抽象プラン
Adaptive Server Enterprise
15.0.2
ド キ ュ メ ン ト ID : DC01079-01-1502-01
改訂 : 2008 年 11 月
Copyright © 2008 by Sybase, Inc. All rights reserved.
こ の マ ニ ュ ア ルは Sybase ソ フ ト ウ ェ ア の付属マ ニ ュ ア ルで あ り 、 新 し い エデ ィ シ ョ ン ま た はテ ク ニ カ ル ・ ノ ー ト で特に
示 さ れな い限 り 、 後続の リ リ ー ス に も 付属 し ま す。 こ の マ ニ ュ ア ルの内容は予告な し に変更 さ れ る こ と が あ り ま す。 こ の
マ ニ ュ ア ル に記載 さ れて い る ソ フ ト ウ ェ ア は ラ イ セ ン ス契約に基づい て提供 さ れ、 使用や複製は こ の契約に従 っ て行 う
場合に の み許可 さ れ ま す。
追加 ド キ ュ メ ン ト を 注文す る 場合は、 米国、 カ ナダの お客様は、 カ ス タ マ ・ フ ル フ ィ ル メ ン ト 事業部 ( 電話 800-685-8225、
フ ァ ッ ク ス 617-229-9845) ま で ご連絡 く だ さ い。
米国の ラ イ セ ン ス契約が適用 さ れ る そ の他の国の お客様は、 上記の フ ァ ッ ク ス番号で カ ス タ マ ・ フ ル フ ィ ル メ ン ト 事業部
ま で ご連絡 く だ さ い。 そ の他の海外の お客様は、 Sybase の関連会社 ま た は最寄 り の販売代理店に お問い合わせ く だ さ い。
ア ッ プグ レ ー ド は定期 ソ フ ト ウ ェ ア リ リ ー ス日に の み提供 さ れ ま す。 こ の マ ニ ュ ア ル の内容 を Sybase, Inc. の書面に よ る
事前の許可な く 複製、 転載、 翻訳す る こ と は、 電子的、 機械的、 手作業、 光学的、 そ の他、 形態や手段 を 問わず禁 じ ら れ
て い ま す。
Sybase の商標は Sybase trademarks ペー ジ (http://www.sybase.com/detail?id=1011207) で参照で き ま す。 Sybase お よ び表記 さ れて
い る 商標は、 Sybase, Inc の商標です。 ® は、 米国で登録 さ れて い る こ と を 示 し ま す。
Java お よ び Java 関連の商標は、 Sun Microsystems, Inc. の米国お よ びそ の他の国に お け る 商標ま た は登録商標です。
Unicode と Unicode の ロ ゴは Unicode, Inc. の登録商標です。
こ の マ ニ ュ ア ル に記載 さ れて い る そ の他の社名お よ び製品名は、 当該各社の商標 ま た は登録商標の場合が あ り ま す。
米国政府に よ る 使用、 複製、 開示に は、 国防総省の場合は DFARS 52.227-7013 の (c)(1)(ii)、 民間機関の場合は FAR 52.22719(a)-(d) の条項に定め ら れた制約が適用 さ れ ま す。
Sybase, Inc., One Sybase Drive, Dublin, CA 94568.
目次
はじめに.......................................................................................................................................... xi
第1章
クエリ処理の概要 .......................................... 1
クエリ・オプティマイザ.................................................................. 3
クエリの最適化で分析される要素 ............................................ 7
クエリ最適化のための変形 ....................................................... 8
探索引数と有用なインデックスの処理 ................................... 13
ジョインの処理 ....................................................................... 15
最適化目標 ..................................................................................... 18
クエリ最適化の時間の制限 ..................................................... 19
並列処理 ......................................................................................... 20
最適化の問題.................................................................................. 21
Lava クエリ実行エンジン .............................................................. 24
Lava クエリ・プラン .............................................................. 25
更新オペレーションの実行方法 ..................................................... 32
直接更新 .................................................................................. 32
遅延更新 .................................................................................. 35
インデックスの遅延挿入......................................................... 36
ジョインによる更新モードの制限 .......................................... 38
更新の最適化 ........................................................................... 40
更新をチューニングする場合の sp_sysmon の使用 ............... 42
第2章
showplan の使用 .........................................
クエリ・プランの表示 ...................................................................
Adaptive Server Enterprise 15.0 以降におけるクエリ・
プラン...............................................................................
noexec を指定した set showplan の使用 .......................................
文レベルの出力 ..............................................................................
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
43
43
44
45
50
iii
目次
クエリ・プランの形状 ................................................................... 54
クエリ・プラン演算子 ............................................................ 59
EMIT 演算子 ............................................................................ 59
SCAN 演算子........................................................................... 60
FROM cache メッセージ ........................................................ 60
FROM OR リスト.................................................................... 60
FROM TABLE ......................................................................... 62
union 演算子................................................................................. 101
UNION ALL 演算子................................................................ 101
MERGE UNION 演算子......................................................... 102
HASH UNION........................................................................ 103
SCALAR AGGREGATE 演算子 ............................................ 104
RESTRICT 演算子................................................................. 105
SORT 演算子......................................................................... 105
STORE 演算子 ...................................................................... 106
SEQUENCER 演算子............................................................ 109
REMOTE SCAN 演算子 ........................................................ 110
SCROLL 演算子 .................................................................... 111
RID JOIN 演算子 ................................................................... 112
SQLFILTER 演算子 ............................................................... 114
EXCHANGE 演算子 .............................................................. 116
instead of トリガ演算子 ............................................................... 118
instead of トリガ演算子 ........................................................ 119
CURSOR SCAN 演算子 ........................................................ 120
deferred_index メッセージと deferred_varcol メッセージ .... 122
第3章
クエリ最適化方式と見積もりの表示 .........................
テキスト形式メッセージ用の set コマンド .................................
XML 形式メッセージ用の set コマンド .......................................
show_execio_xml を使用したクエリ・プランの診断 ...........
使用シナリオ................................................................................
set コマンドのパーミッション ....................................................
123
123
124
127
129
132
第4章
長時間実行されているクエリの検出 .........................
トレース・ファイルへの診断の保存............................................
トレース・ファイルに診断情報を保存するオプションの
設定 ................................................................................
トレースしているセッションの確認.....................................
トレースの再バインド ..........................................................
SQL テキストの表示....................................................................
セッション設定の保持 .................................................................
133
133
iv
136
137
137
138
141
Adaptive Server Enterprise
目次
第5章
並列クエリ処理 ..........................................
垂直方向、水平方向、およびパイプライン並列処理 ..................
並列処理が役立つクエリ..............................................................
並列処理の有効化 ........................................................................
number of worker processes .................................................
max parallel degree...............................................................
max resource granularity.......................................................
max repartition degree ..........................................................
max scan parallel degree ......................................................
prod-consumer overlap factor ...............................................
min pages for parallel scan ...................................................
max query parallel degree.....................................................
セッション・レベルでの並行処理の制御 ....................................
set コマンドの例 ...................................................................
クエリの並列処理の制御..............................................................
クエリレベルの並列句の例 ...................................................
並列処理の選択的な使用..............................................................
多数のパーティションでの並列処理の使用 .................................
並列クエリの結果が異なる場合 ...................................................
set rowcount を使用するクエリ ............................................
ローカル変数を設定するクエリ ............................................
並列クエリ・プランの理解 ..........................................................
Adaptive Server の並列クエリ実行モデル ...................................
EXCHANGE 演算子 ..............................................................
SQL 演算での並列処理の使用...............................................
パーティション排除 ..............................................................
分割スキュー.........................................................................
クエリが並列で実行されない理由 ........................................
実行時調整 ............................................................................
実行時調整の識別と管理.......................................................
143
143
144
145
145
146
147
147
148
148
149
149
149
150
151
152
152
154
156
156
157
157
159
160
166
211
212
213
214
214
第6章
積極的集約と消極的集約 ..................................
概要 ..............................................................................................
積極的集約 ............................................................................
集約処理とクエリ処理 .................................................................
例..................................................................................................
積極的集約の使用 ........................................................................
積極的集約の有効化 ..............................................................
積極的集約のチェック ..........................................................
抽象プランによる積極的集約の強制.....................................
217
217
218
219
222
229
229
230
232
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
v
目次
第7章
最適化の制御 .............................................
特殊な最適化手法 ........................................................................
現在のオプティマイザ設定の表示 ...............................................
クエリ・プロセッサのオプションを指定する .............................
ジョインにテーブル順序を指定する............................................
クエリ・プロセッサが検討するテーブル数を指定する...............
クエリにインデックスを指定する ...............................................
クエリに I/O サイズを指定する ...................................................
インデックス・タイプと大容量 I/O サイズ ..........................
prefetch の指定が使用されない場合 .....................................
prefetch を設定する ..............................................................
キャッシュ方式を指定する ..........................................................
select 文、delete 文、および update 文 ...............................
大容量 I/O とキャッシュ方式の制御 ............................................
キャッシュ方式に関する情報の取得.....................................
非同期ログ・サービス .................................................................
マージ・ジョインを有効または無効にする ..........................
ハッシュ・ジョインを有効または無効にする ......................
ジョイン推移閉包の有効化と無効化.....................................
リテラルのパラメータ化の制御 ............................................
クエリの並列度の指定 ..........................................................
最適化目標 ............................................................................
最適化基準 ............................................................................
最適化時間の制限..................................................................
並列最適化の制御..................................................................
小さいテーブルの同時実行性の最適化 .................................
235
235
236
239
240
242
243
245
247
247
248
249
250
251
251
252
255
256
256
258
260
262
264
268
269
271
第8章
カーソルの最適化 .........................................
定義 ..............................................................................................
集合指向プログラミングとロー指向プログラミング............
例...........................................................................................
各ステージで必要とされるリソース............................................
メモリ使用と実行カーソル ...................................................
カーソル・モード ........................................................................
インデックス使用とカーソルの動作条件 ....................................
全ページロック・テーブル ...................................................
データオンリーロック・テーブル ........................................
カーソルがある場合とない場合のパフォーマンスの比較 ...........
カーソルがないストアド・プロシージャの例 ......................
カーソルがあるストアド・プロシージャの例 ......................
カーソルがある場合とない場合のパフォーマンスの比較 ....
読み込み専用カーソルを使ったロック ........................................
独立性レベルとカーソル..............................................................
分割されたヒープ・テーブルとカーソル ....................................
273
273
274
276
276
279
279
280
280
281
282
282
283
284
285
287
288
vi
Adaptive Server Enterprise
目次
カーソルを最適化するために ......................................................
カーソルを使ったカーソル select 文の最適化......................
or 句または in リストの代わりに union を使用.....................
カーソルの意図の宣言 ..........................................................
for update 句へのカラム名の指定 .........................................
set cursor rows の使用 ..........................................................
複数のコミットとロールバックにわたってカーソルを
オープンに保つ ..............................................................
1 つの接続で複数のカーソルをオープンする .......................
288
289
289
290
290
291
第9章
クエリ処理測定基準 ......................................
概要 ..............................................................................................
QP 測定基準の実行 ......................................................................
測定基準へのアクセス .................................................................
sysquerymetrics ビュー.........................................................
測定基準の使用 ............................................................................
例...........................................................................................
測定基準のクリア ........................................................................
クエリ測定基準の取得制限 ..........................................................
sysquerymetrics における UID の理解 .........................................
293
293
294
294
295
296
297
299
300
301
第 10 章
パフォーマンス改善のための統計値の使用 ..................
Adaptive Server で管理される統計値 ..........................................
統計値の重要性 ............................................................................
バイナリ以外の文字セットのヒストグラム補間...................
統計値の更新................................................................................
インデックス未設定カラムへの統計値の追加 ......................
プロキシ・テーブルとビューの統計値更新の制限 ...............
update statistics コマンド .....................................................
update statistics のサンプリングの使用................................
統計値の自動更新 ........................................................................
datachange 関数 ...................................................................
自動 update statistics の設定 .......................................................
Job Scheduler を使用した統計値の更新...............................
datachange を使用して統計値を更新する例 ........................
カラム統計値と統計値管理 ..........................................................
カラム統計値の作成と更新 ..........................................................
統計値の追加が有効な場合 ...................................................
update statistics を使用したカラムへの統計値の追加 ..........
update index statistics を使用したマイナー・カラムへの
統計値の追加 ..................................................................
update all statistics を使用した全カラムへの統計値の
追加 ................................................................................
303
304
304
305
306
307
307
308
310
311
312
315
315
318
319
320
322
324
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
292
292
324
325
vii
目次
ヒストグラムのステップ数の選択 ...............................................
ステップ数の選択..................................................................
update statistics 実行時のスキャン・タイプ、ソートの
稼働条件、ロック...........................................................
インデックス未設定カラムまたは非先行カラムの
ソート.............................................................................
update statistics 実行中のロック、スキャン、および
ソート.............................................................................
update all statistics 実行中のロック、スキャン、および
ソート.............................................................................
with consumers 句の使用 ......................................................
update statistics が同時処理に与える影響を小さくする
方法 ................................................................................
delete statistics コマンドの使用 ..................................................
ロー・カウントが不正確な場合...................................................
325
326
第 11 章
抽象プランの概要 .........................................
概要 ..............................................................................................
抽象プランの管理 ........................................................................
クエリ・テキストとクエリ・プランの関係.................................
クエリ・プランに影響するオプションの制約 ......................
完全なプランと部分プラン ..........................................................
部分プランの作成..................................................................
抽象プラン・グループ .................................................................
抽象プランのクエリへの関連づけ ...............................................
333
333
335
335
336
336
338
339
340
第 12 章
抽象プランの作成と使用 ...................................
set コマンドを使用したプランの取得と関連づけ .......................
set plan dump を使用したプラン取得モードの有効化..........
格納されているプランへのクエリの関連づけ ......................
プラン取得中の plan replace モードの使用 ..........................
plan dump、plan load、および plan replace モードの
同時使用 .........................................................................
コンパイル時の set パラメータの変更点 ..............................
set plan exists check オプション .................................................
抽象プランでの他の set オプションの使用 .................................
show_abstract_plan を使用したプランの表示......................
showplan の使用 ...................................................................
noexec の使用 .......................................................................
fmtonly の使用 .......................................................................
forceplan の使用....................................................................
サーバ全体での抽象プランの取得と関連づけモード ..................
341
341
342
343
344
viii
327
328
328
328
329
329
330
331
345
347
348
349
349
350
350
351
351
352
Adaptive Server Enterprise
目次
SQL によるプランの作成............................................................. 353
create plan の使用................................................................. 353
plan 句の使用 ........................................................................ 354
第 13 章
第 14 章
クエリの抽象プランのユーザーズ・ガイド ..................
概要 ..............................................................................................
抽象プラン言語 .....................................................................
テーブルの識別 .....................................................................
インデックスの識別 ..............................................................
ジョイン順の指定..................................................................
ジョイン型の指定..................................................................
部分プランとヒントの指定 ...................................................
サブクエリの抽象プランの作成 ............................................
実体化されたビューの抽象プラン ........................................
集合関数を含むクエリの抽象プラン.....................................
共用体を含むクエリの抽象プラン ........................................
クエリが順序付けを必要とする場合に抽象プランを
使用する .........................................................................
再フォーマット方式の指定 ...................................................
OR 方式を指定する...............................................................
store 演算子が指定されない場合 ..........................................
並列処理の抽象プラン ..........................................................
抽象プランを記述するためのヒント............................................
クエリ・レベルで抽象プランを使用する ....................................
抽象プランおよびオプティマイザ条件の演算子名の調整 ....
オプティマイザ条件設定の set 構文を拡張する ...................
プランの実行前後を比較する ......................................................
サーバワイドな取得モードの影響 ........................................
プランをコピーするための時間と領域 .................................
ストアド・プロシージャの抽象プラン ........................................
プロシージャとプランの所有者 ............................................
可変実行パスと最適化を使用するプロシージャ...................
アドホック・クエリと抽象プラン ...............................................
357
357
358
362
364
364
369
370
373
381
382
383
システム・プロシージャを使用した抽象プランの管理 ........
抽象プラン・グループの管理 ......................................................
グループの作成 .....................................................................
グループの削除 .....................................................................
グループについての情報の取得 ............................................
グループの名前の変更 ..........................................................
抽象プランの検索 ........................................................................
399
399
399
400
400
403
404
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
385
386
386
387
387
388
389
391
392
393
394
395
395
396
396
397
ix
目次
個々の抽象プランの管理..............................................................
プランの表示.........................................................................
別のグループへのプランのコピー ........................................
個々の抽象プランの削除.......................................................
2 つの抽象プランの比較 .......................................................
既存のプランの変更 ..............................................................
グループにあるすべてのプランの管理 ........................................
グループにあるすべてのプランのコピー..............................
グループにあるすべてのプランの比較 .................................
1 つのグループのすべての抽象プランの削除 .......................
プラン・グループのインポートとエクスポート..........................
プランのユーザ・テーブルへのエクスポート ......................
ユーザ・テーブルからのプランのインポート ......................
404
405
405
406
407
408
409
409
410
412
413
413
414
索引 ............................................................................................................................................. 415
x
Adaptive Server Enterprise
はじめに
対象読者
こ の マ ニ ュ ア ルは、 シ ス テ ム管理者 と デー タ ベ ー ス管理者 を 対象
と し て い ま す。
このマニュアルの内容
•
「第 1 章 ク エ リ 処理の概要」 - Adaptive Server Enterprise の ク エ
リ ・ プ ロ セ ッ サの概要に つ い て説明 し ま す。
•
「第 2 章 showplan の使用」 - showplan ユーテ ィ リ テ ィ に よ っ
て出力 さ れ る メ ッ セ ー ジ に つ い て説明 し ま す。
•
「第 3 章 ク エ リ 最適化方式 と 見積 も り の表示」 - ク エ リ 最適化
の た め の set コ マ ン ド に よ っ て出力 さ れ る メ ッ セ ー ジ に つ い
て説明 し ま す。
•
「第 4 章 長時間実行 さ れて い る ク エ リ の検出」 - 適切に実行 さ
れて い な い ク エ リ に関す る 診断情報 を 収集で き る
set show_sqltext、 set tracefile、 お よ び set export_options パ ラ メ ー
タ に つ い て説明 し ま す。
•
「第 5 章 並列 ク エ リ 処理」 - ク エ リ 実行の水平お よ び垂直並列
処理が Adaptive Server で ど の よ う に サポー ト さ れて い る か に
つ い て説明 し ま す。
•
「第 6 章 積極的集約 と 消極的集約」 - Adaptive Server の積極的
集約 と 消極的集約に つ い て説明 し ま す。
•
「第 7 章 最適化の制御」 - ク エ リ ・ プ ロ セ ッ サが選択す る ジ ョ
イ ン順、 イ ン デ ッ ク ス、 I/O サ イ ズ、 キ ャ ッ シ ュ 方式に影響
す る 、 ク エ リ 処理の オプ シ ョ ン に つ い て説明 し ま す。
•
「第 8 章 カ ー ソ ル の最適化」 - カ ー ソ ル に関連す る パ フ ォ ー マ
ン ス上の問題に つ い て説明 し ま す。
•
「第 9 章 ク エ リ 処理測定基準」 - ク エ リ 処理測定基準 と は何で
あ る か と 、 そ の役割お よ び使用方法に つ い て説明 し ま す。
•
「第 10 章 パ フ ォ ー マ ン ス改善の た め の統計値の使用」 - 統計
値 を 管理す る コ マ ン ド の使用方法に つ い て説明 し ま す。
•
「第 11 章 抽象プ ラ ン の概要」 - 抽象プ ラ ン の基本概念に つ い
て説明 し ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
xi
関連マニュアル
•
「第 12 章 抽象プ ラ ン の作成 と 使用」 - 抽象プ ラ ン を 取得 し 、 受け
取 っ た SQL ク エ リ を 保存 さ れて い る プ ラ ン と 関連づけ る た め の コ
マ ン ド に つ い て一般的な説明 を 行い ま す。
•
「第 13 章 ク エ リ の抽象プ ラ ン の ユーザーズ ・ ガ イ ド 」 - 抽象プ ラ
ン を 記述す る 場合のガ イ ド ラ イ ン を 示 し ま す。
•
「第 14 章 シ ス テ ム ・ プ ロ シ ー ジ ャ を 使用 し た抽象プ ラ ン の管理」
- 抽象プ ラ ン を 管理す る た め の シ ス テ ム ・ プ ロ シ ー ジ ャ の基本的
な機能 と 使い方に つ い て説明 し ま す。
Adaptive Server® Enterprise に は次の マ ニ ュ ア ルが用意 さ れて い ま す。
必要に応 じ て参照 し て く だ さ い。
•
使用 し て い る プ ラ ッ ト フ ォ ー ム の 『 リ リ ー ス ・ ノ ー ト 』 - マ ニ ュ
ア ル に は記載で き な か っ た最新の情報が記載 さ れて い ま す。
『 リ リ ー ス ・ ノ ー ト 』 の最新版 ( 英語版 ) に は イ ン タ ー ネ ッ ト か ら
ア ク セ ス で き ま す。 こ の製品の CD-ROM が リ リ ー ス さ れた後に
追加 さ れた重要な製品情報やマ ニ ュ ア ル情報 を 確認す る 場合は、
Sybase Technical Library を 参照 し て く だ さ い。
xii
•
使用 し て い る プ ラ ッ ト フ ォ ー ム の 『 イ ン ス ト ール ・ ガ イ ド 』 -
すべて の Adaptive Server お よ び関連す る Sybase 製品の イ ン ス ト ー
ル、 ア ッ プグ レ ー ド 、 設定の手順に つ い て説明 し て い ま す。
•
『Adaptive Server Enterprise の新機能』 - Adaptive Server バー ジ ョ ン
12.5 の新 し い機能に つ い て説明 し て い ま す。 ま た、 新 し い機能 を
サポー ト す る た め の シ ス テ ム変更や、 既存の ア プ リ ケ ー シ ョ ン に
影響す る 変更に つ い て も 説明 し て い ま す。
•
『ASE Replicator ユーザーズ ・ ガ イ ド 』 - プ ラ イ マ リ ・ サーバか ら
1 つ以上の リ モ ー ト Adaptive Server に対 し て基本的な複写 を 行 う
た め の Adaptive Server の Adaptive Server Replicator 機能の使用方法
に つ い て説明 し て い ま す。
•
『 コ ン ポー ネ ン ト 統合サー ビ ス ・ ユーザーズ ・ ガ イ ド 』 - リ モ ー
ト の Sybase デー タ ベ ー ス お よ び Sybase 以外のデー タ ベ ー ス へ接
続す る た め の Adaptive Server コ ン ポー ネ ン ト 統合サー ビ ス機能に
つ い て説明 し て い ま す。
•
使用 し て い る プ ラ ッ ト フ ォ ー ム の 『Adaptive Server Enterprise 設定
ガ イ ド 』 - Adaptive Server の特定の設定作業 を 行 う 方法に つ い て
説明 し て い ま す。
•
『Enhanced Full-Text Search Specialty Data Store ユーザーズ・ガ イ ド 』 -
Verity で全文検索機能 を 使用 し て Adaptive Server Enterprise のデー
タ を 検索す る 方法に つ い て説明 し て い ま す。
Adaptive Server Enterprise
はじめに
•
『用語解説』 - Adaptive Server マ ニ ュ ア ルで使用 さ れて い る 技術用
語に つ い て説明 し て い ま す。
•
『Historical Server ユーザーズ ・ ガ イ ド 』 - Historical Server を 使用
し て、 SQL Server® と Adaptive Server の パ フ ォ ー マ ン ス情報 を 取得
す る 方法に つ い て説明 し て い ま す。
•
『Adaptive Server Enterprise に お け る Java』 - Adaptive Server デー タ
ベー ス で Java ク ラ ス を デー タ 型、 関数、 ス ト ア ド ・ プ ロ シ ー ジ ャ
と し て イ ン ス ト ール し て使用す る 方法に つ い て説明 し て い ま す。
•
『Job Scheduler ユーザーズ ・ ガ イ ド 』 - コ マ ン ド ・ ラ イ ン ま た はグ
ラ フ ィ カ ル ・ ユーザ ・ イ ン タ フ ェ ー ス (GUI) を 使用 し て、 ロ ー カ
ル ま た は リ モ ー ト の Adaptive Server で ジ ョ ブ を イ ン ス ト ール し て
設定す る 方法、 お よ び作成 し て ス ケ ジ ュ ールす る 方法に つ い て説
明 し て い ま す。
•
『Messaging Services ユーザーズ ・ ガ イ ド 』 - Real Time Messaging
Services を 使用 し て、 TIBCO Java Message Service と IBM
WebSphere MQ Messaging Services を すべて の Adaptive Server
デー タ ベー ス ・ ア プ リ ケ ー シ ョ ン と 統合す る 方法に つ い て
説明 し て い ま す。
•
『Monitor Client Library プ ロ グ ラ マ ーズ・ガ イ ド 』 - Adaptive Server
の パ フ ォ ー マ ン ス ・ デー タ に ア ク セ ス す る Monitor Client Library
ア プ リ ケ ー シ ョ ン の記述方法に つ い て説明 し て い ま す。
•
『Monitor Server ユーザーズ ・ ガ イ ド 』 - Monitor Server を 使用 し
て、 SQL Server と Adaptive Server の パ フ ォ ー マ ン ス統計 を 取得す
る 方法に つ い て説明 し て い ま す。
•
『パ フ ォ ー マ ン ス & チ ュ ーニ ン グ ・ シ リ ーズ』 - Adaptive Server で
最高の パ フ ォ ー マ ン ス を 実現す る た め の チ ュ ーニ ン グ方法に つ い
て説明 し て い ま す。 こ の マ ニ ュ ア ルは以下の 7 冊に分かれて い
ま す。
•
『基本』 - Adaptive Server の パ フ ォ ー マ ン ス に対す る 質問の理
解 と 調査に関す る 基本事項に つ い て説明 し て い ま す。
•
『 ロ ッ ク と 同時実行制御』 - さ ま ざ ま な ロ ッ ク ・ ス キー ム を 使
用 し て Adaptive Server の パ フ ォ ー マ ン ス を 向上 さ せ る 方法 と 、
同時実行性 を 最小限に抑え る た め の イ ン デ ッ ク ス の選択方法
に つ い て説明 し て い ま す。
•
『 ク エ リ 処理 と 抽象プ ラ ン 』 - オプテ ィ マ イ ザが ク エ リ を 処理
す る 方法 と 抽象プ ラ ン を 使用 し て オプテ ィ マ イ ザの プ ラ ン の
一部 を 変更す る 方法に つ い て説明 し て い ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
xiii
xiv
•
『物理デー タ ベ ー ス の チ ュ ーニ ン グ』 - 物理的なデー タ 配置、
デー タ に割 り 付け ら れた領域、 お よ びテ ン ポ ラ リ ・ デー タ
ベー ス の管理方法に つ い て説明 し て い ま す。
•
『sp_sysmon に よ る Adaptive Server の監視』 - sp_sysmon を 使用
し て Adaptive Server の パ フ ォ ー マ ン ス を モ ニ タ リ ン グす る 方
法に つ い て説明 し て い ま す。
•
『統計的分析に よ る パ フ ォ ー マ ン ス の向上』 - Adaptive Server
に よ る 統計情報の保存お よ び表示の方法 と 、 set statistics コ マ
ン ド を 使用 し てサーバ の統計情報 を 分析す る 方法に つ い て説
明 し て い ま す。
•
『モ ニ タ リ ン グ ・ テーブルの使用』 - Adaptive Server の モ ニ タ
リ ン グ ・ テーブル に統計情報や診断情報 を 問い合わせ る 方法
に つ い て説明 し て い ま す。
•
『 ク イ ッ ク ・ リ フ ァ レ ン ス ・ ガ イ ド 』 - コ マ ン ド 、 関数、 シ ス テ
ム ・ プ ロ シ ー ジ ャ 、 拡張シ ス テ ム ・ プ ロ シ ー ジ ャ 、 デー タ 型、
ユーテ ィ リ テ ィ の名前 と 構文の包括的な一覧表 を 記載 し た ポ ケ ッ
ト 版 (PDF 版は通常サ イ ズ ) の マ ニ ュ ア ルです。
•
『 リ フ ァ レ ン ス ・ マ ニ ュ ア ル』 - 詳細な Transact-SQL 情報が記載
さ れて い ま す。 こ の マ ニ ュ ア ルは以下の 4 冊に分かれて い ま す。
•
『ビ ルデ ィ ン グ ・ ブ ロ ッ ク 』 - Transact-SQL のデー タ 型、 関
数、 グ ロ ーバル変数、 式、 識別子 と ワ イ ル ド カ ー ド 、 予約語
に つ い て説明 し て い ま す。
•
『 コ マ ン ド 』 - Transact-SQL の コ マ ン ド に つ い て説明 し て い
ま す。
•
『プ ロ シ ー ジ ャ 』 - Transact-SQL の シ ス テ ム ・ プ ロ シ ー ジ ャ 、
カ タ ロ グ ・ ス ト ア ド ・ プ ロ シ ー ジ ャ 、 シ ス テ ム拡張ス ト ア
ド ・ プ ロ シ ー ジ ャ 、 dbcc ス ト ア ド ・ プ ロ シ ー ジ ャ に つ い て
説明 し て い ま す。
•
『テーブル』 - Transact-SQL の シ ス テ ム ・ テーブル と dbcc テー
ブル に つ い て説明 し て い ま す。
Adaptive Server Enterprise
はじめに
•
『シ ス テ ム管理ガ イ ド 』 は 2 巻に分かれて い ま す。
•
『第 1 巻』 - パ ラ メ ー タ の設定、 リ ソ ー ス の問題、 文字
セ ッ ト 、 ソ ー ト 順、 お よ びシ ス テ ム問題の診断に つ い て の
説明な ど 、 シ ス テ ム管理の基本が記載 さ れて い ま す。 こ の マ
ニ ュ ア ルの第 2 部では、 セキ ュ リ テ ィ 管理に つ い て詳細に
説明 し て い ま す。
•
『第 2 巻』 - 物理 リ ソ ー ス の管理、 デバ イ ス の ミ ラ ー リ ン グ、
メ モ リ お よ びデー タ ・ キ ャ ッ シ ュ の設定、 マルチプ ロ セ ッ
サ ・ サーバお よ びユーザ ・ デー タ ベー ス の管理、 デー タ
ベー ス の マ ウ ン ト と マ ウ ン ト 解除、 セグ メ ン ト の作成 と 使用、
reorg コ マ ン ド の使用、 お よ びデー タ ベ ー ス の一貫性の検査の
手順 と ガ イ ド ラ イ ン が記載 さ れて い ま す。 こ の マ ニ ュ ア ルの
後半では、 シ ス テ ム お よ びユーザ ・ デー タ ベー ス の バ ッ ク
ア ッ プ方法 と 復元方法に つ い て説明 し て い ま す。
•
『シ ス テ ム ・ テーブル ・ ダ イ ヤグ ラ ム』 - シ ス テ ム ・ テーブル と 、
そ の エ ン テ ィ テ ィ の関係 を ポ ス タ ー形式で図解 し て い ま す。 フ
ル ・ サ イ ズ の ダ イ ヤグ ラ ム は印刷版だけ で参照で き ま す。 コ ン パ
ク ト 版は PDF 形式で参照で き ま す。
•
『Transact-SQL ユーザーズ ・ ガ イ ド 』 - リ レ ー シ ョ ナル ・ デー タ
ベー ス言語の Sybase 拡張版、 Transact-SQL を 文書化 し た も の で
す。 こ の マ ニ ュ ア ルでは、 デー タ ベー ス管理シ ス テ ム の操作に慣
れて い な い方の た め に、 テキ ス ト ブ ッ ク 形式で説明 し て い ま す。
ま た、 pubs2 と pubs3 サ ン プル ・ デー タ ベ ー ス に つ い て も 説明 し て
い ま す。
•
『 ト ラ ブル シ ュ ーテ ィ ン グ ・ シ リ ーズ』 ( リ リ ー ス 15.0) は以下の マ
ニ ュ ア ル に分かれて い ま す。
•
『 ト ラ ブル シ ュ ーテ ィ ン グ : エ ラ ー ・ メ ッ セ ー ジ と 詳細な解決
方法』 - Sybase® Adaptive Server® Enterprise の使用時に発生す
る 可能性が あ る 問題の ト ラ ブルシ ュ ーテ ィ ン グ手順が記載 さ
れて い ま す。 こ の マ ニ ュ ア ルで対処 し て い る 問題は、 Sybase
製品の保守契約 を 結ん で い る サポー ト ・ セ ン タ の ス タ ッ フ へ
の問い合わせが多い問題です。
•
『 ト ラ ブル シ ュ ーテ ィ ン グ & エ ラ ー ・ メ ッ セ ー ジ ・ ガ イ ド 』 -
頻繁に表示 さ れ る Adaptive Server エ ラ ー ・ メ ッ セ ー ジ の詳細
な解決手順が記載 さ れて い ま す。 こ の マ ニ ュ ア ル に記載 さ れ
て い る 大部分の メ ッ セ ー ジ に はエ ラ ー番号が付い て い ま す
(master..sysmessages テーブル よ り ) が、 一部の エ ラ ー ・ メ ッ
セ ー ジ に はエ ラ ー番号が付い て お ら ず、 Adaptive Server の エ
ラ ー ・ ロ グで の み発生 し ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
xv
xvi
•
『暗号化カ ラ ム の ユーザーズ ・ ガ イ ド 』 - Adaptive Server に よ る 暗
号化カ ラ ム の設定方法 と 使用方法に つ い て説明 し て い ま す。
•
『Adaptive Server 分散 ト ラ ン ザ ク シ ョ ン管理機能の使用』 - 分散 ト
ラ ン ザ ク シ ョ ン処理環境で の Adaptive Server DTM 機能の設定、 使
用、 ト ラ ブル シ ュ ーテ ィ ン グ に つ い て説明 し て い ま す。
•
『高可用性シ ス テ ム に お け る Sybase フ ェ ールオーバ の使用』 -
Sybase の フ ェ ールオ ーバ機能 を 使用 し て、 Adaptive Server を 高可
用性シ ス テ ム の コ ン パニオ ン ・ サーバ と し て設定す る 方法に つ い
て説明 し て い ま す。
•
『Unified Agent お よ び Agent Management Console』 - Unified Agent
に つ い て説明 し て い ま す。 Unified Agent は、 分散 Sybase リ ソ ー ス
を 管理、 モ ニ タ 、 制御す る た め の ラ ン タ イ ム ・ サー ビ ス を 提供 し
ま す。
•
『ユーテ ィ リ テ ィ ・ ガ イ ド 』 - オ ペ レ ーテ ィ ン グ ・ シ ス テ ム ・ レ
ベルで実行 さ れ る isql お よ び bcp な ど の、 Adaptive Server の ユー
テ ィ リ テ ィ ・ プ ロ グ ラ ム に つ い て説明 し て い ま す。
•
『Web Services ユーザーズ ・ ガ イ ド 』 - Adaptive Server 用の Web
Services の設定、 使用、 ト ラ ブルシ ュ ーテ ィ ン グ に つ い て説明 し
て い ま す。
•
『XA イ ン タ フ ェ ー ス統合ガ イ ド for CICS、 Encina、 TUXEDO』 -
X/Open XA ト ラ ンザ ク シ ョ ン ・ マ ネ ー ジ ャ を 備え た Sybase の
DTM XA イ ン タ フ ェ ー ス を 使用す る 方法に つ い て説明 し て い
ま す。
•
『Adaptive Server Enterprise に お け る XML サー ビ ス』 - デー タ ベ ー
ス に XML 機能 を 導入す る 、 Sybase ネ イ テ ィ ブ の XML プ ロ セ ッ サ
と Sybase Java ベ ー ス の XML の サポー ト に つ い て、 ま た XML サー
ビ ス に準拠 し た ク エ リ と マ ッ ピ ン グ用の関数に つ い て説明 し て い
ま す。
Adaptive Server Enterprise
はじめに
Sybase Getting Started CD、 SyBooks CD、 Sybase Product Manuals Web
サ イ ト を 利用す る と 、 製品に つ い て詳 し く 知 る こ と がで き ま す。
その他の情報
•
Getting Started CD に は、 PDF 形式の リ リ ー ス ・ ノ ー ト と イ ン ス
ト ール ・ ガ イ ド 、 SyBooks CD に含ま れて い な い そ の他の マ ニ ュ
ア ルや更新情報が収録 さ れて い ま す。 こ の CD は製品の ソ フ ト
ウ ェ ア に同梱 さ れて い ま す。 Getting Started CD に収録 さ れて い る
マ ニ ュ ア ル を 参照 ま た は印刷す る に は、 Adobe Acrobat Reader が必
要です (CD 内の リ ン ク を 使用 し て Adobe の Web サ イ ト か ら 無料で
ダ ウ ン ロ ー ド で き ま す )。
•
SyBooks CD に は製品マ ニ ュ ア ルが収録 さ れて い ま す。 こ の CD は
製品の ソ フ ト ウ ェ ア に同梱 さ れて い ま す。 Eclipse ベー ス の
SyBooks ブ ラ ウザ を 使用すれば、 使い やす い HTML 形式の マ ニ ュ
ア ル に ア ク セ ス で き ま す。
一部の マ ニ ュ ア ルは PDF 形式で提供 さ れて い ま す。 こ れ ら の マ
ニ ュ ア ルは SyBooks CD の PDF デ ィ レ ク ト リ に収録 さ れて い ま す。
PDF フ ァ イ ル を 開い た り 印刷 し た り す る に は、 Adobe Acrobat
Reader が必要です。
SyBooks の イ ン ス ト ール と 起動の方法に つ い ては、 Getting Started
CD の 『SyBooks Installation Guide』、 ま た は SyBooks CD の
README.txt フ ァ イ ル を 参照 し て く だ さ い。
•
Sybase Product Manuals Web サ イ ト は、 SyBooks CD の オ ン ラ イ ン版
で あ り 、 標準の Web ブ ラ ウザ を 使 っ て ア ク セ ス で き ま す。 ま た、
製品マ ニ ュ ア ルの ほ か、 EBFs/Maintenance、 Technical Documents、
Case Management、 Solved Cases、 ニ ュ ー ス グループ、 Sybase
Developer Network へ の リ ン ク も あ り ま す。
Sybase Product Manuals Web サ イ ト に ア ク セ ス す る に は、 Product
Manuals (http://www.sybase.com/support/manuals/) に ア ク セ ス し て く だ
さ い。
Sybase Web サ イ ト の技術的な資料は頻繁に更新 さ れ ま す。
Web 上の Sybase
製品の動作確認情報
❖
製品動作確認の最新情報にアクセスする
1
Web ブ ラ ウザで Technical Documents
(http://www.sybase.com/support/techdocs/) を 指定 し ま す。
2
[Certification Report] を ク リ ッ ク し ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
xvii
❖
❖
3
[Certification Report] フ ィ ル タ を 選択 し 、 製品、 プ ラ ッ ト フ ォ ー ム、
時間枠 を 指定 し て [Go] を ク リ ッ ク し ま す。
4
[Certification Report] の タ イ ト ル を ク リ ッ ク し て、 レ ポー ト を 表示
し ま す。
コンポーネント動作確認の最新情報にアクセスする
1
Web ブラ ウザで Availability and Certification Reports
(http://certification.sybase.com/) を 指定 し ま す。
2
[Search by Base Product] で製品 フ ァ ミ リ と 製品 を 選択す る か、
[Search by Platform] でプ ラ ッ ト フ ォ ー ム と 製品 を 選択 し ま す。
3
[Search] を ク リ ッ ク し て、 入手状況 と 動作確認 レ ポー ト を 表示 し
ま す。
Sybase Web サイト ( サポート・ページを含む ) の自分専用のビューを作成
する
MySybase プ ロ フ ァ イ ル を 設定 し ま す。 MySybase は無料サー ビ ス で
す。 こ の サー ビ ス を 使用す る と 、 Sybase Web ペ ー ジ の表示方法 を 自分
専用に カ ス タ マ イ ズで き ま す。
1
Web ブ ラ ウザで Technical Documents
(http://www.sybase.com/support/techdocs/) を 指定 し ま す。
2
[MySybase] を ク リ ッ ク し 、 MySybase プ ロ フ ァ イ ル を 作成 し ま す。
Sybase EBF とソフ
トウェア・メンテ
ナンス
❖
xviii
EBF とソフトウェア・メンテナンスの最新情報にアクセスする
1
Web ブ ラ ウザで Sybase Support Page (http://www.sybase.com/support)
を 指定 し ま す。
2
[EBFs/Maintenance] を 選択 し ま す。 MySybase の ユーザ名 と パ ス
ワ ー ド を 入力 し ま す。
3
製品 を 選択 し ま す。
Adaptive Server Enterprise
はじめに
4
時間枠 を 指定 し て [Go] を ク リ ッ ク し ま す。 EBF/Maintenance リ
リ ー ス の一覧が表示 さ れ ま す。
鍵の ア イ コ ン は、 「Technical Support Contact」 と し て登録 さ れて い
な い た め、 一部の EBF/Maintenance リ リ ー ス を ダ ウ ン ロ ー ド す る
権限がな い こ と を 示 し て い ま す。 未登録では あ る が、 Sybase 担当
者ま た はサポー ト ・ コ ン タ ク ト か ら 有効な情報 を 得て い る 場合
は、 [Edit Roles] を ク リ ッ ク し て、 「Technical Support Contact」 の役
割 を MySybase プ ロ フ ァ イ ル に追加 し ま す。
5
表記規則
EBF/Maintenance レ ポー ト を 表示す る に は [Info] ア イ コ ン を ク リ ッ
ク し ま す。 ソ フ ト ウ ェ ア を ダ ウ ン ロ ー ド す る に は製品の説明 を ク
リ ッ ク し ま す。
こ の項では、 こ の マ ニ ュ ア ルで使用 さ れて い る 表記規則に つ い て説明
し ま す。
SQL は自由な形式の言語です。 1 行内の ワ ー ド 数や、 改行の仕方に規
則は あ り ま せん。 こ の マ ニ ュ ア ルでは、 読みやす く す る た め、 例や構
文 を 文の句ご と に改行 し て い ま す。 複数の部分か ら な り 、 2 行以上に
わ た る 場合は、 字下げ し て い ま す。 複雑な コ マ ン ド の書式に は、 修正
さ れた BNF (Backus Naur Form) 記法が使用 さ れて い ま す。
表 1 は、 こ の マ ニ ュ ア ルで の構文の規則 を 示 し ま す。
表 1: このマニュアルでのフォントと構文規則
要素
コ マ ン ド 名、 プ ロ シ ー ジ ャ 名、 ユーテ ィ リ テ ィ
名、 そ の他の キー ワ ー ド は sans serif フ ォ ン ト で
表記す る 。
デー タ ベー ス名 と デー タ型は sans serif フ ォ ン ト
で表記す る 。
フ ァ イ ル名、 変数、 パ ス名は斜体で表記す る 。
例
select
sp_configure
master デー タ ベー ス
sql.ini フ ァ イ ル
column_name
$SYBASE/ASE デ ィ レ ク ト リ
変数 ( ユーザが入力す る 値 を表す語 ) が ク エ リ ま
たは文の一部で あ る 場合は Courier フ ォ ン ト の斜
体で表記す る 。
select column_name
from table_name
where search_conditions
カ ッ コ は コ マ ン ド の一部 と し て入力す る 。
2 つ の コ ロ ン と 等号は、 構文が BNF 表記で記述
さ れて い る こ と を示す。 こ の記号は入力 し な い。
「~ と 定義 さ れて い る 」 こ と を意味す る 。
中カ ッ コ は、 そ の中の オプ シ ョ ン を 1 つ以上選択
し な ければな ら な い こ と を意味す る 。 コ マ ン ド
に は中カ ッ コ は入力 し な い。
compute row_aggregate (column_name)
::=
{cash, check, credit}
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
xix
要素
角カ ッ コ は、 オプ シ ョ ン を選択 し て も 省略 し て
も よ い こ と を意味す る 。 コ マ ン ド に は角カ ッ コ
は入力 し な い。
大カ ッ コ ま たは角カ ッ コ の中の カ ン マで区切 ら
れた オプ シ ョ ン を い く つ で も 選択で き る こ と を
意味す る 。 複数の オプ シ ョ ン を選択す る 場合
に は、 オプ シ ョ ン を カ ン マで区切 る 。
パ イ プ ま たは縦線は複数の オプ シ ョ ン の う ち 1
つだけ を選択で き る こ と を意味す る 。
省略記号 (...) は、 直前の要素 を必要な回数だけ繰
り 返 し 指定で き る こ と を意味す る 。
例
[cash | check | credit]
cash, check, credit
cash | check | credit
buy thing = price [cash | check | credit]
[, thing = price [cash | check | credit] ]...
こ の 例 で は、 製品 (thing) を 少 な く と も 1 つ 購入
(buy) し 、 価格 (price) を指定す る 必要が あ る 。 支払
方法を角カ ッ コ の中か ら 1 つ選択で き る 。 追加品目
を、 必要な数だけ購入す る こ と も で き る 。 各 buy に
対 し て、 購入 し た 製品 (thing)、 価格 (price)、 オ プ
シ ョ ン で支払方法 (cash、 check、 credit の いずれか )
を指定す る 。
•
次は、 オプ シ ョ ン句の あ る コ マ ン ド の構文の例です。
sp_dropdevice [device_name]
複数の オプ シ ョ ン を 持つ コ マ ン ド の例 を 示 し ま す。
select column_name
from table_name
where search_conditions
構文では、 キー ワ ー ド ( コ マ ン ド ) は通常の フ ォ ン ト で表記 し 、
識別子は小文字で表記 し ま す。 ユーザが提供す る ワ ー ド は斜体で
表記 し ま す。
xx
Adaptive Server Enterprise
はじめに
•
Transact-SQL コ マ ン ド の使用例は次の よ う に表記 し ま す。
select * from publishers
•
pub_id
------0736
0877
1389
コ ン ピ ュ ー タ か ら の出力例は次の と お り です。
pub_name
--------------------New Age Books
Binnet & Hardley
Algodata Infosystems
city
----------Boston
Washington
Berkeley
state
----MA
DC
CA
(3 rows affected)
こ の マ ニ ュ ア ルでは、 例に使用す る 文字は ほ と ん ど が小文字ですが、
Transact-SQL の キー ワ ー ド を 入力す る と き は、 大文字 と 小文字は区別
さ れ ま せん。 た と えば、 SELECT、 Select、 select はすべて同 じ です。
テーブル名な ど のデー タ ベ ー ス ・ オブ ジ ェ ク ト の大文字 と 小文字 を
Adaptive Server が区別す る か ど う かは、 Adaptive Server に イ ン ス ト ー
ル さ れた ソ ー ト 順に よ っ て決ま り ま す。 シ ン グル ・ バ イ ト 文字セ ッ ト
を 使用 し て い る 場合は、 Adaptive Server の ソ ー ト 順 を 再設定す る こ と
に よ っ て、 大文字 と 小文字の区別の取 り 扱い方 を 変更で き ま す。 詳細
に つ い ては、 『シ ス テ ム管理ガ イ ド 』 を 参照 し て く だ さ い。
アクセシビリティ機能
こ の マ ニ ュ ア ル に は、 ア ク セ シ ビ リ テ ィ を 重視 し た HTML 版 も あ り
ま す。 こ の HTML 版マ ニ ュ ア ルは、 ス ク リ ー ン ・ リ ーダーで読み上
げ る 、 ま た は画面 を 拡大表示す る な ど の方法に よ り 、 そ の内容 を 理解
で き る よ う 配慮 さ れて い ま す。
Adaptive Server と HTML マ ニ ュ ア ルは、 連邦 リ ハ ビ リ テー シ ョ ン法第
508 条の ア ク セ シ ビ リ テ ィ 規定に準拠 し て い る こ と がテ ス ト に よ り 確
認 さ れて い ま す。 第 508 条に準拠 し て い る マ ニ ュ ア ルは通常、 World
Wide Web Consortium (W3C) の Web サ イ ト 用ガ イ ド ラ イ ン な ど 、 米国
以外の ア ク セ シ ビ リ テ ィ ・ ガ イ ド ラ イ ン に も 準拠 し て い ま す。
注意 ア ク セ シ ビ リ テ ィ ・ ツ ール を 効率的に使用す る に は、 設定が必
要な場合 も あ り ま す。 一部の ス ク リ ー ン ・ リ ーダーは、 テキ ス ト の大
文字 と 小文字 を 区別 し て発音 し ま す。 た と えば、 すべて大文字の テキ
ス ト (ALL UPPERCASE TEXT な ど ) は イ ニ シ ャ ルで発音 し 、 大文字 と
小文字の混在 し た テキ ス ト (Mixed Case Text な ど ) は単語 と し て発音
し ま す。 構文規則 を 発音す る よ う に ツ ール を 設定す る と 便利か も し れ
ま せん。 詳細に つ い ては、 ツ ール の マ ニ ュ ア ル を 参照 し て く だ さ い。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
xxi
Sybase の ア ク セ シ ビ リ テ ィ に対す る 取 り 組み に つ い ては、
Sybase Accessibility (http://www.sybase.com/accessibility) を 参照 し て く だ
さ い。 Sybase Accessibility サ イ ト に は、 第 508 条 と W3C 標準に関す
る 情報へ の リ ン ク も あ り ま す。
不明な点があるときは
xxii
Sybase ソ フ ト ウ ェ ア の イ ン ス ト ール環境ご と に、 Sybase 製品の保守
契約 を 結ん で い る サポー ト ・ セ ン タ と の連絡担当者が い ま す。 マ
ニ ュ ア ルやオ ン ラ イ ン ・ ヘルプで解決で き な い問題が あ る 場合は、
こ の担当者 を 通 し て最寄 り の Sybase の サポー ト ・ セ ン タ ま で ご連絡
く だ さ い。
Adaptive Server Enterprise
第
1
章
クエリ処理の概要
こ の章では、 Adaptive Server Enterprise の ク エ リ ・ プ ロ セ ッ サの概
要に つ い て説明 し ま す。
トピック
ク エ リ ・ オプテ ィ マ イ ザ
最適化目標
並列処理
最適化の問題
Lava ク エ リ 実行エ ン ジ ン
ページ
3
18
20
21
24
ク エ リ ・ プ ロ セ ッ サでは、 ユーザが指定 し た ク エ リ が処理 さ れ
ま す。 こ の プ ロ セ ッ サ に よ り 、 最小限の リ ソ ー ス で実行で き る 非
常に効率的な ク エ リ ・ プ ラ ン が生成 さ れ、 一貫性の あ る 正確な結
果が得 ら れ ま す。
ク エ リ を 効率的に処理す る た め に、 ク エ リ ・ プ ロ セ ッ サでは次の
も の が使用 さ れ ま す。
•
指定 さ れた ク エ リ
•
ク エ リ で指定 さ れて い る テーブル、 イ ン デ ッ ク ス、 お よ び カ
ラ ム に関す る 統計値
•
設定可能な変数
ク エ リ ・ プ ロ セ ッ サでは、 ク エ リ を 適切に処理す る た め に、 次の
よ う な複数の モ ジ ュ ール を 使用 し て複数の ス テ ッ プ を 実行す る 必
要が あ り ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
1
図 1-1: クエリ・プロセッサのモジュール
1: パーサ
2: 正規化
3: プ リ プ ロ セ ッ サ
4: オプテ ィ マ イ ザ
5: コ ー ド ・ジ ェ ネ レ ー タ
6: 手続き型実行エ ン ジ ン
2
6: ク エ リ 実行
エンジン
1
パーサは、 SQL 文の テキ ス ト を ク エ リ ・ ツ リ ー と 呼ばれ る 内部表
現に変換 し ま す。
2
こ の ク エ リ ・ ツ リ ー を 正規化 し ま す。 こ の処理では、 カ ラ ム名 と
テーブル名の決定、 ク エ リ ・ ツ リ ー の CNF ( 結合正規形 ) へ の変
形、 お よ びデー タ 型の解決が行われ ま す。 こ の時点で、 こ の SQL
文で ス テー ト メ ン ト ・ キ ャ ッ シ ュ を 利用す る か ど う か を 決定で き
ま す。
3
プ リ プ ロ セ ッ サは、 サブ ク エ リ や ビ ュ ー を 持つ SQL 文な ど 、 一部
の タ イ プ の SQL 文の ク エ リ ・ ツ リ ー を 、 よ り 効率的な ク エ リ ・ ツ
リ ー に変形 し ま す。
4
オプテ ィ マ イ ザは、 SQL 文 を 実行す る た め の可能な オ ペ レ ー シ ョ
ン の組み合わせ ( ジ ョ イ ン順、 ア ク セ ス ・ メ ソ ッ ド と ジ ョ イ ン ・
メ ソ ッ ド 、 並列度 ) を 分析 し 、 選択可能な組み合わせ の コ ス ト 見
積 も り に基づ い て効率的な も の を 選択 し ま す。
5
コ ー ド ・ ジ ェ ネ レ ー タ は、 オプテ ィ マ イ ザに よ っ て生成 さ れた ク
エ リ ・ プ ラ ン を 、 ク エ リ 実行エ ン ジ ン に適 し た フ ォ ー マ ッ ト に変
換 し ま す。
Adaptive Server Enterprise
第1章
6
クエリ処理の概要
プ ロ シ ー ジ ャ ・ エ ン ジ ン は、 create table, execute procedure, declare
cursor な ど の コ マ ン ド 文 を 直接実行 し ま す。 select, insert, delete,
update な ど のデー タ 操作言語 (DML) 文の場合、 こ の エ ン ジ ン はす
べて の ク エ リ ・ プ ラ ン に対 し て実行環境 を 設定 し 、 ク エ リ 実行エ
ン ジ ン を 呼び出 し ま す。
7
ク エ リ 実行エ ン ジ ン は、 コ ー ド ・ ジ ェ ネ レ ー タ か ら 提供 さ れた ク
エ リ ・ プ ラ ン で指定 さ れて い る 一連の ス テ ッ プ を 実行 し ま す。
クエリ・オプティマイザ
ク エ リ ・ オプテ ィ マ イ ザに よ り 、 OLTP ( オ ン ラ イ ン ・ ト ラ ンザ ク
シ ョ ン処理 ) 環境 と 運用に関す る DSS ( 意思決定支援シ ス テ ム ) 環境
の速度 と 効率が向上 し ま す。 ク エ リ 環境に最 も 適 し た最適化方式 を 選
択で き ま す。
ク エ リ ・ オプテ ィ マ イ ザはセル フ チ ュ ーニ ン グで あ り 、 バー ジ ョ ン
15.0 よ り 前の Adaptive Server Enterprise に比べて必要な介入が少な く
な っ て い ま す。 オペ レ ー シ ョ ン ・ ス テ ッ プ間の マ テ リ ア ラ イ ズ に ワ ー
ク テーブル を 使用す る こ と は ほ と ん ど あ り ま せん が、 ハ ッ シ ュ ・ オ ペ
レ ー シ ョ ン と マ ー ジ ・ オ ペ レ ー シ ョ ン の ほ う が効果的だ と 判断 し た場
合は、 ク エ リ ・ オプテ ィ マ イ ザで よ り 多 く の ワ ー ク テーブル を 使用す
る こ と も あ り ま す。
リ リ ー ス 15.0 の ク エ リ ・ オプテ ィ マ イ ザの主要機能の一部に は、 次の
サポー ト が含ま れて い ま す。
•
新 し い最適化方法 と ク エ リ 実行オ ペ レ ー タ の サポー ト 。 こ れ に よ
り 、 次の よ う な ク エ リ ・ パ フ ォ ー マ ン ス が向上 し ま す。
•
オ ン ザ フ ラ イ の グループ化オペ レ ー タ お よ び順序オ ペ レ ー タ
のサポー ト 。 group by お よ び order by 句 を 持つ ク エ リ に対 し て
メ モ リ 内 ソ ー ト お よ びハ ッ シ ュ を 使用 し ま す。
•
ジ ョ イ ン ・ オ ペ レ ー シ ョ ン を 効率的に行 う た め の ハ ッ シ ュ お
よ びマ ー ジ ・ ジ ョ イ ン ・ オ ペ レ ー タ の サポー ト 。
•
さ ま ざ ま な イ ン デ ッ ク ス に述部 を 持つ ク エ リ に対す る index
union お よ び index intersection 方式。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
3
クエリ・オプティマイザ
表 1-1 (5 ペ ー ジ ) は、 Adaptive Server Enterprise でサポー ト さ れて
い る 最適化方法お よ び最適化オ ペ レ ー タ の リ ス ト です。 こ れ ら の
方法の多 く は、 ク エ リ 実行でサポー ト さ れて い る オ ペ レ ー タ に直
接対応 し て い ま す。 詳細に つ い ては、 「Lava ク エ リ ・ プ ラ ン 」 (25
ペー ジ ) を 参照 し て く だ さ い。
4
•
イ ン デ ッ ク ス選択機能の向上。 特に or 句 を 使用す る ジ ョ イ ン と 、
一致 し な い が互換性の あ る デー タ 型 と 共に and 探索引数 (SARG)
を 使用す る ジ ョ イ ン の場合。
•
コ ス ト 計算機能の向上。 カ ラ ム の ジ ョ イ ン時にデー タ の偏 り が原
因で生 じ る 可能性の あ る 不正確 さ を 防ぐ た め に、 join histograms を
使用 し ま す。
•
ジ ョ イ ン の順序付け に使用す る 新 し い コ ス ト ベ ー ス の排除お よ び
タ イ ム ア ウ ト ・ メ カ ニズ ム と 、 大規模な多方向ジ ョ イ ン お よ び ス
タ ー ・ ス キー マ と ス ノ ー フ レ ー ク ・ ス キー マ ・ ジ ョ イ ン に使用す
る プ ラ ン方式。
•
デー タ お よ び イ ン デ ッ ク ス の パーテ ィ シ ョ ン分割 ( 並列処理の た
め の ビ ルデ ィ ン グ ・ ブ ロ ッ ク ) を サポー ト す る 新 し い最適化方法。
非常に大き なデー タ ・ セ ッ ト に特に有効です。
•
垂直お よ び水平並列処理に使用す る ク エ リ 最適化方法の向上。
詳細に つ い ては、 「第 5 章 並列 ク エ リ 処理」 を 参照 し て く だ さ い。
•
次の処理に よ る 問題の診断お よ び解決の向上。
•
検索可能な XML フ ォ ー マ ッ ト の ト レ ー ス出力。
•
新 し い set コ マ ン ド に よ る 詳細な診断出力。 「第 3 章 ク エ リ 最
適化方式 と 見積 も り の表示」 を 参照 し て く だ さ い。
Adaptive Server Enterprise
第1章
クエリ処理の概要
表 1-1: 最適化オペレータのサポート
オペレータ
hash join
hash union distinct
merge join
merge union all
merge union distinct
nested-loop-join
append union all
説明
ク エ リ ・ オ プテ ィ マ イ ザで ハ ッ シ ュ ・ ジ ョ イ ン ・
ア ル ゴ リ ズ ム を 使用で き る か ど う か を 決定 し ま
す。 ハ ッ シ ュ ・ ジ ョ イ ン は、 実行時の リ ソ ー ス消
費量が多い ですが、 ジ ョ イ ン ・ カ ラ ム に有効な イ
ン デ ッ ク ス がな い場合や、 ジ ョ イ ン ・ テーブル内
の ロ ー数の積に比べて、 比較的多 く の ロ ーが ジ ョ
イ ン条件を 満た し て い る 場合に役立 ち ま す。
ク エ リ ・ オプテ ィ マ イ ザで hash union distinct ア ル
ゴ リ ズム を使用で き る か ど う か を決定 し ま す。 こ
の ア ルゴ リ ズ ム は、 ほ と ん ど の ロ ーが異な る 場合
は非効率です。
ク エ リ ・ オプテ ィ マ イ ザで マ ー ジ ・ ジ ョ イ ン ・ ア
ルゴ リ ズ ム を 使用で き る か ど う か を 決定 し ま す。
こ の ア ルゴ リ ズ ム は、 順序付け ら れた入力に依存
し ま す。 マ ー ジ ・ ジ ョ イ ン は、 入力がマ ー ジ ・ キー
( イ ン デ ッ ク ス ・ ス キ ャ ン な ど か ら ) に基づ い て順
序付け ら れて い る 場合に最 も 有効です。 入力の順
序付け に ソ ー ト ・ オペ レ ー タ が必要な場合、 マ ー
ジ ・ ジ ョ イ ン は あ ま り 有効で あ り ま せん。
ク エ リ ・オプテ ィ マ イ ザで union all に対 し て merge
ア ル ゴ リ ズ ム を 使用で き る か ど う か を 決定 し ま
す。 merge union all で は、 共用体入力 か ら の 結果
ロ ー の 順序付 け が 維持 さ れ ま す。 merge union all
は、 入力が順序付け ら れて お り 、 そ の順序付け に
よ る メ リ ッ ト が親オペ レ ー タ ( マ ー ジ ・ ジ ョ イ ン
な ど ) に あ る 場合に特に有効です。 それ以外の場
合、 merge union all に は、 効率の低い ソ ー ト ・ オペ
レ ー タ が必要に な る 場合が あ り ま す。
ク エ リ ・ オプテ ィ マ イ ザで union に対 し て merge
ア ルゴ リ ズム を 使用で き る か ど う か を 決定 し ま
す。 merge union distinct は、 重複す る ロ ーが保持 さ
れな い点を 除い て、 merge union all に似て い ま す。
merge union distinct は順序付け ら れた入力を必要 と
し 、 順序付け ら れた出力を 提供 し ま す。
ネ ス ト ループ ・ ジ ョ イ ン ・ ア ルゴ リ ズ ム は、 ジ ョ
イ ン ・ メ ソ ッ ド の最 も 一般的な タ イ プで あ り 、 順
序付け を必要 と し な い単純な OLTP ク エ リ で最 も
有効です。
ク エ リ ・ オプテ ィ マ イ ザで union all に対 し て
append ア ルゴ リ ズム を 使用で き る か ど う か を 決
定 し ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
5
クエリ・オプティマイザ
オペレータ
distinct hashing
distinct sorted
group-sorted
distinct sorting
group hashing
方法
multi table store ind
opportunistic distinct view
index intersection
6
説明
ク エ リ ・ オプテ ィ マ イ ザでハ ッ シ ュ ・ ア ルゴ リ ズ
ム を使用 し て重複を削除で き る か ど う か を決定 し
ま す。 こ れは、 ロ ー の数 と 比較 し て、 個別の値が
ほ と ん ど な い場合に非常に効率的です。
ク エ リ ・ オプテ ィ マ イ ザで シ ン グルパ ス ・ ア ルゴ
リ ズム を使用 し て重複を削除で き る か ど う か を決
定 し ま す。 distinct sorted は、 順序付け ら れた入力
ス ト リ ー ム に依存 し ま す。 入力が順序付け ら れて
い な い場合は、 sort オペ レ ー タ の数が増加す る 可
能性が あ り ま す。
ク エ リ ・ オプテ ィ マ イ ザでオ ンザ フ ラ イ の グルー
プ化アルゴ リ ズム を使用で き る か ど う か を決定 し
ま す。 group-sorted は、 グループ化カ ラ ム で ソ ー
ト さ れた入力ス ト リ ー ム に依存 し ま す。 そ の出力
では、 こ の順序付けが維持 さ れ ま す。
ク エ リ ・ オプテ ィ マ イ ザで ソ ー ト ・ ア ルゴ リ ズム
を使用 し て重複を削除で き る か ど う か を決定 し ま
す。 distinct sorting は、 入力が順序付け ら れて い な
い場合 ( イ ン デ ッ ク ス がな い場合な ど ) や、 ソ ー
ト ・ ア ルゴ リ ズム に よ っ て生成 さ れた出力の順序
付け を マ ー ジ ・ ジ ョ イ ン な ど で利用で き る 場合に
役立 ち ま す。
ク エ リ ・ オプテ ィ マ イ ザで group hashing ア ルゴ リ
ズム を使用 し て集合関数を処理で き る か ど う か を
決定 し ま す。
説明
ク エ リ ・ オプテ ィ マ イ ザで複数テーブルの ジ ョ イ
ン の結果に対 し て再 フ ォ ー マ ッ ト を使用で き る か
ど う か を決定 し ま す。 multi table store ind を使用す
る と 、 ワ ー ク テーブルの使用が増加す る 可能性が
あ り ま す。
重複削除を強制的に行 う 場合に、 ク エ リ ・ オプ
テ ィ マ イ ザで よ り 柔軟な ア ルゴ リ ズム を使用で き
る か ど う か を決定 し ま す。
ク エ リ ・ オプテ ィ マ イ ザで複数の イ ン デ ッ ク ス ・
ス キ ャ ン の共通部分を検索領域で の ク エ リ ・ プ ラ
ン の一部 と し て使用で き る か ど う か を決定し ます。
Adaptive Server Enterprise
第1章
クエリ処理の概要
クエリの最適化で分析される要素
ク エ リ ・ プ ラ ン は、 検索方式 と 、 ク エ リ が必要 と す る デー タ を 検索す
る た め の順序付け ら れた実行手順の集ま り か ら 構成 さ れ ま す。 ク エ リ ・
プ ラ ン を 作成す る と き、 ク エ リ ・ オプテ ィ マ イ ザは次の こ と を 調べ
ま す。
•
ク エ リ 内の各テーブルの サ イ ズ ( ロ ー単位 と デー タ ・ ペ ー ジ単位 )
と 、 読み込む OAM ペー ジ と ア ロ ケ ー シ ョ ン ・ ペー ジ の数。
•
ク エ リ 内で使用 さ れて い る テ ー ブル と カ ラ ム に 存在す る イ ン デ ッ
ク ス、 イ ン デ ッ ク ス の種類、 それぞれの イ ン デ ッ ク ス の高 さ 、 リ ー
フ ・ ペ ー ジ の数、 ク ラ ス タ 率。
•
ク エ リ の イ ン デ ッ ク ス 対象範囲。 つ ま り 、 デー タ ・ ペ ー ジ に ア ク
セ ス せず に イ ン デ ッ ク ス ・ リ ー フ ・ ペ ー ジ か ら デー タ を 取得す る
こ と に よ っ て、 ク エ リ の 条件 を 満 た す こ と が で き る か ど う か。
Adaptive Server では、 where 句が ク エ リ に含ま れて い な い場合
で も 、 ク エ リ を カ バーす る イ ン デ ッ ク ス を 使用で き ま す。
•
イ ン デ ッ ク ス の キー の密度 と 分布。
•
使用可能な デー タ ・ キ ャ ッ シ ュ ( 複数の 場合も あ り ) の サイ ズ、
キ ャ ッ シ ュ がサポー ト する I/O の サイ ズ、 使用さ れる キ ャ ッ シ ュ
方式。
•
物理読み込み と 論理読み込み の コ ス ト 。 つ ま り 、 デ ィ ス ク か ら の
物理 I/O ペ ー ジ の読み込み と 、 メ イ ン ・ メ モ リ か ら の論理 I/O の読
み込み。
•
ジ ョ イ ン句 ( 最適な ジ ョ イ ン 順 と ジ ョ イ ン ・ タ イ プ )。 各ジ ョ イ ン
に必要な ス キ ャ ン の コ ス ト お よ び回数 と 、 I/O を 制限す る た め に イ
ン デ ッ ク ス を 利用で き る か ど う か を 検討 し ま す。
•
ジ ョ イ ン に 含 ま れ る 内部テ ーブル に 有用な イ ン デ ッ ク ス が な い場
合、 ジ ョ イ ン ・ カ ラ ム の イ ン デ ッ ク ス を 使用 し て ワ ー ク テーブル
( 内部テ ン ポ ラ リ ・ テーブル ) を 構築す る と 、 テーブル ・ ス キ ャ ン
を 繰 り 返す よ り も 高速で あ る か ど う か。
•
テ ー ブル を ス キ ャ ン せず に イ ン デ ッ ク ス を 使用 し て値 を 検索で き
る max ま た は min 集合関数が ク エ リ に含 ま れて い る か ど う か。
•
ジ ョ イ ン な ど の ク エ リ を 満た す た め に、 デー タ ・ ペ ー ジ ま た は イ
ン デ ッ ク ス ・ ペ ー ジ を 繰 り 返 し 使用す る 必要が あ る か ど う か。 ま
た は、 ペ ー ジ を ス キ ャ ン す る 必要が 1 回 し か な い た め、 使い捨て
方式 を 採用で き る か ど う か。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
7
クエリ・オプティマイザ
プ ラ ン ご と に、 ク エ リ ・ オプテ ィ マ イ ザは論理 I/O、 物理 I/O、 お よ び
CPU 処理の コ ス ト を 計算 し て合計 コ ス ト を 算出 し ま す。 プ ロ キ シ ・
テーブルが あ る 場合は、 追加の ネ ッ ト ワ ー ク 関連 コ ス ト も 同時に評価
し ま す。 次に、 ク エ リ ・ オプテ ィ マ イ ザは最 も コ ス ト が少な い プ ラ ン
を 選択 し ま す。
Adaptive Server バー ジ ョ ン 15.0.2 以降の ク エ リ ・ プ ロ セ ッ サは、 ス ト
ア ド ・ プ ロ シ ー ジ ャ 内の ス テー ト メ ン ト の最適化 を 、 そ の ス テー ト メ
ン ト の実行時ま で遅延 し ま す。 ロ ー カ ル変数の値がそれぞれ の ス テー
ト メ ン ト の最適化に使用可能に な る た め、 こ の遅延は ク エ リ ・ プ ロ
セ ッ サ に は有益です。
Adaptive Server の以前の バー ジ ョ ン では、 ロ ー カ ル変数 を 使用す る 述
部の選択性の見積 も り に デ フ ォ ル ト の推測 を 使用 し て い ま し た。
クエリ最適化のための変形
ク エ リ が解析 さ れて前処理 さ れた後、 ク エ リ ・ オプテ ィ マ イ ザがプ ラ
ン分析 を 始め る 前に、 最適化で き る 句の数が増え る よ う に ク エ リ が変
形 さ れ ま す。 showplan、 dbcc(200)、 statistics io、 set コ マ ン ド の よ う な ク
エ リ ・ チ ュ ーニ ン グ ・ ツ ールの出力 を 確認 し な い限 り 、 オプテ ィ マ イ
ザに よ っ て行われ る 変形は透過的です。 最適化 し た探索引数が追加 さ
れた ク エ リ を 実行す る と 、 追加 さ れた句が表示 さ れ ま す。 showplan
出力では、 探索引数ま た は ジ ョ イ ン を 指定 し な い テーブル に対 し て
“Keys are” の よ う な メ ッ セ ー ジ が表示 さ れ ま す。
8
Adaptive Server Enterprise
第1章
クエリ処理の概要
探索引数の同等な引数への変換
オプテ ィ マ イ ザは、 探索引数で使用 さ れて い る 形式に変換す る ク エ リ
句 を 探 し ま す。 表 1-2 に そ の リ ス ト を 示 し ま す。
表 1-2: 句と同等な探索引数
句
between
like
in(values_list)
変換
>= お よ び <= 句に変換 さ れ ま す。 た と えば、 between 10 and
20 は、 >= 10 お よ び <= 20 に変換 さ れ ま す。
パ タ ー ン の最初の文字が定数の場合は、 like 句 を 大な り 条
件ま た は小な り 条件 を 指定 し た ク エ リ に変換で き ま す。 た
と えば、like "sm%" は、>= "sm" お よ び < "sn" に変換 さ れ ま す。
最初の文字が ワ イ ル ド カ ー ド の場合、 like "%x" の よ う な句
は、 イ ン デ ッ ク ス を利用 し て ア ク セ ス す る こ と がで き ま
せん。 ただ し 、 ヒ ス ト グ ラ ム値は、 一致す る ロ ー の数の
見積 も り に使用で き ま す。
or ク エ リ の リ ス ト に変換 さ れ ま す。 た と えば、 int_col in
(1, 2, 3) は、 int_col = 1 or int_col = 2 or int_col = 3 に変換 さ れ
ま す。 in-list 内の最大要素数は 1025 です。
探索引数の推移閉包の適用 ( 可能な場合 )
オプテ ィ マ イ ザに よ り 、 推移閉包が探索引数に適用 さ れ ま す。 た と え
ば、 次の ク エ リ は、 title_id 上の titles と titleauthor を ジ ョ イ ン し 、
titles.title_id 上の探索引数 を 包含 し ま す。
select au_lname, title
from titles t, titleauthor ta, authors a
where t.title_id = ta.title_id
and a.au_id = ta.au_id
and t.title_id = "T81002"
上記の ク エ リ は、 titleauthor.title_id 上の探索引数 も 包含 し て い る よ う に
最適化 さ れ ま す。
select au_lname, title
from titles t, titleauthor ta, authors a
where t.title_id = ta.title_id
and a.au_id = ta.au_id
and t.title_id = "T81002"
and ta.title_id = "T81002"
こ の句の追加に よ り 、 ク エ リ ・ オプテ ィ マ イ ザは titles.title_id 上の イ ン
デ ッ ク ス統計値 を 使用 し て、 titleauthor テーブル内の一致す る ロ ー の数
を 見積 も る こ と がで き ま す。 コ ス ト の見積 も り の精度が高い ほ ど 、 よ
り 効果的な イ ン デ ッ ク ス と ジ ョ イ ン順 を 選択す る こ と がで き ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
9
クエリ・オプティマイザ
等価ジョイン述部の推移閉包の適用 ( 可能な場合 )
オプテ ィ マ イ ザに よ り 、 推移閉包が通常の等価ジ ョ イ ン の ジ ョ イ ン ・
カ ラ ム に適用 さ れ ま す。 次の ク エ リ は、 t1.c11 お よ び t2.c21 の等価ジ ョ
イ ン と 、 t2.c21 お よ び t3.c31 の等価ジ ョ イ ン を 指定 し ま す。
select *
from t1, t2, t3
where t1.c11 = t2.c21
and t2.c21 = t3.c31
and t3.c31 = 1
ジ ョ イ ン の推移閉包がな い場合、 検討対象の ジ ョ イ ン順は、 (t1, t2, t3)、
(t2, t1, t3)、(t2, t3, t1)、お よ び (t3, t2, t1) の み と な り ま す。 ジ ョ イ ン を t1.c11
= t3.31 に追加す る こ と に よ っ て、 ク エ リ ・ プ ロ セ ッ サは ジ ョ イ ン の順
序の リ ス ト を 拡張 し 、 (t1, t3, t2) お よ び (t3, t1, t2) を 含め ま す。 探索引数
の推移閉包に よ り 、 t3.c31 = 1 と 指定 し た条件が、 t1 お よ び t2 の ジ ョ イ
ン ・ カ ラ ム に適用 さ れ ま す。
同様に、 次の よ う に等価ジ ョ イ ン推移閉包 も or 述部 を 持つ等価ジ ョ イ
ン に適用 さ れ ま す。
select *
from R,S
where R.a = S.a
and (R.a = 5 OR S.b = 6)
ク エ リ ・ オプテ ィ マ イ ザでは、 こ れが次の も の と 等 し い と 導出 さ れ
ま す。
select *
from R,S
where R.a = S.a
and (S.a = 5 or S.b = 6)
or 述部は S の ス キ ャ ン で評価で き、 場合に よ っ ては or 最適化に使用で
き ま す。 そ の結果、 S の イ ン デ ッ ク ス は効率的に使用 さ れ ま す。
ジ ョ イ ン推移閉包の も う 1 つ の例は、 複雑な SARG へ の適用です。
select *
from R,S
where R.a = S.a and (R.a + S.b = 6)
上記の よ う な ク エ リ が次の よ う に変形お よ び導出 さ れ ま す。
select *
from R,S
where R.a = S.a
and (S.a + S.b = 6)
10
Adaptive Server Enterprise
第1章
クエリ処理の概要
複雑な述部は S の ス キ ャ ン で評価で き、 早期の結果セ ッ ト の フ ィ ル タ
リ ン グ に よ っ てパ フ ォ ー マ ン ス が大幅に向上 し ま す。
推移閉包は、 次の よ う に通常の等価ジ ョ イ ン に の み使用 し ま す。 ジ ョ
イ ン推移閉包は、 次の場合は実行 さ れ ま せん。
•
等価ジ ョ イ ン以外 (t1.c1 > t2.c2 な ど )
•
外部ジ ョ イ ン (t1.c11 *= t2.c2、 left join、 right join な ど )
•
サブ ク エ リ の境界 を 超え る ジ ョ イ ン
•
参照整合性の チ ェ ッ ク ま た は ビ ュ ー の with check オプ シ ョ ン で使
用される ジ ョ イ ン
注意 Adaptive Server Enterprise 15.0 では、 ジ ョ イ ン推移閉包 を オ ン ま た
はオ フ に す る sp_configure オプ シ ョ ン と 、 sort merge join が廃止 さ れ ま し
た。 Adaptive Server Enterprise 15.0 以降では、 適用可能で あ ればい つ で
も ジ ョ イ ン推移閉包 を 適用で き ま す。
追加の最適化パスを提供する述部要素変形
述部要素変形は、 ク エ リ ・ プ ロ セ ッ サの選択の幅 を 広げま す。 or で リ
ン ク さ れて い る 述部ブ ロ ッ ク か ら 、 and で リ ン ク さ れて い る 句 を 抽出
し て、 最適化で き る 句 を ク エ リ に追加 し ま す。 最適化 さ れた追加の
句は、 ク エ リ の実行に使用で き る ア ク セ ス ・ パ ス が他に も あ る こ と を
示 し ま す。 元の or 述部は、 ク エ リ の正当性 を 確認す る た め に保持 さ れ
ま す。
述部変形は次の手順で行われ ま す。
1
各 or 句内で完全一致 を 調べ る 簡単な述部 ( ジ ョ イ ン、 探索引数、
in リ ス ト ) が抽出 さ れ ま す。 手順 3 の ク エ リ では、 各ブ ロ ッ ク で完
全一致 を 調べて い る 次の句が抽出 さ れ ま す。
t.pub_id = p.pub_id
between 句 を “>= and <=” 句に変換 し て か ら 、述部変形 を 行い ま す。
ク エ リ 例では、 両方の ク エ リ ・ ブ ロ ッ ク で between 15 を 使用 し て
い ま す ( ただ し 範囲の上限は異な っ て い ま す )。 同等の句が、 手順
1 に よ っ て次の よ う に展開 さ れ ま す。
price >=15
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
11
クエリ・オプティマイザ
2
同一テーブルの探索引数が抽出 さ れ ま す。 展開に お い ては、 同一
の テーブル を 参照 し て い る すべて の条件 を 、 1 つ の述部 と し て扱
い ま す。 type と price は ど ち ら も titles テーブル の カ ラ ム な の で、 抽
出後の句は次の よ う に な り ま す。
(type = "travel" and price >=15 and price <= 30)
or
(type = "business" and price >= 15 and price <= 50)
3
in リ ス ト と or 句が抽出 さ れ ま す。 あ る 1 つ の ブ ロ ッ ク 内に お い て、
1 つ の テーブル に複数の in リ ス ト が あ る 場合、 最初の リ ス ト だけ
が抽出 さ れ ま す。 前述の例では、 展開後の リ ス ト は次の よ う に な
り ま す。
p.pub_id in ("P220", "P583", "P780")
or
p.pub_id in ("P651", "P066", "P629")
こ こ ま で の手順は並行 し て行われ、 同 じ 句が抽出 さ れ る こ と も あ
り ま すが、 重複 し て い る 句は削除 さ れ ま す。
生成 さ れた条件がそれぞれ調べ ら れ、 最適化 さ れた探索引数ま た
は ジ ョ イ ン句 と し て使用で き る か ど う かが判断 さ れ ま す。 ク エ リ
最適化に有効な条件だけが保持 さ れ ま す。
展開に よ っ てで き た新 し い句は、 ユーザに よ っ て指定 さ れた ク エ
リ 句に追加 さ れ ま す。
た と えば、 次に示す ク エ リ 内の最適化 さ れた句は、 すべて or 句で
囲 ま れて い ま す。
select p.pub_id, price
from publishers p, titles t
where (
t.pub_id = p.pub_id
and type = "travel"
and price between 15 and
and p.pub_id in ("P220",
)
or (
t.pub_id = p.pub_id
and type = "business"
and price between 15 and
and p.pub_id in ("P651",
)
12
30
"P583", "P780")
50
"P066", "P629")
Adaptive Server Enterprise
第1章
クエリ処理の概要
先に説明 し た よ う に、 述部変形では、 or で リ ン ク さ れた句の ブ ロ ッ ク
か ら and で リ ン ク さ れた句 を 抜き出 し ま す。 カ ッ コ で囲んだすべて の
ブ ロ ッ ク に共通す る 句だけが抽出 さ れ ま す。 前述の例で、 あ る 句が or
で リ ン ク さ れたブ ロ ッ ク の う ち の 1 つ に だけ あ っ て他の ブ ロ ッ ク に な
い場合、 そ の句は抽出 さ れ ま せん。
探索引数と有用なインデックスの処理
ク エ リ の最適化に使用 さ れ る 述部 where 句 と having 句 を 区別す る こ と
は重要です。 こ の 2 つ の句は、 後の ク エ リ 処理で も 、 返 さ れ る ロ ー を
フ ィ ル タ す る た め に使用 し ま す。
where 句の カ ラ ム がイ ン デッ ク ス・ キ ー に 一致する 場合、 デー タ・ ロ ー
へ の ア ク セ ス ・ パ ス を 決め る た め に 探索引数を 使用で き ま す。 イ ン
デッ ク ス は、 一致する デー タ ・ ロ ー を 見つ け て 取り 出すた め に 使用さ
れま す。 ロ ー が、 デー タ ・ キ ャ ッ シ ュ の 中か ら 見つ か る か 、 ディ ス ク
か ら デー タ ・ キ ャ ッ シ ュ に 読み込ま れる と 、 残り の 句がすべて 適用さ
れま す。
次の ク エ リ 例では、 authors テーブル に au_lname の イ ン デ ッ ク ス と city
の イ ン デ ッ ク ス が あ る 場合、 一致す る ロ ー を 見つ け る た め に、 ど ち ら
の イ ン デ ッ ク ス も 使用で き ま す。
select au_lname, city, state
from authors
where city = "Washington"
and au_lname = "Catmull"
ク エ リ ・ オプテ ィ マ イ ザは、 統計値に基づ い て、 ど の イ ン デ ッ ク ス に
よ る ア ク セ ス が最 も コ ス ト が低い か を 判断 し ま す。 こ こ で使用 さ れ る
統計値に は、 ヒ ス ト グ ラ ム、 テーブル中の ロ ー数、 イ ン デ ッ ク ス の高
さ 、 イ ン デ ッ ク ス の ク ラ ス タ 率、 デー タ ・ ペ ー ジ の ク ラ ス タ 率な ど が
あ り ま す。 イ ン デ ッ ク ス の中か ら デー タ ・ ペ ー ジ へ の ア ク セ ス ・ コ ス
ト が最低に な る も の が選択 さ れて、 ク エ リ の実行に使用 さ れ ま す。 次
に、 い っ た ん ア ク セ ス さ れたデー タ ・ ロ ー に は、 そ の他の句が適用 さ
れ ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
13
クエリ・オプティマイザ
不等オペレータ
不等オ ペ レ ー タ < > お よ び != は特殊な ケ ー ス です。 ク エ リ ・ オプテ ィ
マ イ ザは、 カ ラ ム に イ ン デ ッ ク ス が あ る 場合に ノ ン ク ラ ス タ ー ド ・ イ
ン デ ッ ク ス を カ バーす る か ど う か を 調べ、 イ ン デ ッ ク ス が ク エ リ を カ
バー し て い る 場合は非マ ッ チ ン グ ・ イ ン デ ッ ク ス ・ ス キ ャ ン を 使用 し
ま す。 ただ し 、 イ ン デ ッ ク ス が ク エ リ を カ バー し て い な い場合は、
イ ン デ ッ ク ス ・ ス キ ャ ン時にデー タ ・ ペ ー ジ の ロ ー ID ル ッ ク ア ッ プ
に よ っ てテーブル に ア ク セ ス し ま す。
探索引数の最適化の例
完全に最適化で き る 句の例 を 次に示 し ま す。 こ れ ら の カ ラ ム に統計値
が あ る 場合は、 そ の統計値 を ク エ リ が返す ロ ー数の見積 も り に使用 し
ま す。 カ ラ ム に イ ン デ ッ ク ス が あ る 場合は、 イ ン デ ッ ク ス を 使用 し て
デー タ に ア ク セ ス し ま す。
au_lname = "Bennett"
price >= $12.00
advance > $10000 and advance < $20000
au_lname like "Ben%" and price > $12.00
こ れ ら の探索引数は、 Functional Index が組み込 ま れて い な い と 最適化
で き ま せん。
/* カ ラ ム側の式は
許可 さ れな い */
substring(au_lname,1,3) = "Ben" /* カ ラ ム名に対す る
関数 */
advance * 2 = 5000
次の よ う に記述す る と 、 上の 2 つ の句は最適化可能に な り ま す。
advance = 5000/2
au_lname like "Ben%"
au_lname の イ ン デ ッ ク ス の み を 持つ こ の ク エ リ に つ い て検討 し ま す。
select au_lname, au_fname, phone
from authors
where au_lname = "Gerland"
and city = "San Francisco"
14
Adaptive Server Enterprise
第1章
クエリ処理の概要
次の句は次の理由に よ り 探索引数 と 見な さ れ ま す。
au_lname = "Gerland"
•
au_lname に イ ン デ ッ ク ス が あ る 。
•
カ ラ ム名に対 し て、 関数 ま た は他の オ ペ レ ー シ ョ ン が指定 さ れて
い な い。
•
オペ レ ー タ が有効な探索引数オ ペ レ ー タ で あ る 。
こ の句は、 city カ ラ ム に イ ン デ ッ ク ス がな い た め、 上の条件の う ち 最
初の条件だけが あ ては ま り ま せん。 こ の場合、 au_lname の イ ン デ ッ ク
ス が ク エ リ に使用 さ れ ま す。 姓が一致す る デー タ ・ ペ ー ジ がすべて
キ ャ ッ シ ュ 内に読み込ま れ、 それぞれ の一致 し た ロ ー に対 し て、 そ の
city が検索基準 と 一致す る か ど う かが調べ ら れ ま す。
ジョインの処理
ク エ リ ・ オプテ ィ マ イ ザは、 探索引数の処理 と 同 じ 方法で ジ ョ イ ン述
部 を 処理 し ま す。 こ こ では、 統計値、 テーブル中の ロ ー数、 イ ン デ ッ
ク ス の高 さ 、 イ ン デ ッ ク ス の ク ラ ス タ 率、 お よ びデー タ ・ ペ ー ジ の ク
ラ ス タ 率 を 使用 し て、 ど の イ ン デ ッ ク ス お よ び ジ ョ イ ン ・ メ ソ ッ ド に
よ る ア ク セ ス が最 も コ ス ト が低い か を 判断 し ま す。 さ ら に、 ク エ リ ・
オプテ ィ マ イ ザでは、 ジ ョ イ ン ・ ヒ ス ト グ ラ ム か ら 導出 し た ジ ョ イ ン
密度の見積 も り も 使用 し ま す。 ジ ョ イ ン ・ ヒ ス ト グ ラ ム では、 条件 を
満たす ジ ョ イ ン ・ ロ ー と 、 外部お よ び内部の テーブルで ス キ ャ ン さ れ
る ロ ー の正確な見積 も り が得 ら れ ま す。 ク エ リ ・ オプテ ィ マ イ ザで
は、 最 も 効率的な ク エ リ ・ プ ラ ン が得 ら れ る 最適な ジ ョ イ ン順 も 決定
す る 必要が あ り ま す。 次の セ ク シ ョ ン では、 ジ ョ イ ン の処理で使用す
る 主な方法に つ い て説明 し ま す。
ジョイン密度とジョイン・ヒストグラム
ク エ リ ・ オプテ ィ マ イ ザは、 ジ ョ イ ン 属性の テーブル正規化 ヒ ス ト グ
ラ ム を 使用す る コ ス ト ・ モデル を ジ ョ イ ン に 対 し て使用 し ま す。 こ の
方法では、 偏 り の あ る 値 ( 頻度カ ウ ン ト ) の正確な値が得 ら れ、 各 ヒ
ス ト グ ラ ム か ら の範囲セル密度 を 使用 し て、 対応す る 範囲セルの セル・
カ ウ ン ト を 見積 も る こ と がで き ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
15
クエリ・オプティマイザ
ジ ョ イ ン密度は 「ジ ョ イ ン ・ ヒ ス ト グ ラ ム」 か ら 動的に計算 さ れ ま す。
こ れは、 ジ ョ イ ン ・ オ ペ レ ー タ の両側か ら ヒ ス ト グ ラ ム の ジ ョ イ ン を
検討 し ま す。 最初の ヒ ス ト グ ラ ム ・ ジ ョ イ ン は通常、 両方の属性 に ヒ
ス ト グ ラ ム が あ る と き に、 2 つ の ベー ス ・ テーブルの間で行われ ま す。
すべて の ヒ ス ト グ ラ ム ・ ジ ョ イ ン では、 親ジ ョ イ ン の射影の対応す る
属性に新 し い ヒ ス ト グ ラ ム が作成 さ れ ま す。
ジ ョ イ ン ・ ヒ ス ト グ ラ ム の方法では、 ジ ョ イ ン ・ カ ラ ム のデー タ 分散
が偏 っ て い る 場合で も 、 ジ ョ イ ン 選択性が正確に見積 も ら れ る の で、
優れた ジ ョ イ ン順 と パ フ ォ ー マ ン ス が得 ら れ ま す。
選択性の見積もりのヒストグラム式
バー ジ ョ ン 15.0.2 よ り 前の Adaptive Server では、 選択性の見積 も り に
デ フ ォ ル ト の “guesses” を 使用 し て い ま し た。
Adaptive Server バー ジ ョ ン 15.0.2 以降では、 単一の カ ラ ム に ヒ ス ト グ
ラ ム が存在す る 場合は、 ヒ ス ト グ ラ ム見積 も り を そ の カ ラ ム述部に適
用 し ま す。 こ れ に よ り 、 さ ら に正確な ロ ー の見積 も り が可能に な り 、
ク エ リ ・ プ ラ ン の ジ ョ イ ン 順が改善 さ れ ま す。
こ の例では、 式が非常に選択的な場合、 テーブル t1 を ジ ョ イ ン順の冒
頭に配置す る こ と が効果的です。
select * from t1,t2 where substring(t1.charcol, 1, 3)
= "LMC" and t1.a1 = t2.b
混合データ型のジョイン
基本的な必要条件は、 ど の よ う な ジ ョ イ ン述部 と イ ン デ ッ ク ス ・ キー
の混合デー タ 型で あ っ て も 、 可能で あ れば イ ン デ ッ ク ス ・ ル ッ ク ア ッ
プ の た め の キー を 生成で き る こ と です。 次の ク エ リ に つ い て考え てみ
ま す。
create
create
create
create
table
table
index
index
T1
T2
i1
i1
(c1 int, c2 int)
(c1 int, c2 float)
on T1(c2)
on T2(c2)
select * from T1, T2 where T1.c2=T2.c2
T1.c2 は int 型で イ ン デ ッ ク ス が あ り 、 T2.c2 は イ ン デ ッ ク ス が あ る float
型で あ る と し ま す。
16
Adaptive Server Enterprise
第1章
クエリ処理の概要
デー タ 型が暗黙的に変換可能で あ れば、 ク エ リ ・ オプテ ィ マ イ ザで イ
ン デ ッ ク ス ・ ス キ ャ ン を 使用 し て ジ ョ イ ン を 処理で き ま す。 つ ま り 、 外
部テ ーブルか ら の ル ッ ク ア ッ プ値のデー タ 型が内部テーブル の各 イ ン
デ ッ ク ス属性 と は異な る 場合で も 、 ク エ リ ・オプテ ィ マ イ ザは外部テー
ブルか ら の カ ラ ム値 を 使用 し て、 内部テーブルで の イ ン デ ッ ク ス ・ ス
キ ャ ン を 位置付け し ま す。
式と or 述部を持つジョイン
式 と or 述部 を 持つ ジ ョ イ ン の ク エ リ ・ オプテ ィ マ イ ザで の処理方法に
つ い ては、 「追加の最適化パ ス を 提供す る 述部要素変形」 (11 ペー ジ )
を 参照 し て く だ さ い。
ジョインの順序
ク エ リ ・ オプテ ィ マ イ ザの主要な タ ス ク の 1 つ は、 ク エ リ の実行時に
処理 さ れ る ジ ョ イ ン 内の関係 を 最適な順序 に す る た め に、 ジ ョ イ ン ・
ク エ リ の ク エ リ ・ プ ラ ン を 生成す る こ と です。 こ れ に は、 時間 と メ モ
リ を 大量に消費す る 可能性が あ る 複雑な プ ラ ン 検索方式が必要に な り
ま す。 ク エ リ ・ オ プ テ ィ マ イ ザは、 い く つ か の効果的な方法 を 使用 し
て最適な ジ ョ イ ン順 を 取得 し ま す。 主な方法は次の と お り です。
•
そ の他の後続の ジ ョ イ ン 順 を 削除す る た め の上限値 と し て使用で
き る 最初の適切な順序 を 取得す る た め に、 貪欲な方式 を 使用 し ま
す。 貪欲な方式で は、 最初 の 順序 を 取得す る た め に、 ジ ョ イ ン ・
ロ ー の見積 も り と ネ ス ト ルー プ ・ ジ ョ イ ン ・ メ ソ ッ ド が利用 さ れ
ま す。
•
完全な順序付け方式は、 貪欲な方式に従い ま す。 こ の方式では、 よ
り 適切な ジ ョ イ ン 順 に よ り 、 貪欲な方式で取得 さ れ た ジ ョ イ ン 順
が置き換え ら れ ま す。 こ の順序付け では ジ ョ イ ン ・ メ ソ ッ ド を 利用
で き ま す。
•
広範な コ ス ト ベ ー ス お よ びルールベ ー ス の排除方法 を 使用す る こ
と に よ り 、 検討対象か ら 望ま し く な い ジ ョ イ ン順が除去 さ れ ま す。
こ の排除方法の重要な側面は、部分的な ジ ョ イ ン順 ( 可能な ジ ョ イ
ン 順の プ レ フ ィ ク ス ) と 最良の全体的な ジ ョ イ ン 順が常に比較 さ
れ、 特定の プ レ フ ィ ク ス を 続行す る か ど う かが判断 さ れ る こ と で
す。 こ れ に よ り 、 最適な ジ ョ イ ン順の決定に必要な時間が大幅に短
縮 さ れ ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
17
最適化目標
•
ク エ リ ・ オ プ テ ィ マ イ ザは、 ス タ ー ・ ス キ ー マ ・ ジ ョ イ ン ま た は
ス ノ ー フ レ ー ク ・ ス キ ー マ ・ ジ ョ イ ン を 認識お よ び処理 し 、 それ
ら の ジ ョ イ ン 順 を 最 も 効率的な方法で処理す る こ と が で き ま す。
一般的な ス タ ー ・ ス キ ー マ ・ ジ ョ イ ン に は大 き な フ ァ ク ト ・ テ ー
ブルが含 ま れ、 こ の テーブルは複数のデ ィ メ ン シ ョ ン テーブル と
ジ ョ イ ン す る 等価ジ ョ イ ン 述部 を 持 っ て い ま す。 デ ィ メ ン シ ョ ン ・
テ ー ブル に は、 互い を 接続す る ジ ョ イ ン 述部が あ り ま せ ん。 つ ま
り 、 デ ィ メ ン シ ョ ン ・ テ ー ブル自体の間 に は ジ ョ イ ン が あ り ま せ
ん が、 デ ィ メ ン シ ョ ン ・ テ ー ブル と フ ァ ク ト ・ テ ー ブル の間 に は
ジ ョ イ ン 述部が あ り ま す。 ク エ リ ・ オ プ テ ィ マ イ ザで は、 特殊な
ジ ョ イ ン 順序付け方法が採用 さ れて い ま す。 こ の方法で は、 大 き
な フ ァ ク ト ・ テ ー ブルが ジ ョ イ ン 順の最後 に プ ッ シ ュ さ れ、 デ ィ
メ ン シ ョ ン ・ テ ー ブルが先頭 に プル さ れ る の で、 非常 に 効率的な
ク エ リ ・ プ ラ ン を 得 る こ と が で き ま す。 た だ し 、 ス タ ー ・ ス キ ー
マ ・ ジ ョ イ ン に サブ ク エ リ 、 外部ジ ョ イ ン、 ま た は or 述部が含ま
れて い る 場合、 ク エ リ ・ オ プテ ィ マ イ ザで は こ の方法が使用 さ れ
ま せん。
最適化目標
最適化目標は、 ク エ リ の要求に合 う 最良の最適化方法 を 見つ け て、
オプテ ィ マ イ ザの時間 と リ ソ ー ス を 最適に使用で き る よ う に す る た め
の便利な方法です。 ク エ リ ・ オプテ ィ マ イ ザ を 使用す る と 、 3 種類の
最適化目標 を 設定で き ま す。 こ れは、 サーバ ・ レ ベル、 セ ッ シ ョ ン ・
レ ベル、 ク エ リ ・ レ ベルの 3 つ の層で指定で き ま す。
目的の レ ベルで最適化目標 を 設定 し ま す。 サーバ ・ レ ベルの最適化目
標は、 セ ッ シ ョ ン ・ レ ベルで上書き さ れ ま す。 セ ッ シ ョ ン ・ レ ベルは
ク エ リ ・ レ ベルで上書き さ れ ま す。
こ れ ら の最適化目標に よ り 、 次の よ う なユーザの ク エ リ 環境に最 も 適
し た最適化方式 を 選択で き ま す。
•
allrows_mix – デ フ ォ ル ト の目標。 ク エ リ 混在環境では最 も 効果的
です。 allows_mix では、 OLTP ク エ リ 環境 と DSS ク エ リ 環境の ニー
ズ の バ ラ ン ス が と ら れ ま す。
•
allrows_dss – 中~高 レ ベルの複雑 さ の運用 DSS ク エ リ に最 も 効果
的な目標。 現在、 こ の目標は実験ベ ー ス で提供 さ れて い ま す。
•
allrows_oltp – オプテ ィ マ イ ザで ネ ス ト ループ ・ ジ ョ イ ン の み と 見
な さ れ ま す。
18
Adaptive Server Enterprise
第1章
クエリ処理の概要
サーバ ・ レ ベルでは、 sp_configure を 使用 し ま す。 次に例 を 示 し ま す。
sp_configure "optimization goal", 0, "allrows_mix"
セ ッ シ ョ ン ・ レ ベルでは、 set plan optgoal を 使用 し ま す。 次に例 を 示 し
ま す。
set plan optgoal allrows_dss
ク エ リ ・ レ ベルでは、 select ま た は他の DML コ マ ン ド を 使用 し ま す。
次に例 を 示 し ま す。
select * from A order by A.a plan
"(use optgoal allrows_dss)"
通常は、 select、 update、 お よ び delete 文 を 使用 し て ク エ リ ・ レ ベルの
最適化目標 を 設定で き ま す。 ただ し 、 insert…select 文では最適化目標 を
設定で き ま すが、 純粋な insert 文では ク エ リ ・ レ ベルの最適化目標 を
設定で き ま せん。
クエリ最適化の時間の制限
実行時間の長い複雑な ク エ リ は、 最適化に時間 と コ ス ト がか か る 場合
が あ り ま す。 タ イ ム ア ウ ト ・ メ カ ニズ ム を 使用す る と 、 こ の時間 を 制
限す る と 同時に、 適切な ク エ リ ・ プ ラ ン を 得 る こ と がで き ま す。 ク エ
リ ・ オプテ ィ マ イ ザに は、 実行時間の長い複雑な ク エ リ に か か る 時間
を 制限で き る メ カ ニズ ム が用意 さ れて い ま す。 タ イ ム ア ウ ト に よ り 、
ク エ リ ・ プ ロ セ ッ サは適度な時間で最適化 を 停止で き ま す。
オプテ ィ マ イ ザは、 最適化中に次の両方の状況が満た さ れ る と 、
timeout を ト リ ガ し ま す。
•
1 つ以上の完了プ ラ ン が最適なプ ラ ン と し て保持 さ れて い る 。
•
ユーザ設定の timeout パー セ ン テー ジ制限 を 超え た。
optimization timeout limit パ ラ メ ー タ を 使用 し て、 Adaptive Server がすべ
て の レ ベルの ク エ リ 最適化に費やす時間 を 制限で き ま す。 こ の パ ラ
メ ー タ は、 0 ~ 1000 の任意の値に設定で き ま す。 optimization timeout
limit は、 Adaptive Server が ク エ リ の最適化に費やす予想 ク エ リ 実行時
間の割合 を 表 し ま す。 た と えば、 10 を 指定す る と 、 Adaptive Server は
予想 ク エ リ 実行時間の 10% を ク エ リ の最適化に費や し ま す。 同様に、
1000 を 指定す る と 、 Adaptive Server は予想 ク エ リ 実行時間の 1000%、
つ ま り 予想 ク エ リ 実行時間の 10 倍 を ク エ リ の最適化に費や し ま す。
optimization timeout limit の詳細に つ い ては、 『シ ス テ ム管理ガ イ ド 』
の 「第 5 章 設定パ ラ メ ー タ 」 を 参照 し て く だ さ い。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
19
並列処理
タ イ ム ア ウ ト 値 を 大き く す る と 、 複雑な ク エ リ を 持つ ス ト ア ド ・ プ ロ
シ ー ジ ャ の最適化 に役立つ こ と が あ り ま す。 一般的 に、 ス ト ア ド ・ プ
ロ シ ー ジ ャ の最適化時間が長い ほ ど 、 よ り 適切なプ ラ ン が得 ら れ ま す。
つ ま り 、 ス ト ア ド ・ プ ロ シ ー ジ ャ を 複数回実行すれば、 長い最適化時
間 を 取 り 戻す こ と がで き ま す。
小 さ な タ イ ム ア ウ ト 値は、 通常は コ ン パ イ ル に長時間 を 要す る 複雑な
ア ド ホ ッ ク ・ ク エ リ の コ ン パ イ ル時間 を 短縮す る 必要が あ る 場合に使
用で き ま す。 ただ し 、 ほ と ん ど の ク エ リ では、 デ フ ォ ル ト の タ イ ム ア
ウ ト 値で あ る 10 で十分です。
sp_configure を 使用 し て、 最適化の timeout limit 設定パ ラ メ ー タ を サー
バ ・ レ ベルで設定 し ま す。 た と えば、 最適化時間 を 総 ク エ リ 処理時間
の 10% に制限す る に は、 次の よ う に入力 し ま す。
sp_configure "optimization timeout limit", 10
set を 使用 し て、 セ ッ シ ョ ン ・ レ ベルで タ イ ム ア ウ ト を 設定 し ま す。
set plan opttimeoutlimit <n>
こ こ で、 n は 0 ~ 1000 の任意の整数です。
select を 使用 し て、 ク エ リ ・ レ ベルで最適化時間 を 制限 し ま す。
select * from <table> plan "(use opttimeoutlimit <n>)"
こ こ で、 n は 0 ~ 1000 の任意の整数です。
並列処理
Adaptive Server では、 ク エ リ 実行に対 し て水平お よ び垂直並列処理 を
サポー ト し て い ま す。 垂直並列処理 と は、 CPU やデ ィ ス ク な ど さ ま ざ
ま な シ ス テ ム ・ リ ソ ー ス を 利用 し て、 同時に複数の オ ペ レ ー タ を 実行
す る 機能です。 ま た、 水平並列処理 と は、 デー タ の指定部分でオペ
レ ー タ の複数の イ ン ス タ ン ス を 実行す る 機能です。
Adaptive Server で の並列 ク エ リ 最適化の詳細に つ い ては、 「第 5 章 並
列 ク エ リ 処理」 を 参照 し て く だ さ い。
20
Adaptive Server Enterprise
第1章
クエリ処理の概要
最適化の問題
ク エ リ ・ オプテ ィ マ イ ザでは ほ と ん ど の ク エ リ を 効率的に最適化で き
ま すが、 次の問題はオプテ ィ マ イ ザの効率に影響 を 及ぼす可能性が あ
り ま す。
•
統計値 を 最近更新 し て い な い場合、 実際のデー タ 分布 と ク エ リ 最
適化に使用す る 値が一致 し な い こ と が あ る 。
•
指定の ト ラ ンザ ク シ ョ ン に よ っ て参照 さ れ る ロ ーが、 イ ン デ ッ ク
ス統計値に反映 さ れて い る パ タ ー ン に合わ な い こ と が あ る 。
•
1 つ の イ ン デ ッ ク ス でテーブルの広い範囲に ア ク セ ス で き る こ と
があ る。
•
最適化で き な い形式で where 句 (SARGS) が記述 さ れ る 。
•
重要な ク エ リ に対す る 適切な イ ン デ ッ ク ス が存在 し な い。
•
あ る ス ト ア ド ・ プ ロ シ ー ジ ャ が コ ン パ イ ル さ れた後に、 基本 と な
る テーブル に重大な変更が実行 さ れた。
•
SARG ま た は ジ ョ イ ン ・ カ ラ ム の統計値が存在 し な い。
こ れ ら の状況は、 ク エ リ ・ オプテ ィ マ イ ザが能力 を 最大限に発揮で
き る よ う に何 ら か の ベ ス ト ・ プ ラ ク テ ィ ス に従 う 必要性 を 示 し て い
ま す。
探索引数の作成
ク エ リ に探索引数 を 記述す る 場合は、 次のガ イ ド ラ イ ン に従い ま す。
•
検索句の カ ラ ム名 を 指定 し た側に、 関数、 算術オ ペ レ ー タ 、 そ の
他の式 を 指定 し な い よ う に し ま す。 可能な ら ば、 関数やそ の他の
オペ レ ー タ を 、 検索句の式の側に移動 し ま す。
•
ク エ リ ・ プ ロ セ ッ サが使用で き る よ う な探索引数 を 、 で き る 限 り
多 く 指定 し ま す。
•
ク エ リ の述部が、 1 つ の テーブル に対 し て 102 個 を 超え て い る 場
合は、 最 も 有効で あ る 可能性が高い句 を ク エ リ の先頭近 く に配置
し ま す。 最適化では、 各テーブル に つ い て、 先頭か ら 400 個の探
索引数 し か使用 さ れな い た め です ( ただ し 、 すべて の探索条件が
ロ ー の修飾に使用 さ れ ま す )。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
21
最適化の問題
•
> ( 大な り ) を 使用 し て い る ク エ リ は、 >= ( 以上 ) を 使用 し て書き
な おす と パ フ ォ ー マ ン ス が向上す る 場合が あ り ま す。 た と えば、
次の ク エ リ では、 int_col に イ ン デ ッ ク ス が作成 さ れて い ま す。
こ の イ ン デ ッ ク ス を 使用 し て、 int_col の値が 3 の最初の値 を 検出
し ま す。 次に、 さ ら に ス キ ャ ン を 行 っ て、 3 よ り 大き い最初の値
を 検出 し ま す。 int_col の値が 3 の ロ ーが多い場合は、 サーバで多
く の ペー ジ を ス キ ャ ン し て、 int_col の値が 3 よ り 大き い最初の
ロ ー を 検出す る 必要が あ り ま す。
select * from table1 where int_col > 3
ク エ リ を 次の よ う に記述す る と よ り 効率的です。
select * from table1 where int_col >= 4
文字列や浮動小数点デー タ を 扱 う 場合、 こ の最適化は難 し く な り
ま す。
•
showplan の出力 を 調べて、 ど の キー と イ ン デ ッ ク ス が使用 さ れて
い る か を 確認 し ま す。
•
SQL 抽出テーブルの
使用
使用 さ れ る はずの イ ン デ ッ ク ス が使用 さ れて い な い場合は、
表 3-1 (124 ペ ー ジ ) の set コ マ ン ド の出力 を 使用 し て、 ク エ リ ・
プ ロ セ ッ サが イ ン デ ッ ク ス を 認識 し て い る か を 確認 し ま す。
1 つ の SQL 文 と し て表 さ れ る ク エ リ では、 複数の SQL 文で表 さ れ る
ク エ リ よ り も ク エ リ ・ プ ロ セ ッ サが有効に活用 さ れ ま す。 SQL 抽出
テーブル を 使用 し な い場合に は複数の SQL 文 と テ ン ポ ラ リ ・ テーブ
ルが必要に な る 状況で も 、 SQL 抽出テーブル を 使用す る と 、 特に中間
集約結果 を 格納す る 必要が あ る 場合に、 1 つ の手順で ク エ リ を 表す こ
と がで き ま す。 次に例 を 示 し ま す。
select dt_1.* from
(select sum(total_sales)
from titles_west group by total_sales)
dt_1(sales_sum),
(select sum(total_sales)
from titles_east group by total_sales)
dt_2(sales_sum)
where dt_1.sales_sum = dt_2.sales_sum
こ こ では、 集約結果が SQL 抽出テーブル dt_1 お よ び dt_2 か ら 取得
さ れ、 こ の 2 つ の SQL 抽出テーブル間で ジ ョ イ ン が計算 さ れ ま す。
すべて の操作 を 1 つ の SQL 文で実行で き ま す。
詳細に つ い ては、 『Transact-SQL ユーザーズ ・ ガ イ ド 』 の 「第 9 章
SQL 抽出テーブル」 を 参照 し て く だ さ い。
22
Adaptive Server Enterprise
第1章
オブジェクト・サイズ
に応じたチューニング
クエリ処理の概要
ク エ リ と シ ス テ ム の動作 を 理解す る た め に は、 テーブル と イ ン デ ッ ク
ス の サ イ ズ を 知 る 必要が あ り ま す。 チ ュ ーニ ン グ作業の い く つ か の段
階の中では、 次の目的でサ イ ズ に つ い て の情報が必要に な り ま す。
•
特定の ク エ リ ・ プ ラ ン に対応す る statistics i/o の レ ポー ト に つ い て
理解す る 。
•
ク エ リ ・ プ ロ セ ッ サ に よ る ク エ リ ・ プ ラ ン の選択に つ い て理解
す る 。 Adaptive Server の コ ス ト ベ ー ス の ク エ リ ・ プ ロ セ ッ サは、
使 う 可能性が あ る 各ア ク セ ス ・ メ ソ ッ ド に つ い て必要な物理 I/O
と 論理 I/O を 見積 も り 、 最 も コ ス ト の低い方法 を 選択す る 。
•
デー タ ベー ス ・ オブ ジ ェ ク ト の サ イ ズ と 、 そ の オブ ジ ェ ク ト に つ
い て予想 さ れ る I/O パ タ ー ン に基づ い て、 オブ ジ ェ ク ト の配置 を
決定す る 。
パ フ ォ ー マ ン ス を 向上 さ せ る に は、 デー タ ベー ス ・ オブ ジ ェ ク ト
を 複数のデー タ ベ ー ス ・ デバ イ ス に分散 し 、 デ ィ ス ク の読み込み
と 書き込み を 均等に分散 さ せ る 。
オブ ジ ェ ク ト の配置に つ い ては、 『パ フ ォ ー マ ン ス & チ ュ ーニ ン
グ ・ シ リ ーズ : 物理デー タ ベー ス ・ チ ュ ーニ ン グ』 の 「第 1 章
デー タ の物理的配置の制御」 を 参照。
•
パ フ ォ ー マ ン ス の変化に つ い て理解す る 。 オブ ジ ェ ク ト ・ サ イ ズ
が大き く な る と 、 パ フ ォ ー マ ン ス特性が変化す る 可能性が あ る 。
た と えば、 あ る テーブルが頻繁に使用 さ れ、 常に キ ャ ッ シ ュ に格
納 さ れて い る と す る 。 こ の テーブルが大規模に な っ て、 キ ャ ッ
シ ュ に収ま ら な く な る と 、 こ の テーブル に ア ク セ ス す る ク エ リ の
パ フ ォ ー マ ン ス が低下す る 可能性が あ る 。 複数回の ス キ ャ ン を 必
要 と す る ジ ョ イ ン では、 特に そ の可能性が高い。
•
キ ャ パ シ テ ィ に つ い て計画 を 立て る 。 新 し い シ ス テ ム を 設計す る
場合、 ま た は従来の シ ス テ ム の拡張 を 計画す る 場合は、 物理デ ィ
ス ク と メ モ リ の プ ラ ン ニ ン グ の た め に、 必要 と な る 領域に つ い て
知 っ て お く 必要が あ る 。
•
Adaptive Server Monitor Server お よ び物理 I/O 上の sp_sysmon
レ ポー ト か ら の出力に つ い て理解す る 。
サ イ ズ設定の詳細に つ い ては、 『シ ス テ ム管理ガ イ ド 第 2 巻』 を 参照
し て く だ さ い。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
23
Lava クエリ実行エンジン
Lava クエリ実行エンジン
Adaptive Server では、 実行す る すべて の ク エ リ ・ プ ラ ン が手続き型実
行エ ン ジ ン に送信 さ れ ま す。 手続き型実行エ ン ジ ン で の ク エ リ ・ プ ラ
ン の実行は次の手順で行われ ま す。
•
•
set、 while、 goto な ど の簡単な SQL を 直接実行す る 。
ク エ リ ・ プ ラ ン の ユーテ ィ リ テ ィ ・ モ ジ ュ ール を 呼び出 し て、
create table、 create index、 そ の他の ユーテ ィ リ テ ィ ・ コ マ ン ド を
実行す る 。
•
ス ト ア ド ・ プ ロ シ ー ジ ャ お よ び ト リ ガの コ ン テキ ス ト を 設定 し て
実行 を 開始す る 。
•
実行 コ ン テキ ス ト を 設定 し 、 ク エ リ 実行エ ン ジ ン を 呼び出 し て、
select、 insert、 delete、 お よ び update 文の ク エ リ ・ プ ラ ン を 実行
する。
•
カ ー ソ ルの open、 fetch、 お よ び close 文の カ ー ソ ル実行 コ ン テキ ス
ト を 設定 し 、 ク エ リ 実行エ ン ジ ン を 呼び出 し て こ れ ら の文 を 実行
する。
•
ト ラ ン ザ ク シ ョ ン処理 と 実行後 ク リ ー ン ア ッ プ を 行 う 。
現在の ア プ リ ケ ー シ ョ ン の要求に対応す る た め に、 Adaptive Server
15.0 以降の ク エ リ 実行エ ン ジ ン は全面的に書き直 さ れて い ま す。 新 し
い ク エ リ 実行エ ン ジ ン と ク エ リ ・ オプテ ィ マ イ ザ を 使用 し て い る 場
合、 Adaptive Server 15.0 以降の手続き型実行エ ン ジ ン では、 新 し い ク
エ リ ・ オプテ ィ マ イ ザに よ っ て生成 さ れたすべて の ク エ リ ・ プ ラ ン が
Lava ク エ リ 実行エ ン ジ ン に渡 さ れ ま す。
Lava ク エ リ 実行エ ン ジ ン は Lava ク エ リ ・ プ ラ ン を 実行 し ま す。 オプ
テ ィ マ イ ザに よ っ て選択 さ れたすべて の ク エ リ ・ プ ラ ン は、 Lava ク
エ リ ・ プ ラ ン に コ ン パ イ ル さ れ ま す。 ただ し 、 set や create な ど の最適
化 さ れな い SQL 文は、 Adaptive Server 15.0 よ り 前の バー ジ ョ ン の ク エ
リ ・ プ ラ ン に コ ン パ イ ル さ れ、 Lava ク エ リ 実行エ ン ジ ン では実行 さ
れ ま せん。 Lava 以外の ク エ リ ・ プ ラ ン は、 手続き型実行エ ン ジ ン に よ
り 実行 さ れ る か、 ま た はプ ロ シ ー ジ ャ ・ エ ン ジ ン か ら 呼び出 さ れ る
ユーテ ィ リ テ ィ ・ モ ジ ュ ール に よ り 実行 さ れ ま す。 Adaptive Server 15.0
以降に は 2 種類の異な る ク エ リ ・ プ ラ ン が あ り 、 こ れは showplan 出力
で確認で き ま す ( 「第 3 章 ク エ リ 最適化方式 と 見積 も り の表示」 を 参
照 )。
24
Adaptive Server Enterprise
第1章
クエリ処理の概要
Lava クエリ・プラン
Lava ク エ リ ・ プ ラ ン は、 Lava オ ペ レ ー タ の上下逆の ツ リ ー と し て構
築 さ れ ま す。 最上位の Lava オ ペ レ ー タ は 1 つ以上の子オペ レ ー タ を 持
つ こ と がで き、 そ の子オ ペ レ ー タ も 1 つ以上の子オ ペ レ ー タ を 持つ こ
と がで き る 、 と い う よ う に オペ レ ー タ の ボ ト ム ア ッ プ ・ ツ リ ーが構築
さ れ ま す。 ツ リ ー の正確な形 と そ の オペ レ ー タ は、 オプテ ィ マ イ ザに
よ っ て選択 さ れ ま す。
こ の ク エ リ の Lava ク エ リ ・ プ ラ ン の例 を 図 1-2 に示 し ま す。
Select o.id from sysobjects o, syscolumns c
where o.id <= 1 and o.id < 2
図 1-2: Lava クエリ・プラン
Emit
NestedLoopJoin
IndexScan
sysobjects(o)
IndexScan
syscolumns(c)
こ の ク エ リ の Lava ク エ リ ・ プ ラ ン は 4 つ の Lava オペ レ ー タ で構成 さ
れて い ま す。 最上位の オ ペ レ ー タ は Emit (Root と も 呼ばれ る ) オペ レ ー
タ で あ り 、 ロ ー を ク ラ イ ア ン ト に送 る か、 ま た は値 を ロ ー カ ル変数に
割 り 当て る こ と に よ っ て、 ク エ リ 実行の結果 を デ ィ ス パ ッ チ し ま す。
Emit の唯一の子オペ レ ー タ は NestedLoopJoin (NL Join) です。 こ の子オ
ペ レ ー タ は、 ネ ス ト ・ ループ ・ ジ ョ イ ン ・ ア ルゴ リ ズ ム を 使用 し て、
2 つ の子オ ペ レ ー タ (1) sysobjects の ス キ ャ ン と (2) syscolumns の ス キ ャ
ン か ら 得 ら れ る ロ ー を ジ ョ イ ン し ま す。
オプテ ィ マ イ ザはすべて の select、 insert、 delete、 お よ び update 文 を 最
適化す る の で、 こ れ ら は常に Lava ク エ リ ・ プ ラ ン に コ ン パ イ ル さ れ、
Lava ク エ リ ・ エ ン ジ ン に よ っ て実行 さ れ ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
25
Lava クエリ実行エンジン
一部の SQL 文は、 ハ イ ブ リ ッ ド ・ ク エ リ ・ プ ラ ン に コ ン パ イ ル さ れ
ま す。 こ の よ う なプ ラ ン は複数の ス テ ッ プ を 持 ち 、 そ の一部はユー
テ ィ リ テ ィ ・ モ ジ ュ ール に よ っ て実行 さ れ、 そ の最終ス テ ッ プは
Lava ク エ リ ・ プ ラ ン です。 そ の例が select into 文です。 select into は、 次
の よ う に 2 ス テ ッ プ の ク エ リ ・ プ ラ ン に コ ン パ イ ル さ れ ま す。
•
create table に よ り 文の タ ーゲ ッ ト ・ テーブルが作成 さ れ る 。
•
ロ ー を タ ーゲ ッ ト ・ テーブル に挿入す る た め の Lava ク エ リ ・ プ
ラ ン。 こ の ク エ リ ・ プ ラ ン を 実行す る た め に、 手続き型実行エ ン
ジ ン は create table ユーテ ィ リ テ ィ を 呼び出 し 、 最初の ス テ ッ プ を
実行 し てテーブル を 作成す る 。
次に、 プ ロ シ ー ジ ャ ・ エ ン ジ ン は、 Lava ク エ リ ・ プ ラ ン を 実行す る
Lava ク エ リ 実行エ ン ジ ン を 呼び出 し 、 ロ ー を 選択 し て タ ーゲ ッ ト ・
テーブル に挿入 し ま す。
ハ イ ブ リ ッ ド ・ ク エ リ ・ プ ラ ン を 生成す る 他の 2 つ の SQL 文は、 alter
table ( デー タ の コ ピ ーが必要な場合の み ) と reorg rebuild です。
Lava ク エ リ ・ プ ラ ン も 、 bcp を サポー ト す る た め に生成お よ び実行 さ
れ ま す。 Adaptive Server で の bcp の サポー ト は、 常に bcp ユーテ ィ リ
テ ィ と な り ま す。 バー ジ ョ ン 15.0 以降では、 bcp ユーテ ィ リ テ ィ が
Lava ク エ リ ・ プ ラ ン を 生成 し 、 Lava ク エ リ 実行エ ン ジ ン を 呼び出 し
てプ ラ ン を 実行 し ま す。
そ の他の Lava ク エ リ ・ プ ラ ン の例に つ い ては、 「第 2 章 showplan の
使用」 を 参照 し て く だ さ い。
Lava オペレータ
Lava ク エ リ ・ プ ラ ン は、 Lava オ ペ レ ー タ か ら 構築 さ れ ま す。 各 Lava
オ ペ レ ー タ は独立 し た ソ フ ト ウ ェ ア ・ オブ ジ ェ ク ト で あ り 、 オプテ ィ
マ イ ザが ク エ リ ・ プ ラ ン の構築に使用す る 基本物理演算の いずれか を
実装 し ま す。 各 Lava オペ レ ー タ は、 親オ ペ レ ー タ か ら 呼び出す こ と が
で き る 5 つ の メ ソ ッ ド を 持 っ て い ま す。 こ れ ら の 5 つ の メ ソ ッ ド は、
次の 5 つ の ク エ リ 実行の フ ェ ーズ に対応 し て い ま す。
26
•
Acquire
•
Open
•
Next
•
Close
•
Release
Adaptive Server Enterprise
第1章
クエリ処理の概要
Lava オ ペ レ ー タ はすべて同 じ メ ソ ッ ド ( つ ま り 同 じ API) を 備え て い
る の で、 Lava ク エ リ ・ プ ラ ン の ビ ルデ ィ ン グ ・ ブ ロ ッ ク の よ う に そ
れ ら の オペ レ ー タ を 交換で き ま す。 た と えば、 ク エ リ ・ プ ラ ン の他の
3 つ の オ ペ レ ー タ に影響 を 与え る こ と な く 、 図 1-2 の NLJoin オ ペ レ ー
タ を 、 MergeJoin オ ペ レ ー タ ま た は HashJoin オ ペ レ ー タ に置き換え る
こ と がで き ま す。
Lava ク エ リ ・ プ ラ ン を 構築す る た め に オプテ ィ マ イ ザで選択で き る
Lava オ ペ レ ー タ を 表 1-3 に示 し ま す。
表 1-3: Lava オペレータ
オペレータ
BulkOp
説明
Lava ク エ リ ・ エ ン ジ ン で行われ る bcp 処理の一部
を実行 し ま す。 bcp ユーテ ィ リ テ ィ に よ っ て作成 さ
れ る ク エ リ ・ プ ラ ン に の み存在 し 、 オプテ ィ マ イ
ザに よ り 作成 さ れ る も の に は存在 し ま せん。
CacheScanOp
メ モ リ 内テーブルか ら ロ ー を読み込み ま す。
DelTextOp
alter table drop カ ラ ム処理の一部 と し て、 text ペー
DeleteOp
ジ ・ チ ェ ー ン を削除 し ま す。
ロ ー カ ル ・ テーブルか ら ロ ー を削除 し ま す。
EmitOp (RootOp)
EmitExchangeOp
GroupSortedOp
(Aggregation)
GroupSorted (Distinct)
SQL 文全体を リ モ ー ト ・ サーバ に送 る こ と がで き
な い場合は、 プ ロ キ シ ・ テーブルか ら ロ ー を削除
し ま す。 「RemoteScanOp」 も 参照 し て く だ さ い。
ク エ リ 実行結果の ロ ー を ルー ト 指定 し ま す。 結果
を ク ラ イ ア ン ト に送信す る か、 結果値を ロ ー カ ル
変数ま たは fetch into 変数に割 り 当て る こ と がで き
ま す。 EmitOp は常に Lava ク エ リ ・ プ ラ ン の最上位
オペ レ ー タ と な り ま す。
並列実行 さ れ る サブプ ラ ン か ら の結果 ロ ー を、親プ
ラ ン ・ フ ラ グ メ ン ト の ExchangeOp に ルー ト 指定 し
ま す。 EmitExchangeOp は常に ExchangeOp の真下に
現れ ま す。 詳細に つ い ては、 「第 5 章 並列 ク エ リ 処
理」 を参照 し て く だ さ い。
入力 ロ ーが既に group-by カ ラ ム で ソ ー ト さ れて い
る 場合に、 ベ ク ト ル集合 (group by) を実行 し ま す。
「HashVectorAggOp」 も 参照 し て く だ さ い。
重複す る ロ ー を削除 し ま す。 入力 ロ ー を すべて の
カ ラ ム で ソ ー ト す る 必要が あ り ま す。
「HashDistinctOp」 お よ び 「SortOp (Distinct)」 も 参照
し て く だ さ い。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
27
Lava クエリ実行エンジン
オペレータ
HashVectorAggOp
HashDistinctOp
HashJoinOp
HashUnionOp
InsScrollOp
InsertOp
MergeJoinOp
MergeUnionOp
NestedLoopJoinOp
説明
ベ ク ト ル集合 (group by) を実行 し ま す。 Hash ア ルゴ
リ ズ ム を使用 し て入力 ロ ー を グループ化す る た め、
入力 ロ ー の 順序付 け に 関す る 要件は あ り ま せ ん。
「GroupSortedOp (Aggregation)」 も 参照 し て く だ さ い。
重複 ロ ー を検索す る た め の ハ ッ シ ュ ・ ア ルゴ リ ズ
ム を使用 し て重複 ロ ー を削除 し ま す。
「GroupSortedOp (Distinct)」 お よ び 「SortOp (Distinct)」
も 参照 し て く だ さ い。
HashJoin ア ルゴ リ ズ ム を使用 し て 2 つ の入力
ロ ー ・ ス ト リ ー ム の ジ ョ イ ン を実行 し ま す。
重複 ロ ー を検索 し て削除す る た め の ハ ッ シ ュ ・ ア
ルゴ リ ズ ム を使用 し て複数の入力 ロ ー ・ ス ト リ ー
ム の union 操作を実行 し ま す。 「MergeUnionOp」 お
よ び 「UnionAllOp」 も 参照 し て く だ さ い。
非反映型の ス ク ロ ール可能カ ー ソ ル を サポー ト す
る た め に必要な追加処理を実装 し ま す。
「SemiInsScrollOp」 も 参照 し て く だ さ い。
ロ ー カ ル ・ テーブル に ロ ー を挿入 し ま す。
SQL 文全体を リ モ ー ト ・ サーバ に送 る こ と がで き
な い場合は、 プ ロ キ シ ・ テーブル に ロ ー を挿入 し
ま す。 「RemoteScanOp」 も 参照 し て く だ さ い。
mergejoin ア ルゴ リ ズ ム を 使用 し て ジ ョ イ ン ・ カ ラ
ムで ソ ー ト さ れる ロ ーの 2 つの ス ト リ ーム の ジ ョ
イ ン を実行 し ま す。
複数の ソ ー ト さ れた入力ス ト リ ー ム で union ま た
は union all 操作を実行 し ま す。 出力ス ト リ ー ム に は
入力ス ト リ ー ム の順序付けが必ず保持 さ れ ま す。
「HashUnionOp」 お よ び 「UnionAllOp」 も 参照 し て
く だ さ い。
NestedLoopJoin ア ルゴ リ ズ ム を 使用 し て 2 つ の入力
ス ト リ ー ム の ジ ョ イ ン を実行 し ま す。
NaryNestedLoopJoinOp
拡張 さ れた NestedLoopJoin ア ルゴ リ ズ ム を使用 し
て 3 つ以上の入力ス ト リ ー ム の ジ ョ イ ン を実行 し
ま す。 こ の オペ レ ー タ は NestedLoopJoin オペ レ ー タ
の左側の深い ツ リ ー を置き換え、 一部の入力ス ト
リ ー ム の ロ ー を ス キ ッ プで き る 場合に パ フ ォ ー マ
ン ス が大幅に向上 し ま す。
OrScanOp
in ま たは or 値を メ モ リ 内テーブル に挿入 し 、 値を
ソ ー ト し て、 重複を削除 し ま す。 次に、 一度に 1
つずつ値を返 し ま す。 同 じ カ ラ ム で in 句ま たは複
数の or 句を持つ SQL 文に の み使用 さ れ ま す。
28
Adaptive Server Enterprise
第1章
オペレータ
PtnScanOp
RIDJoinOp
RIFilterOp (Direct)
RIFilterOp (Deferred)
RemoteScanOp
クエリ処理の概要
説明
ロ ー に ア ク セ ス す る た め の テーブル ・ ス キ ャ ン ま
たは イ ン デ ッ ク ス ・ ス キ ャ ン を使用 し て ロ ー カ
ル ・ テーブル ( 分割 さ れて い る か ど う か に か か わ
ら ず ) か ら ロ ー を読み込み ま す。
1 つ以上の ロ ー識別子 (RID) を左側の子オペ レ ー タ
か ら 受け取 り 、 そ の右側の子オペ レ ー タ
(PtnScanOp) を呼び出 し て、 対応す る ロ ー を検索 し
ま す。 同 じ テーブルの異な る カ ラ ム で or 句を持つ
SQL 文に の み使用 さ れ ま す。
ロ ー ご と に チ ェ ッ ク で き る 参照整合性制約を強制
す る た め に、 サブプ ラ ン の実行を開始 し ま す。
参照整合性制約を持つ テーブルの insert、 delete、
ま たは update ク エ リ に の み表示 さ れ ま す。
処理 さ れた ク エ リ の影響を受け る すべて の ロ ー の
後に の みチ ェ ッ ク で き る 参照整合性制約を強制す
る た め に、 サブプ ラ ン の実行を開始 し ま す。
プ ロ キ シ ・ テーブル に ア ク セ ス し ま す。
RemoteScanOp では次の操作を 実行で き ま す。
• ロ ー カ ル ・ ホ ス ト 上の Lava ク エ リ ・ プ ラ ン で
さ ら に処理 を行 う た め に、 ロ ー を 1 つ の プ ロ キ
シ ・ テーブルか ら 読み込む。
• insert、 delete、 update、 お よ び select 文の実行の
た め に、 完全な SQL 文を リ モ ー ト ・ ホ ス ト に渡
す。 こ の場合、 Lava ク エ リ ・ プ ラ ン は、 唯一の
子オペ レ ー タ と し て RemoteScanOp を持つ
EmitOp で構成 さ れ ま す。
RestrictOp
SQFilterOp
ScalarAggOp
SemiInsScrollOp
• 実行の た め に任意の複雑な ク エ リ ・ プ ラ ン ・ フ
ラ グ メ ン ト を リ モ ー ト ・ ホ ス ト に渡 し 、 結果
ロ ー を読み込む ( 関数を送 る )。
式を評価 し ま す。
サブプ ラ ン の実行を開始 し て、 1 つ以上のサブ ク
エ リ を実行 し ま す。
group by の な い集合関数な ど の ス カ ラ 集合を実行
し ま す。
非反映型の ス ク ロ ール可能カ ー ソ ル を サポー ト す
る た め に追加処理を実行 し ま す。 「InsScrollOp」 も
参照 し て く だ さ い。
SequencerOp
ク エ リ ・ プ ラ ン で さ ま ざ ま なサブプ ラ ン の一連の
実行を強制 し ま す。
SortOp
指定 さ れた キー に基づ い て入力 ロ ー を ソ ー ト し
ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
29
Lava クエリ実行エンジン
オペレータ
SortOp (Distinct)
StoreOp
UnionAllOp
UpdateOp
ExchangeOp
説明
入力を ソ ー ト し 、 重複 ロ ー を削除 し ま す。
「HashDistinctOp」 お よ び 「GroupSortedOp (Distinct)」
も 参照 し て く だ さ い。
ワ ー ク テーブルの フ ィ リ ン グ を作成 し て調整 し 、
必要に応 じ て ワ ー ク テーブル上に ク ラ ス タ ー ド ・
イ ンデ ッ ク ス を作成 し ま す。 StoreOp は、 子 と し て
InsertOp の み を持つ こ と がで き ま す。 InsertOp は
ワ ー ク テーブル にデー タ を入力 し ま す。
複数の入力ス ト リ ー ム で union all 操作を実行 し
ま す。 「HashUnionOp」 お よ び 「MergeUnionOp」
も 参照 し て く だ さ い。
update 文全体を リ モ ー ト ・ サーバ に送 る こ と がで
き な い場合に、 ロ ー カ ル ・ テーブル ま たはプ ロ キ
シ ・ テーブルの ロ ーで カ ラ ム の値を変更 し ま す。
「RemoteScanOp」 も 参照 し て く だ さ い。
Lava ク エ リ ・ プ ラ ン の並列実行を有効に し て調整
し ま す。 ク エ リ ・ プ ラ ン の ほ と ん ど の 2 つ の Lava
オペ レ ー タ の間に ExchangeOp を挿入 し 、 並列実
行可能なサブプ ラ ン に プ ラ ン を分け る こ と がで き
ま す。 詳細に つ い ては、 「第 5 章 並列 ク エ リ 処理」
を参照 し て く だ さ い。
Lava クエリ実行
Lava ク エ リ ・ プ ラ ン の実行に は、 次の 5 つ の フ ェ ーズが あ り ま す。
1
Acquire – メ モ リ ・ バ ッ フ ァ や ワ ー ク テーブル作成な ど の実行に必
要な リ ソ ー ス を 取得す る 。
2
Open – 結果 ロ ー を 返す準備 を 行 う 。
3
Next – 次の結果 ロ ー を 生成す る 。
4
Close – ク リ ー ン ア ッ プす る 。 た と えば、 ス キ ャ ン が完了 し た こ と
を ア ク セ ス ・ レ イ ヤ に通知 し た り 、 ワ ー ク テーブル を ト ラ ン ケ ー
ト し た り する。
5
Release – Acquire で取 り 込んだ メ モ リ ・ バ ッ フ ァ な ど の リ ソ ー ス
を 解放 し 、 ワ ー ク テーブル を 削除す る 。
各 Lava オ ペ レ ー タ は フ ェ ーズ と 同 じ 名前の メ ソ ッ ド を 持 っ て お り 、
そ の各 フ ェ ーズで呼び出 さ れ ま す。
30
Adaptive Server Enterprise
第1章
クエリ処理の概要
図 1-2 (25 ペ ー ジ ) は ク エ リ ・ プ ラ ン の実行 を 示 し て い ま す。
•
Acquire フ ェ ーズ
Emit オ ペ レ ー タ の Acquire メ ソ ッ ド を 呼び出 し ま す。 Emit オペ レ ー
タ は、 そ の子で あ る NLJoin オ ペ レ ー タ の Acquire を 呼び出 し ま す。
次に、 NLJoin オ ペ レ ー タ は左側の子オ ペ レ ー タ (sysobjects の イ ン
デ ッ ク ス ・ ス キ ャ ン ) で Acquire を 呼び出 し 、 右側の子オ ペ レ ー タ
(syscolumns の イ ン デ ッ ク ス・ス キ ャ ン ) で Acquire を 呼び出 し ま す。
•
Open フ ェ ーズ
Emit オ ペ レ ー タ の Open メ ソ ッ ド を 呼び出 し ま す。 Emit オ ペ レ ー タ
は NLJoin オペ レ ー タ で Open を 呼び出 し 、 NLJoin オ ペ レ ー タ は左
側の子オペ レ ー タ で の み Open を 呼び出 し ま す。
•
Next フ ェ ーズ
Emit オ ペ レ ー タ の Next メ ソ ッ ド を 呼び出 し ま す。 Emit は NLJoin オ
ペ レ ー タ で Next を 呼び出 し 、 NLJoin オペ レ ー タ は左側の子で あ
る sysobjects の イ ン デ ッ ク ス ・ ス キ ャ ン で Next を 呼び出 し ま す。
イ ン デ ッ ク ス ・ ス キ ャ ン ・ オペ レ ー タ は、 sysobjects か ら 最初の
ロ ー を 読み込み、 NLJoin オペ レ ー タ に返 し ま す。 次に、 NLJoin オ ペ
レ ー タ は右側の子オ ペ レ ー タ で あ る syscolumns の イ ン デ ッ ク ス ・
ス キ ャ ン の Open メ ソ ッ ド を 呼び出 し ま す。 次に、 NLJoin オ ペ レ ー
タ は syscolumns の イ ン デ ッ ク ス ・ ス キ ャ ン の Next メ ソ ッ ド を 呼び
出 し て、 sysobjects か ら ロ ー の ジ ョ イ ン ・ キー と 一致す る ロ ー を 取
得 し ま す。 一致す る ロ ーが見つ か っ た場合は、 そ の ロ ー を Emit オ
ペ レ ー タ に返 し 、 Emit オペ レ ー タ は ク ラ イ ア ン ト に それ を 返送 し
ま す。 Emit オペ レ ー タ の Next メ ソ ッ ド の呼び出 し を 繰 り 返す こ と
で、 数多 く の結果 ロ ーが生成 さ れ ま す。
•
Close フ ェ ーズ
すべて の ロ ーが返 さ れ る と 、 Emit オ ペ レ ー タ の Close メ ソ ッ ド を
呼び出 し 、 Emit オペ レ ー タ は NLJoin オ ペ レ ー タ の Close を 呼び出
し ま す。 次に、 NLJoin オペ レ ー タ がそ の両方の子オ ペ レ ー タ で
Close を 呼び出 し ま す。
•
Release フ ェ ーズ
Emit オ ペ レ ー タ の Release メ ソ ッ ド を 呼び出 し 、 他の オペ レ ー タ
の Release メ ソ ッ ド の呼び出 し を ク エ リ ・ プ ラ ン に反映 さ せ ま す。
実行の Release フ ェ ーズが完了す る と 、 Lava ク エ リ ・ エ ン ジ ン は、
文の最終処理の た め に手続き型実行エ ン ジ ン に制御 を 返 し ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
31
更新オペレーションの実行方法
更新オペレーションの実行方法
Adaptive Server は、 ロ ー を 位置付け る の に使用 さ れ る イ ン デ ッ ク ス と
デー タ に対す る 変更内容に応 じ て、 さ ま ざ ま な方法で更新 を 処理 し ま
す。 更新は、 遅延更新 と 直接更新の 2 種類に大別で き ま す。 Adaptive
Server は、 可能な かぎ り 直接更新 を 実行 し ま す。
直接更新
Adaptive Server は直接更新 を 1 つ の ス テ ッ プで処理 し ま す。 具体的に
は次の と お り です。
•
更新の影響が及ぶ イ ン デ ッ ク ス ・ ロ ー と デー タ ・ ロ ー を 位置付
け る。
•
変更に対す る ロ グ ・ レ コ ー ド を ト ラ ン ザ ク シ ョ ン ・ ロ グ に書き
込む。
•
デー タ ・ ペ ー ジ と 影響が及ぶ イ ン デ ッ ク ス ・ ペ ー ジ を 更新す る 。
直接更新に は、 次の 3 つ の手法が あ り ま す。
•
置き換え更新
•
低 コ ス ト の直接更新
•
高 コ ス ト の直接更新
直接更新は、 遅延更新よ り も オ ーバヘ ッ ド が少な く て済み、 一般的に
処理速度 も 高速です。 こ れは、 Adaptive Server がペ ー ジ を 再 フ ェ ッ チ
し て ロ グ ・ レ コ ー ド に基づ い て変更 を 実行す る 必要がな い た め、 直接
更新に よ っ て ロ グ ・ ス キ ャ ン数が限定 さ れ、 ロ グ の採取 を 少な く し 、
イ ン デ ッ ク ス の B ツ リ ー の検索 ( ロ ッ ク 競合 も 減少す る ) と I/O 回数
を 節約す る た め です。
置き換え更新
Adaptive Server は、 で き る かぎ り 置き換え更新 を 実行 し ま す。
Adaptive Server が置き換え更新 を 実行す る と き は、 ペ ー ジ上に あ る 後
続の ロ ーは移動 し ま せん。 ロ ー ID は変わ ら ず、 ロ ー ・ オ フ セ ッ ト ・
テーブル内の ポ イ ン タ も 変更 さ れ ま せん。
置き換え更新 を 実行す る に は、 次の条件がすべて満た さ れて い る 必要
が あ り ま す。
32
Adaptive Server Enterprise
第1章
クエリ処理の概要
•
変更対象の ロ ー の長 さ が変更後 も 変わ ら な い場合。
•
更新対象の カ ラ ム が、 全ペ ー ジ ロ ッ ク ・ テーブルの ク ラ ス タ ー
ド ・ イ ン デ ッ ク ス の キー か キー の一部では な い場合。 全ペー ジ
ロ ッ ク ・ テーブルの ク ラ ス タ ー ド ・ イ ン デ ッ ク ス内の ロ ーはキー
順に格納 さ れ る た め、 キー を 変更す る と ほ と ん ど の場合 ロ ー の位
置が変わ り ま す。
•
1 つ ま た は複数の イ ン デ ッ ク ス がユニー ク で あ り 、 重複 し た値が
許 さ れて い な ければな ら な い場合。
•
更新文が 「ジ ョ イ ン に よ る 更新モ ー ド の制限」 (38 ペー ジ ) に挙げ
ら れた条件 を 満た し て い る 場合。
•
更新の影響 を 受け る カ ラ ム が、 参照整合性の対象で な い場合。
•
カ ラ ム に ト リ ガ を 設定 し て い な い場合。
•
テーブル を (Replication Server を 介 し て ) 複写 し て い な い場合。
置き換え更新は更新方法の中で最 も 速い方法です。 こ れは、 デー タ ・
ペー ジ に対 し て変更が 1 つだけ行われ る た め です。 置き換え更新の影
響 を 受け る すべて の イ ン デ ッ ク ス ・ エ ン ト リ は、 古い イ ン デ ッ ク ス ・
ロ ー を 削除 し て新 し い イ ン デ ッ ク ス ・ ロ ー を 挿入す る 方法に よ っ て更
新 さ れ ま す。 置き換え更新では、 ペー ジ と ロ ー の位置が変更 さ れな い
た め、 変更 さ れ る キ ー を 持つ イ ン デ ッ ク ス だけが影響 を 受け ま す。
低コストの直接更新
Adaptive Server が置き換え更新 を 実行で き な い場合は、 低 コ ス ト の直
接更新 を 試み ま す。 低 コ ス ト の直接更新は、 ロ ー を 変更 し 、 ペー ジ上
の同 じ オ フ セ ッ ト に ロ ー を 再度書き込み ま す。 ペ ー ジ に あ る 後続の
ロ ーは前か後 ろ に移動 し て、 ペ ー ジ上のデー タ を 連続 し た ま ま に保 ち
ま すが、 ロ ー ID は変わ り ま せん。 ロ ー ・ オ フ セ ッ ト ・ テーブル内の
ポ イ ン タ は変更 さ れ、 新 し い位置 を 指 し ま す。
低 コ ス ト の直接更新は、 次の条件 を 満たす必要が あ り ま す。
•
ロ ー内のデー タ の長 さ は変わ る が、 ロ ーは更新前 と 同 じ デー タ ・
ペー ジ上に収ま る 場合。 ま た は ロ ー の長 さ は変わ ら な い が、 テー
ブル に ト リ ガが設定 さ れて い る か、 テーブルが複写 ( レ プ リ ケ ー
ト ) さ れ る 場合。
•
更新対象の カ ラ ム が、 ク ラ ス タ ー ド ・ イ ン デ ッ ク ス の キー か キー
の一部では な い場合。 Adaptive Server は ク ラ ス タ ー ド ・ イ ン デ ッ ク
ス内の ロ ー を キー順に格納す る た め、 キー を 変更す る と ほ と ん ど
の場合 ロ ー の位置が変わ り ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
33
更新オペレーションの実行方法
•
1 つ ま た は複数の イ ン デ ッ ク ス がユニー ク で あ り 、 重複 し た値が
許 さ れて い な ければな ら な い場合。
•
update 文が 「ジ ョ イ ン に よ る 更新モ ー ド の制限」 (38 ペ ー ジ ) に挙
げ ら れた条件 を 満た し て い る 場合。
•
更新の影響 を 受け る カ ラ ム が、 参照整合性の対象で な い場合。
低 コ ス ト の直接更新は、 置き換え更新 と ほぼ同 じ 速度で処理 さ れ ま す。
必要な I/O 数 も 同 じ ですが、わずか に多 く の CPU 処理 を 必要 と し ま す。
デー タ ・ ペー ジ に は 2 つ の変更 ( ロ ー と オ フ セ ッ ト ・ テーブル ) がな さ
れ ま す。 変更 さ れた イ ン デ ッ ク ス ・ キ ー は、 古い値が削除 さ れ、 新 し
い値が挿入 さ れて更新 さ れ ま す。 ペー ジ と ロ ー ID が変わ ら な い た め、
変更 さ れ る キー を 持つ イ ン デ ッ ク ス だけが更新の影響 を 受け ま す。
高コストの直接更新
デー タ が同 じ ペ ー ジ に収 ま ら な い場合、 Adaptive Server は、 高 コ ス ト
の直接更新が可能で あ れば、 それ を 実行 し ま す。 高 コ ス ト の直接更新
は、 すべて の イ ン デ ッ ク ス ・ エ ン ト リ と デー タ ・ ロ ー を 削除 し て か ら 、
変更 さ れた ロ ー と イ ン デ ッ ク ス ・ エ ン ト リ を 挿入 し ま す。
Adaptive Server は、 テ ー ブル ・ ス キ ャ ン ま た は イ ン デ ッ ク ス を 使用 し
て更新前の位置 に あ る ロ ー を 見つ け、 ロ ー を 削除 し ま す。 テ ー ブル に
ク ラ ス タ ー ド ・ イ ン デ ッ ク ス が あ る 場合、 Adaptive Server は ク ラ ス タ ー
ド ・ イ ン デ ッ ク ス を 使用 し て ロ ー の新 し い位置 を 決定 し ま す。 ク ラ ス
タ ー ド ・ イ ン デ ッ ク ス が な い場合、 Adaptive Server は ヒ ー プ の終わ り
に新 し い ロ ー を 挿入 し ま す。
高 コ ス ト の直接更新は、 次の条件 を 満たす必要が あ り ま す。
•
デー タ ・ ロ ー の長 さ が変わ る た め、 更新前 と 同 じ デー タ ・ ペ ー ジ
に収ま ら な く な り 、 ロ ー を 別の ペ ー ジ に移動 し な ければな ら な い
場合。 ま た は ク ラ ス タ ー ド ・ イ ン デ ッ ク ス の キー ・ カ ラ ム が更新
の影響 を 受け る 場合。
•
ロ ー を 見つ け る の に使われた イ ン デ ッ ク ス が更新に よ っ て変更 さ
れな い場合。
•
update 文が 「ジ ョ イ ン に よ る 更新モ ー ド の制限」 (38 ペー ジ ) に挙
げ ら れた条件 を 満た し て い る 場合。
•
更新の影響 を 受け る カ ラ ム が、 参照整合性の対象で な い場合。
高 コ ス ト の直接更新は、 直接更新の な かで最 も 遅い更新です。 delete が
実行 さ れ る デー タ ・ ペー ジ と insert が実行 さ れ る ペー ジ が異な り ま す。
ロ ー ・ ロ ケ ー シ ョ ン が変わ る た め、 すべて の イ ン デ ッ ク ス ・ エ ン ト リ
が更新 さ れ ま す。
34
Adaptive Server Enterprise
第1章
クエリ処理の概要
遅延更新
Adaptive Server は、 直接更新の条件が満た さ れな い場合に、 遅延更新
を 使用 し ま す。 遅延更新は、 更新の な かで最 も 遅い更新です。
遅延更新では、 Adaptive Server は次の こ と を 実行 し ま す。
•
更新対象のデー タ ・ ロ ー を 位置付け、 それ と 同時に、 デー タ ・ ペ ー
ジ の遅延削除 と 遅延挿入に関す る ロ グ ・ レ コ ー ド を 書き込む。
•
ト ラ ンザ ク シ ョ ン用 ロ グ ・ レ コ ー ド を 読み込み、 デー タ ・ ペ ー ジ
と 、 更新の影響が及ぶすべて の イ ン デ ッ ク ス ・ ロ ー を 削除す る 。
•
ロ グ を 再度読み込み、 デー タ ・ ペ ー ジ に 対す る すべて の挿入 を 実
行 し 、 更新の影響が及ぶすべて の イ ン デ ッ ク ス ・ ロ ー を 挿入す る 。
遅延更新が必要な場合
次の場合に は常に遅延更新が選択 さ れ ま す。
•
セル フ ジ ョ イ ン を 使用す る 更新の場合。
•
自己参照整合性の対象で あ る カ ラ ム を 更新す る 場合。
•
相関サブ ク エ リ 内で参照 さ れ る テーブル を 更新す る 場合。
次の場合に も 遅延更新が必要です。
•
テーブル ・ ス キ ャ ン ま た は ク ラ ス タ ー ド ・ イ ン デ ッ ク ス を 介 し て
テーブルが ア ク セ ス さ れて い る 間に、 更新に よ っ て ロ ーが新 し い
ペー ジ に移動す る 場合。
•
テーブル に重複す る ロ ーが許 さ れず、 こ れ を 防ぐ ユニー ク な イ ン
デ ッ ク ス が存在 し な い場合。
•
デー タ ・ ロ ー を 見つ け る の に使われ る イ ン デ ッ ク ス がユニー ク で
は な く 、 そ の更新に よ っ て ク ラ ス タ ー ド ・ イ ン デ ッ ク ス ・ キーが
変更 さ れ る た め、 ま たは新 し い ロ ーがペー ジ上に収ま ら な い た め、
ロ ーが移動す る 場合。
遅延更新では、 Adaptive Server がデー タ と イ ン デ ッ ク ス に最終的な変
更 を 行 う た め に ト ラ ン ザ ク シ ョ ン ・ ロ グ を 再度読み込ま な ければな ら
な い た め、 直接更新よ り も オーバヘ ッ ド が高 く な り ま す。 こ の た め、
余分な イ ン デ ッ ク ス ・ ツ リ ー の検索が必要に な り ま す。
た と えば、 title に ク ラ ス タ ー ド ・ イ ン デ ッ ク ス が設定 さ れて い る 場合、
次の ク エ リ は遅延更新 を 実行 し ま す。
update titles set title = "Portable C Software" where
title = "Designing Portable Software"
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
35
更新オペレーションの実行方法
インデックスの遅延挿入
Adaptive Server は、 テーブルへ の ア ク セ ス に使用 さ れ る イ ン デ ッ ク ス
ま た はユニー ク ・ イ ン デ ッ ク ス内の カ ラ ム に更新が影響す る 場合に、
イ ン デ ッ ク ス の遅延更新 を 実行 し ま す。 こ の種類の更新では、
Adaptive Server は次の処理 を 行い ま す。
•
イ ン デ ッ ク ス の エ ン ト リ を 直接モ ー ド で削除す る 。
•
デー タ ・ ペ ー ジ を 直接モ ー ド で更新 し 、 そ の イ ン デ ッ ク ス に対す
る 遅延挿入 レ コ ー ド を 書き込む。
•
そ の ト ラ ン ザ ク シ ョ ン に対す る ロ グ ・ レ コ ー ド を 読み込み、 イ ン
デ ッ ク ス の新 し い値 を 遅延モ ー ド で挿入す る 。
イ ン デ ッ ク ス の遅延挿入モ ー ド は、 ロ ー を 見つ け る の に使われ る イ ン
デ ッ ク ス が更新に よ っ て変更 さ れ る 場合、 ま た はユニー ク な イ ン デ ッ
ク ス が更新の影響 を 受け る 場合に使われ ま す。 ど の ク エ リ も 1 つ の条
件 を 満たす ロ ー を ただ一度だけ し か更新で き ま せん。 し たが っ て、 イ
ン デ ッ ク ス の遅延更新モ ー ド は、 イ ン デ ッ ク ス ・ ス キ ャ ン時に ロ ーが
一度だけ見つ か り 、 早い時期に一意性制約に違反 し な い こ と を 保証 し
ま す。
次の更新の例 ( 図 1-3 (37 ペ ー ジ ) を 参照 ) では、 姓だけが変更 さ れ ま
すが、 イ ン デ ッ ク ス ・ ロ ーが次の ペー ジ に移動 し ま す。 こ の更新では、
Adaptive Server は次の手順に従い ま す。
1
イ ン デ ッ ク ス ・ ペ ー ジ 1133 を 読み込み、 こ の ペー ジ か ら “Greene”
を 表す イ ン デ ッ ク ス ・ ロ ー を 削除 し 、 遅延 イ ン デ ッ ク ス ・ ス キ ャ
ン ・ レ コ ー ド の ロ グ を 採取 し ま す。
2
直接モ ー ド で、 デー タ ・ ペ ー ジ上の “Green” を “Hubbard” に変更
し ま す。 次に イ ン デ ッ ク ス ・ ス キ ャ ン を 続け、 更新の必要が あ る
ロ ーが他に も あ る か ど う か を 確認 し ま す。
3
1127 ペ ー ジ の “Hubbard” に新 し い イ ン デ ッ ク ス ・ ロ ー を 挿入 し
ま す。
図 1-3 は、 遅延更新の操作が実行 さ れ る 前の イ ン デ ッ ク ス と デー タ ・
ペー ジ、 お よ び遅延更新に よ っ てデー タ と イ ン デ ッ ク ス ・ ペ ー ジ が変
更 さ れ る 順序 を 示 し て い ま す。
36
Adaptive Server Enterprise
第1章
クエリ処理の概要
キー
ページ 1001
Bennet 1421,1
1007
Karsen 1411,3
1009
ポインタ
ロー ID
キー
ポインタ
ロー ID
キー
更新前:
ページ 1007
Bennet 1421,1
1132
Greane 1307,4
1133
ページ 1009
Karsen 1411,3
1315
ルート・ページ
ページ 1132
Bennet 1421,1
Chan
1129,3
Dull
1409,1
Edwards 1018,5
ページ 1133
Greane 1307,4
Green
1421,2
Greene 1409,2
ページ 1127
Hunter
1307,1
Jenkins 1242,4
中間
リーフ・ページ
ステップ 1: ログ・
レコードを書き込
んでから、イン
デックス・ローを
削除する。
ページ 1133
Greane 1307,4
Greene 1409,2
ページ 1307
14
Hunter
15
Smith
16
Ringer
17
Greane
ページ 1421
18
Bennet
19
Green
20
Yokomoto
ページ 1409
21
Dull
22
Greene
23
White
データ・ページ数
ページ 1421
18
Bennet
19
Hubbard
20
ステップ 2: デー
タ・ページを変
更する。
ステップ 3: ログ
を読み込んで、イ
ンデックス・ロー
を挿入する。
ページ 1242
10
O’Leary
11
Ringer
12
White
13
Jenkins
n
Gree
更新手順
ポインタ
図 1-3: インデックスの遅延更新
update employee
set lname = "Hubbard"
where lname = "Green"
ページ 1127
Hubbard 1421,2
Hunter
1307,1
Jenkins 1242,4
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
37
更新オペレーションの実行方法
titles テーブル に も 、 次の よ う な同様の更新が実行 さ れ る と し ま す。
update titles
set title = "Computer Phobic’s Manual",
advance = advance * 2
where title like "Computer Phob%"
こ の ク エ リ に は、 次の よ う な問題が起 こ る 可能性が あ り ま す。 title
カ ラ ム上の ノ ン ク ラ ス タ ー ド ・ イ ン デ ッ ク ス を 使用 し た ス キ ャ ン に
よ っ て “Computer Phobia Manual” が見つ か っ た た め、 本の タ イ ト ル を
変更 し 、 前払い金額 を 2 倍 し た後で、 新 し い イ ン デ ッ ク ス ・ ロ ー
“Computer Phobic's Manual” が見つ か り 、 前払い金額 を 2 倍 し た と す
る と 、 前払い金額は非常に現実離れ し た も の に な り ま す。
ス キ ャ ン す る 必要の あ る ロ グ ・ レ コ ー ド の数 と ロ グ ・ ペー ジ がキ ャ ッ
シ ュ 内に と ど ま る か ど う か に よ っ て、 遅延モ ー ド で の イ ン デ ッ ク ス の
削除は、 高 コ ス ト の直接更新よ り も 速 く な る 場合 と 遅 く な る 場合が あ
り ま す。
デー タ ・ ロ ー の遅延更新時に は、 イ ン デ ッ ク ス ・ ロ ー を 削除 し て か ら
新 し い イ ン デ ッ ク ス ・ ロ ー を 挿入す る ま で に か な り の時間的な間が生
じ る こ と が あ り ま す。 こ の合間に は、 デー タ ・ ロ ー に対応す る イ ン
デ ッ ク ス ・ ロ ーは あ り ま せん。 こ の間に独立性 レ ベル 0 でプ ロ セ ス が
イ ン デ ッ ク ス を ス キ ャ ン し た場合、 デー タ ・ ロ ー の新 し い値 も 古い値
も 返 さ れ ま せん。
ジョインによる更新モードの制限
更新対象の テーブルが、 ジ ョ イ ン 順で最 も 外側の テーブルの場合、
ま た は ジ ョ イ ン順で先行す る 他の テーブルが条件 を 満たす ロ ー を 1 つ
し か持た な い場合、 ジ ョ イ ン が関係す る 更新 と 削除は、 直接モ ー ド 、
deferred_varcol モ ー ド 、 ま た は deferred_index モ ー ド の いずれかで実行
さ れ ま す。
更新文と削除文内のジョインとサブクエリ
Transact-SQL の、 ANSI SQL に対す る 拡張の 1 つ と し て、 update 文お
よ び delete 文で の ジ ョ イ ン の実行に from 句 を 使用で き ま す。 更新 と
削除に は、 ジ ョ イ ン の代わ り に ANSI SQL 形式の サブ ク エ リ を 使用
で き ま す。
38
Adaptive Server Enterprise
第1章
クエリ処理の概要
from 構文 を 使用 し て ジ ョ イ ン を 実行す る 例 を 次に示 し ま す。
update t1 set t1.c1 = t1.c1 + 50
from t1, t2
where t1.c1 = t2.c1
and t2.c2 = 1
次の例は、 サブ ク エ リ を 使用 し た同 じ 更新 を 示 し ま す。
update t1 set c1 = c1 + 50
where t1.c1 in (select t2.c1
from t2
where t2.c2 = 1)
ジ ョ イ ン ・ ク エ リ に使 う 更新モ ー ド は、 更新テーブルが ジ ョ イ ン順で
最 も 外側の ク エ リ で あ る か ど う か に よ り ま す。 更新テーブルが最 も 外
側の テーブルでは な い場合、 更新は遅延モ ー ド で実行 さ れ ま す。 サブ
ク エ リ を 使 っ た更新は常に、 直接更新、 deferred_varcol 更新、
deferred_index 更新の いずれかで実行 さ れ ま す。
from 構文 を 含み、 ジ ョ イ ン順の た め に遅延更新 を 実行す る ク エ リ の
場合、 showplan と statistics io を 使用 し て、 サブ ク エ リ を 使用 し た ク エ
リ に書き直す こ と でパ フ ォ ー マ ン ス が改善 さ れ る か ど う か を 判断 し て
く だ さ い。 ただ し 、 from 構文 を 使用す る すべて の ク エ リ が、 サブ ク エ
リ を 使用す る 形に書き換え可能では あ り ま せん。
トリガ内での更新/削除と参照整合性
deleted ま た は inserted テーブル と ユーザ ・ テーブル と を ジ ョ イ ン す る
ト リ ガは、 遅延モ ー ド で実行 さ れ ま す。 参照整合性 を 実現す る た めだ
け に ト リ ガ を 使用 し 、 更新 と 削除 を カ ス ケ ー ド し な い場合、 ト リ ガの
代わ り に宣言型の参照整合性 を 使 う こ と に よ っ て、 ト リ ガ内で の遅延
更新の ペナルテ ィ を 回避す る こ と がで き ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
39
更新オペレーションの実行方法
更新の最適化
showplan の出力は、 更新が直接モ ー ド と 遅延モ ー ド の ど ち ら で
実行 さ れ る か に関す る 情報 を 示 し ま す。 直接更新が実行で き な い
場合、 Adaptive Server はデー タ ・ ロ ー を 遅延モ ー ド で更新 し ま す。
し か し 、 直接モ ー ド と 遅延モ ー ド の ど ち ら が実行 さ れ る か を オプテ
ィ マ イ ザが判断で き な い場合が あ り 、 こ の場合の た め に次の 2 つ の
showplan の出力が用意 さ れて い ま す。
•
“deferred_varcol” の出力は、 更新対象が可変長カ ラ ム で あ る た め、
更新に よ っ て ロ ー の長 さ が変更 さ れ る 可能性が あ る こ と を 示す。
更新後の ロ ーがペ ー ジ に収ま る 場合は、 更新は直接モ ー ド で実行
さ れ、 更新後の ロ ーがペ ー ジ に収ま ら な い場合は、 遅延モ ー ド で
実行 さ れ る 。
•
“deferred_index” の出力は、 デー タ ・ ペ ー ジ へ の変更 と イ ン デ ッ ク
ス ・ ペー ジ か ら の削除は直接モ ー ド で実行 さ れ、 イ ン デ ッ ク ス ・
ペー ジ へ の挿入は遅延モ ー ド で実行 さ れ る こ と を 示す。
直接更新の う ち ど の更新が実行 さ れ る かは、 実行時に し か わ か ら な い
情報に基づ い て決ま り ま す。 た と えば、 ロ ーがペー ジ に収 ま る か ど う
か を 判断す る に は、 ペー ジ を 実際に フ ェ ッ チ し て調べな ければな り ま
せん。
直接更新に向けた設計
ア プ リ ケ ー シ ョ ン を 設計お よ び コ ーデ ィ ン グす る と き は、 ど の よ う
な条件の違い が遅延更新 を 引き起 こ すか に つ い て注意 を 払 っ て く だ
さ い。 次の処理 を 行 う こ と で遅延更新 を 避け て く だ さ い。
40
•
テーブル に少な く と も 1 つ の ユニー ク ・ イ ン デ ッ ク ス を 作成 し
て、 直接更新が行われやす い よ う に す る 。
•
あ る キー を 更新す る と き は、 可能な かぎ り 、 where 句内ではそ の
キー以外の カ ラ ム を 使用す る 。
•
カ ラ ム に null 値 を 使用 し な い場合は、 create table 文で こ れ ら の カ
ラ ム を not null と 宣言す る 。
Adaptive Server Enterprise
第1章
クエリ処理の概要
インデックス設定と更新の種類
表 1-4 (41 ペ ー ジ ) は、 異な る 3 つ の更新で の更新モ ー ド に対す る イ ン
デ ッ ク ス に よ る 影響 を 示 し ま す。 いずれ の場合 も 重複す る ロ ーは許 さ
れて い ま せん。 イ ン デ ッ ク ス が設定 さ れて い る 場合、 イ ン デ ッ ク ス は
title_id に あ り ま す。 次に、 3 つ の更新の種類 を 示 し ま す。
•
可変長キー ・ カ ラ ム の更新
update titles set title_id = value
where title_id = "T1234"
•
キー ・ カ ラ ム以外の固定長カ ラ ム の更新
update titles set pub_date = value
where title_id = "T1234"
•
キー ・ カ ラ ム以外の可変長カ ラ ム の更新
update titles set notes = value
where title_id = "T1234"
表 1-4 は、 ユニー ク ・ イ ン デ ッ ク ス が、 同 じ キー に対 し て、 ユニー ク
で な い イ ン デ ッ ク ス よ り も い か に効果的な更新 を 行え る の か を 示 し て
い ま す。 表で網掛け さ れた部分に つ い て、 直接更新の場合 と 遅延更新
の場合 と の相違点に は、 特に注意 し て く だ さ い。 た と えば、 ユニー
ク ・ ク ラ ス タ ー ド ・ イ ン デ ッ ク ス を 使用す る と 、 更新はすべて直接
モ ー ド で実行 さ れ ま すが、 イ ン デ ッ ク ス がユニー ク で な い場合は遅延
モ ー ド で実行 さ れ ま す。
ユニー ク で な い ク ラ ス タ ー ド ・ イ ン デ ッ ク ス の あ る テーブルで も 、
テーブル内の他の いずれか の カ ラ ム に ユニー ク ・ イ ン デ ッ ク ス が あ れ
ば、 更新の パ フ ォ ー マ ン ス は向上 し ま す。 場合に よ っ ては、 テーブル
に IDENTITY カ ラ ム を 追加 し て、 ユニー ク で な い イ ン デ ッ ク ス の中の
キー と し て カ ラ ム を取 り 込む こ と がで き ま す。
表 1-4: 更新モードのインデックス設定の種類
変更対象 :
インデックス
イ ンデ ッ ク ス な し
ユニー ク ・ ク ラ ス タ ー ド ・
イ ンデ ッ ク ス
ユニー ク で な い ク ラ ス タ ー ド ・
イ ンデ ッ ク ス
ユニー ク で な い ク ラ ス タ ー ド ・
イ ン デ ッ ク ス ( 他の カ ラ ム に ユ
ニー ク ・ イ ン デ ッ ク ス あ り )
可変長キー
該当な し
direct
固定長カラム
direct
direct
可変長カラム
deferred_varcol
direct
deferred
deferred
deferred
deferred
direct
deferred_varcol
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
41
更新オペレーションの実行方法
インデックス
ユニー ク ・ ノ ン ク ラ ス タ ー ド ・
イ ンデ ッ ク ス
ユニー ク でな い ノ ン ク ラ ス
タ ー ド ・ イ ンデ ッ ク ス
変更対象 :
可変長キー
deferred_varcol
固定長カラム
direct
可変長カラム
direct
deferred_varcol
direct
deferred_varcol
イ ン デ ッ ク ス の キーが固定長で あ る 場合は、 ノ ン ク ラ ス タ ー ド ・ イ ン
デ ッ ク ス の と き に限 り 、 こ の表に示 さ れて い る 更新モ ー ド と の違い が
唯一生 じ ま す。 ユニー ク で な い ノ ン ク ラ ス タ ー ド ・ イ ン デ ッ ク ス の
場合、 キー の更新に対す る 更新モ ー ド は deferred_index に な り ま す。
ユニー ク な ノ ン ク ラ ス タ ー ド ・ イ ン デ ッ ク ス の場合は、 キー の更新に
対す る 更新モ ー ド は直接モ ー ド に な り ま す。
varchar ま た は varbinary の実際の長 さ が最大長に近い場合は、 代わ り に
char ま た は binary を 使用 し ま す。 可変長カ ラ ム が 1 つ あ る ご と に
ロ ー ・ オ ーバヘ ッ ド が加わ り 、 遅延更新が実行 さ れ る 可能性が高 く な
り ま す。
max_rows_per_page を 使用 し て ペ ー ジ あ た り に格納可能な ロ ー数 を 減
ら す と 、 直接更新が実行 さ れ る 可能性が増え ま す。 こ れは、 可変長カ
ラ ム の長 さ を 増やす更新 も 同 じ ペ ー ジ に収ま り 続け る た め です。
max_rows_per_page の使用方法の詳細に つ い ては、 『パ フ ォ ー マ ン ス
& チ ュ ーニ ン グ ・ シ リ ーズ : 物理デー タ ベー ス ・ チ ュ ーニ ン グ』 の
「全ペー ジ ロ ッ ク ・ テーブル上の max_rows_per_page の使用」 (86 ペ ー
ジ ) を 参照 し て く だ さ い。
更新をチューニングする場合の sp_sysmon の使用
showplan を 使用 し て、 更新が遅延更新ま た は直接更新の ど ち ら で あ る
か を 調べ る こ と がで き ま す。 し か し 、 showplan では、 遅延更新ま た は
直接更新の種類に つ い て、 詳 し い情報は得 ら れ ま せん。 sp_sysmon ま
た は Adaptive Server Monitor は、 サ ン プル間隔中の更新の種類に つ い
て、 詳細な統計情報 を 提供 し ま す。
更新 を チ ュ ーニ ン グす る と き に sp_sysmon を 実行 し 、 遅延更新、
ロ ッ ク 、 I/O の数が減少 し た こ と を 確認 し て く だ さ い。
『パ フ ォ ー マ ン ス & チ ュ ーニ ン グ ・ シ リ ーズ : sp_sysmon に よ る
Adaptive Server の監視』 の 「Transaction Detail ( ト ラ ン ザ ク シ ョ ン の詳
細 )」 (65 ペ ー ジ ) を 参照 し て く だ さ い。
42
Adaptive Server Enterprise
第
2
章
showplan の使用
こ の章では、 showplan ユーテ ィ リ テ ィ が出力す る メ ッ セ ー ジ に つ
い て説明 し ま す。 こ の ユーテ ィ リ テ ィ は、 バ ッ チ内ま た は ス ト ア
ド ・ プ ロ シ ー ジ ャ 内の各 SQL 文に対 し て ク エ リ ・ プ ラ ン を テキ
ス ト ・ ベ ー ス の形式で表示 し ま す。
トピック
ク エ リ ・ プ ラ ン の表示
文 レ ベルの出力
ク エ リ ・ プ ラ ン の形状
union 演算子
instead of ト リ ガ演算子
ページ
43
50
54
101
118
クエリ・プランの表示
ク エ リ ・ プ ラ ン を 表示す る に は、 次の構文 を 使用 し ま す。
set showplan on
ク エ リ ・ プ ラ ン の表示 を 停止す る に は、 次の構文 を 使用 し ま す。
set showplan off
showplan を 他の set コ マ ン ド と 組み合わせて使用で き ま す。
ス ト ア ド ・ プ ロ シ ー ジ ャ で ク エ リ ・ プ ラ ン を 表示す る だけで実行
し な い場合は、 set fmtonly コ マ ン ド を 使用 し ま す。
オプ シ ョ ン が互い に ど の よ う に影響す る か に つ い ては、 「第 12 章
抽象プ ラ ン の作成 と 使用」 を 参照 し て く だ さ い。
注意 ス ト ア ド ・ プ ロ シ ー ジ ャ で set noexec を 使用 し な い で く だ
さ い。 コ ン パ イ ル も 実行 も 行われず、 必要な出力 を 受け取れ ま
せん。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
43
クエリ・プランの表示
Adaptive Server Enterprise 15.0 以降におけるクエリ・プラン
Adaptive Server では従来、 Transact-SQL 文 を 2 つ の グループ に分類 し
て い ま す。
•
最適化で き る 項目。 た と えば、 次の ク エ リ に は多 く の関係 ( テー
ブル ) が あ る の で、 最適化で き ま す。
select * from t1, t2, t3, t4
where t1.c1 = t2.c1 and . . .
order by t3.c4
ク エ リ ・ プ ロ セ ッ サは、 ジ ョ イ ン 順、 ジ ョ イ ン の タ イ プ、 探索引
数、 順序付け の最適化 を 要求 し ま す。
•
最適化で き な い項目。 update statistics や dbcc な ど の ユーテ ィ リ
テ ィ ・ コ マ ン ド は、 最適化で き ま せん。
Adaptive Server バー ジ ョ ン 15.0 以降では、 オプテ ィ マ イ ザ と 大半の
実行エ ン ジ ン が書き直 さ れ ま し た。 ユーテ ィ リ テ ィ ・ コ マ ン ド は現
在、 以前の バー ジ ョ ン の showplan 出力 と ほぼ同 じ 出力 を 生成 し ま す。
ただ し 、 バー ジ ョ ン 15.0 以降では、 最適化可能な文の場合に は新 し い
showplan 出力 を 生成 し ま す。
showplan が表示す る ク エ リ ・ プ ラ ン の新機能に は、 た と えば次の よ う
な も の が あ り ま す。
44
•
プ ラ ン要素 - ク エ リ ・ プ ラ ン は、 30 を 超え る さ ま ざ ま な演算子で
構成で き ま す。
•
プ ラ ン形状 - ク エ リ ・ プ ラ ン は、 演算子が上下逆に な っ た ツ リ ー
形状 を 取 り ま す。 一般に、 1 つ の ク エ リ ・ プ ラ ン に含ま れ る 演算
子の数が増え る ほ ど 、 取 り 得 る ツ リ ー形状の組み合わせ の数 も 増
え ま す。 バー ジ ョ ン 15.0 以降に お け る ク エ リ ・ プ ラ ン は、 以前の
バー ジ ョ ン よ り 複雑に な る こ と が あ り ま す。 こ の よ う な ク エ リ ・
プ ラ ン の ツ リ ー形状 を 見やす く す る た め に、 ネ ス ト さ れた イ ン デ
ン ト 表示が使用 さ れ ま す。
•
並列で実行 さ れ る サブプ ラ ン。
Adaptive Server Enterprise
第2章
showplan の使用
同じクエリに対して返されるクエリ・プランがさまざまに異なるのはなぜか。
ク エ リ ・ プ ロ セ ッ サは、 allrows_oltp、 allrows_mix、 ま た は allrows_dss に
対 し て set plan optgoal が設定 さ れて い る か ど う か に応 じ て、 異な る ク
エ リ ・ プ ラ ン を 返す こ と が あ り ま す (forceplan でプ ラ ン を 強制 し て い
な い かぎ り )。
•
allrows_oltp - ク エ リ ・ プ ロ セ ッ サは、 ネ ス ト ループ ・ ジ ョ イ ン演
算子 を 使用 し ま す。
•
allrows_mix - ク エ リ ・ プ ロ セ ッ サは、 ネ ス ト ループ ・ ジ ョ イ ン と
マ ー ジ ・ ジ ョ イ ン の両方 を 許可 し ま す。 ま た、 相対 コ ス ト を 測定
し て、 使用す る ジ ョ イ ン を 判断 し ま す。
•
allrows_dss - ク エ リ ・ プ ロ セ ッ サは、 ネ ス ト ループ ・ ジ ョ イ ン 、
マ ー ジ ・ ジ ョ イ ン、 ま た はハ ッ シ ュ ・ ジ ョ イ ン を 使用 し ま す。 ま
た、 相対 コ ス ト を 測定 し て、 使用す る ジ ョ イ ン を 判断 し ま す。
noexec を指定した set showplan の使用
set showplan を 有効に し て set noexec を 使用で き ま す。 こ れ に よ り 、 ク
エ リ を 実行す る こ と な く ク エ リ ・ プ ラ ン を 表示で き ま す。 た と えば、 次
の ク エ リ は ク エ リ ・ プ ラ ン を 出力 し ま すが、 ク エ リ の実行 も 行い ま す。
こ れは時間がか か る こ と が あ り ま す。
set showplan on
go
select * from really_big_table
select * from really_really_big_table
go
ただ し 、 set noexec を 含め る と 、 ク エ リ を 実行す る こ と な く ク エ リ ・ プ
ラ ン を 表示で き ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
45
noexec を指定した set showplan の使用
ス ト ア ド ・ プ ロ シ ー ジ ャ が コ ン パ イ ル さ れ る の は、 初回 の 使用時か、
ま た は結果 と し て得 ら れ る コ ン パ イ ル済みプ ラ ン が既に別の セ ッ シ ョ
ン で使用 さ れて い る 場合です。 そ の た め、 set noexec を 実行す る と 、 期
待 し な い結果が返 さ れ る こ と が あ り ま す。 そ の代わ り に、 set fmtonly on
の使用を おすすめ し ま す。 ス ト ア ド ・ プ ロ シ ー ジ ャ を別の ス ト ア ド ・ プ
ロ シ ー ジ ャ に含め る と 、 set noexec を 有効に し て も 、 2 番目の ス ト ア ド ・
プ ロ シ ー ジ ャ は実行 さ れ ま せ ん。 た と えば、 次の よ う な 2 つ の ス ト ア
ド ・ プ ロ シ ー ジ ャ を 作成 し た と し ま す。
create procedure sp_B
as
begin
select * from authors
end
お よび
create procedure sp_A
as
begin
select * from titles
execute sp_B
end
それぞれ、 ク エ リ ・ プ ラ ン は次の よ う に な り ま す。
set showplan on
sp_B
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
STEP 1
ク エ リ の タ イ プは EXECUTE です。
文 1 (4 行目 ) の ク エ リ ・ プ ラ ン。
STEP 1
ク エ リ の タ イ プは SELECT です。
1 operator(s) under root
|ROOT:EMIT Operator (VA = 1)
|
|
|SCAN Operator (VA = 0)
|
| FROM TABLE
|
| titles
|
| テーブル ・ ス キ ャ ン です。
|
| 前方ス キ ャ ン
|
| テーブルの最初に位置付け ま す。
|
| デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
|
| デー タ ・ ペー ジ に対す る LRU で のバ ッ フ ァ 置換方式
46
Adaptive Server Enterprise
第2章
showplan の使用
set noexec が有効の場合、 次の よ う に な り ま す。
set noexec on
go
set showplan on
go
exec proc A
go
プ ロ シ ー ジ ャ B の showplan 出力は あ り ま せん。 こ れは、 noexec が有効
だか ら です。 そ の た め、 プ ロ シ ー ジ ャ B の実行 も コ ン パ イ ル も 実際に
は行われず、 showplan 出力は あ り ま せ ん。 noexec が無効で あ れば、 ス
ト ア ド ・ プ ロ シ ー ジ ャ A と B の両方に対 し て コ ン パ イ ルが行われ、 プ
ラ ン が出力 さ れ ま す。
し か し 、 set fmtonly on を 使用す る 場合、 次の よ う に な り ま す。
use pubs2
go
create procedure sp_B
as
begin
select * from authors
end
go
create procedure sp_A
as
begin
select * from titles
execute sp_B
end
go
set showplan on
go
set fmtonly on
go
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
STEP 1
ク エ リ の タ イ プは SET OPTION ON です。
sp_B
go
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
47
noexec を指定した set showplan の使用
STEP 1
ク エ リ の タ イ プは EXECUTE です。
文 1 (4 行目 ) の ク エ リ ・ プ ラ ン。
STEP 1
ク エ リ の タ イ プは SELECT です。
1 operator(s) under root
|ROOT:EMIT Operator (VA = 1)
|
|
|SCAN Operator (VA = 0)
|
| FROM TABLE
|
| authors
|
| テーブル ・ ス キ ャ ン です。
|
| 前方ス キ ャ ン
|
| テーブルの最初に位置付け ま す。
|
| デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
|
| デー タ ・ ペー ジ に対す る LRU で のバ ッ フ ァ 置換方式
au_id
au_lname
au_fname
phone
address
city
state
country
postalcode
----------------------------------------------------------------------------- ---------------------------------------------------------------------- ---------(0 rows affected)
(return status = 0)
sp_A
go
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
STEP 1
ク エ リ の タ イ プは EXECUTE です。
文 1 (4 行目 ) の ク エ リ ・ プ ラ ン。
STEP 1
48
Adaptive Server Enterprise
第2章
showplan の使用
ク エ リ の タ イ プは SELECT です。
1 operator(s) under root
|ROOT:EMIT Operator (VA = 1)
|
|
|SCAN Operator (VA = 0)
|
| FROM TABLE
|
| titles
|
| テーブル ・ ス キ ャ ン です。
|
| 前方ス キ ャ ン
|
| テーブルの最初に位置付け ま す。
|
| デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
|
| デー タ ・ ペー ジ に対す る LRU で の バ ッ フ ァ 置換方式
文 2 (5 行目 ) の ク エ リ ・ プ ラ ン。
STEP 1
ク エ リ の タ イ プは EXECUTE です。
title_id
title
type
total_sales
notes
pub_id
price
advance
pubdate
contract
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------(0 rows affected)
文 1 (4 行目 ) の ク エ リ ・ プ ラ ン。
STEP 1
ク エ リ の タ イ プは SELECT です。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
49
文レベルの出力
1 operator(s) under root
|ROOT:EMIT Operator (VA = 1)
|
|
|SCAN Operator (VA = 0)
|
| FROM TABLE
|
| authors
|
| テーブル ・ ス キ ャ ン です。
|
| 前方ス キ ャ ン
|
| テーブルの最初に位置付け ま す。
|
| デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
|
| デー タ ・ ペー ジ に対す る LRU で のバ ッ フ ァ 置換方式
au_id
au_lname
au_fname
phone
address
city
state
country
postalcode
----------------------------------------------------------------------------- -------------------------------------------------------------------------------
両方の ス ト ア ド ・ プ ロ シ ー ジ ャ が実行 さ れ、 結果 と し て showplan 出力
が表示 さ れ ま す。
文レベルの出力
各 ク エ リ ・ プ ラ ン の showplan 出力の最初の セ ク シ ョ ン に は、 文 レ ベル
の情報が提示 さ れ ま す。 こ れ に は、 ク エ リ ・ プ ラ ン を 生成 し た ク エ リ
の バ ッ チ ま た は ス ト ア ド ・ プ ロ シ ー ジ ャ 内で の文お よ び行番号 も 含 ま
れ ま す。
文 N (N 行目 ) の ク エ リ ・ プ ラ ン。
こ の メ ッ セ ー ジ の後に、 文の ク エ リ ・ プ ラ ン 全体に適用 さ れ る 一連の
メ ッ セ ー ジ が続 く こ と が あ り ま す。 ク エ リ ・ プ ラ ン が、 抽象プ ラ ン の
強制方法に つ い て の抽象プ ラ ン を 使用 し て生成 さ れた場合、 次の よ う
に な り ま す。
•
明示的な抽象プ ラ ン が、 SQL 文の plan 句で指定 さ れた場合、 メ ッ
セ ー ジ は次の よ う に な り ま す。
PLAN 句の Abstract Plan を使用 し て最適化 し ま し た。
50
Adaptive Server Enterprise
第2章
•
showplan の使用
抽象プ ラ ン が内部的に ( つ ま り 、 並列実行 さ れ る alter table と reorg
の各 コ マ ン ド に対 し て ) 生成 さ れた場合、 メ ッ セ ー ジ は次の よ う
に な り ま す。
Optimized using the forced options (internally
generated Abstract Plan).
•
新 し い文がキ ャ ッ シ ュ さ れた場合、 出力に次の も の が含ま れ
ま す。
STEP 1
ク エ リ の タ イ プは EXECUTE です。
新た に キ ャ ッ シ ュ さ れた文を実行中です。
•
キ ャ ッ シ ュ さ れた文が再利用 さ れた場合、 出力に次の も の が含ま
れ ま す。
STEP 1
ク エ リ の タ イ プは EXECUTE です。
以前に キ ャ ッ シ ュ さ れた文を実行中です。
•
ク エ リ が文 を 再 コ ン パ イ ル し た場合、 出力に次の も の が含ま れ
ま す。
QUERY PLAN IS RECOMPILED DUE TO SCHEMACT.
THE RECOMPILED QUERY PLAN IS:
. . .
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
. . .
•
抽象プ ラ ン の自動使用機能が有効の た め、 抽象プ ラ ン が
sysqueryplans か ら 取得 さ れた場合、 メ ッ セー ジ は次の よ う に な り
ま す。
Optimized using an Abstract Plan (ID : N).
•
ク エ リ ・ プ ラ ン が並列 ク エ リ ・ プ ラ ン で あ る 場合、 ク エ リ ・ プ ラ
ン の実行に必要なプ ロ セ ス数 ( コ ーデ ィ ネ ー タ と ワ ー カ ー ) が次
の メ ッ セ ー ジ に示 さ れ ま す。
Executed in parallel by coordinating process and N
worker processes.
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
51
文レベルの出力
•
シ ミ ュ レ ー ト さ れた統計 を 使用 し て ク エ リ ・ プ ラ ン が最適化 さ れ
た場合、 メ ッ セ ー ジ は次の よ う に な り ま す。
Optimized using simulated statistics.
•
出力に は VA= が含ま れ ま す。 こ れは、 演算子の仮想ア ド レ ス と 各
演算子の実行順序 を 示 し ま す。 ク エ リ ・ プ ロ セ ッ サは VA=0 か ら
始 ま り ま す。 一般に、 ス キ ャ ン ・ ノ ー ド ( リ ー フ ・ ノ ー ド ) が最初
に実行 さ れ ま す。
注意 showplan 出力に お け る VA= は Adaptive Server バー ジ ョ ン
15.0.2 ESD #2 以降で使用で き ま す。 こ れ よ り 前の バー ジ ョ ン の
Adaptive Server では、 VA= は表示 さ れ ま せん。
•
Adaptive Server では、 ク エ リ 実行時に ア ク セ ス さ れ る 各デー タ ベ ー
ス ・ オ ブ ジ ェ ク ト に 対 し て、 ス キ ャ ン 記述子が使用 さ れ ま す。 デ
フ ォ ル ト では、各接続 ( 並列 ク エ リ ・プ ラ ン の場合に は各 ワ ー カ ー・
プ ロ セ ス ) に、 ス キ ャ ン記述子が 28 個あ り ま す。 ク エ リ ・ プ ラ ン
が 28 個 を 超え る デー タ ベ ー ス ・ オブ ジ ェ ク ト に ア ク セ ス す る 必要
が あ る 場合は、 グ ロ ーバル ・ プ ールか ら 補助 ス キ ャ ン 記述子が割
り 当て ら れ ま す。 ク エ リ ・プ ラ ン が補助ス キ ャ ン記述子 を 使用す る
場合、 次の メ ッ セ ー ジ が出力 さ れ、 必要な合計数が示 さ れ ま す。
Auxiliary scan descriptors required: N
•
次の メ ッ セ ー ジ は、 ク エ リ ・ プ ラ ン に表示 さ れ る 演算子の合計数
を 示 し ま す。
N operator(s) under root
•
次の メ ッ セ ー ジ は、 ク エ リ ・ プ ラ ン の ク エ リ の タ イ プ を 示 し ま す。
ク エ リ ・ プ ラ ン の場合、 ク エ リ の タ イ プは select、 insert、 delete、 ま
た は update の いずれかです。
ク エ リ の タ イ プは SELECT です。
•
Adaptive Server で リ ソ ー ス制限が有効に設定 さ れて い る 場合、 最
後の文 レ ベルの メ ッ セ ー ジ が、 showplan 出力の最後に出力 さ れ ま
す。 メ ッ セ ー ジ に は、 論理 I/O と 物理 I/O に関す る オプテ ィ マ イ ザ
の総見積 も り コ ス ト が表示 さ れ ま す。
Total estimated I/O cost for statement
N (at line M): X.
52
Adaptive Server Enterprise
第2章
showplan の使用
次の ク エ リ は、 showplan 出力以外に、 こ れ ら の メ ッ セ ー ジ の一部 も 示
し ま す。
use pubs2
go
set showplan on
go
select stores.stor_name, sales.ord_num
from stores, sales, salesdetail
where salesdetail.stor_id = sales.stor_id
and stores.stor_id = sales.stor_id
plan " ( m_join ( i_scan salesdetailind salesdetail)
( m_join ( i_scan salesind sales ) ( sort ( t_scan stores ) ) ) )"
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
PLAN 句の Abstract Plan を使用 し て最適化 し ま し た。
STEP 1
ク エ リ の タ イ プは SELECT です。
6 operator(s) under root
ROOT:EMIT Operator (VA = 6)
|MERGE JOIN Operator (Join Type: Inner Join) (VA = 5)
| 内部記憶領域 と し て Worktable3 を使用 し て い ま す。
| Key Count: 1
| Key Ordering: ASC
|
|
|SCAN Operator (VA = 0)
|
| FROM TABLE
|
| salesdetail
|
| イ ン デ ッ ク ス : salesdetailind
|
| 前方ス キ ャ ン
|
| テーブルの最初に位置付け ま す。
|
| イ ン デ ッ ク ス に は、 必要な カ ラ ム がすべて含ま れて い ま す。 ベー ス ・ テーブルは読み込 ま
れ ま せん。
|
| イ ン デ ッ ク ス の リ ー フ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
|
| イ ン デ ッ ク ス の リ ー フ ・ ペー ジ に対す る LRU で のバ ッ フ ァ 置換方式
|
|
|MERGE JOIN Operator (Join Type: Inner Join) (VA = 4)
|
| 内部記憶領域 と し て Worktable2 を使用 し て い ま す。
|
| Key Count: 1
|
| Key Ordering: ASC
|
|
|
|
|SCAN Operator (VA = 1)
|
|
| FROM TABLE
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
53
クエリ・プランの形状
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
sales
テーブル ・ ス キ ャ ン です。
前方ス キ ャ ン
テーブルの最初に位置付け ま す。
デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
デー タ ・ ペー ジ に対す る LRU で のバ ッ フ ァ 置換方式
|SORT Operator (VA = 3)
| 内部記憶領域 と し て Worktable1 を使用 し て い ま す。
|
|
|SCAN Operator (VA = 2)
|
| FROM TABLE
|
| stores
|
| テーブル ・ ス キ ャ ン です。
|
| 前方ス キ ャ ン
|
| テーブルの最初に位置付け ま す。
|
| デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
|
| デー タ ・ ペー ジ に対す る LRU で の バ ッ フ ァ 置換方式
文 レ ベルの出力の後に、 ク エ リ ・ プ ラ ン が表示 さ れ ま す。 ク エ リ ・ プ
ラ ン の showplan 出力は、 2 つ の構成要素で構成 さ れ ま す。
•
演算子名 ( 追加情報が提供 さ れ る こ と も あ り ま す )。 こ れは、 ク エ
リ ・ プ ラ ン で実行中の演算子 を 示 し ま す。
•
イ ン デ ン ト さ れた縦線 (“|” 記号 )。 こ れは、 ク エ リ ・ プ ラ ン演算
子ツ リ ー の形状 を 示 し ま す。
クエリ・プランの形状
ツ リ ー に お け る 各演算子の位置に よ っ て、 実行順序が決ま り ま す。
ツ リ ー の左端の ブ ラ ン チ か ら 実行 さ れ始め、 右に向か っ て進ん で い き
ま す。 実行の様子 を 示すた め に、 こ の セ ク シ ョ ン では前の セ ク シ ョ ン
で示 し た例で の ク エ リ ・ プ ラ ン の実行 を 順 を 追 っ て段階的に示 し ま
す。 図 2-1 は ク エ リ ・ プ ラ ン を 図で表 し た も の です。
54
Adaptive Server Enterprise
第2章
showplan の使用
図 2-1: クエリ・プラン
EMIT
VA=
MERGE JOIN (1)
内部ジョイン
VA=
SCAN
salesdetailind
VA=
MERGE JOIN (2)
内部ジョイン
VA=
SORT
VA=
SCAN
sales
VA=
SCAN
stores
VA=
結果 ロ ー を 生成す る た め に、 EMIT 演算子はそ の子で あ る MERGE JOIN
演算子 (1) か ら ロ ー を 呼び出 し ま す。 そ し て 今度 は、 こ の 演算子が
salesdetailind の た め に左側の子で あ る SCAN 演算子か ら ロ ー を 呼び出 し
ま す。 EMIT が左側の子か ら ロ ー を 受け取 る と 、 MERGE JOIN 演算子 (1)
は右側 の 子で あ る MERGE JOIN 演算子 (2) か ら ロ ー を 呼び出 し ま す。
MERGE JOIN 演算子 (2) は、 sales の た め に左側の子で あ る SCAN 演算子
か ら ロ ー を 呼び出 し ま す。
MERGE JOIN 演算子 (2) は、 左側の子か ら ロ ー を 受け取 る と 、 右側の子
で あ る SCAN 演算子か ら ロ ー を 呼び出 し ま す。 SCAN 演算子は、 デー タ ・
ブ ロ ッ ク ・ オ ペ レ ー タ です。 つ ま り 、 入力 ロ ー を ソ ー ト で き る よ う に
な る 前に、 入力 ロ ー を すべて入手す る 必要が あ り ま す。 そ の た め、 SORT
演算子は、 stores の た め に子で あ る SCAN 演算子か ら ロ ー を 呼び出 し
続け ま す。 こ れは、 ロ ーがすべて返 さ れ る ま で続き ま す。 そ し て、 SORT
演算子は、 こ れ ら の ロ ー を ソ ー ト し て最初の ロ ー を MERGE JOIN 演算
子 (2) に渡 し ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
55
クエリ・プランの形状
MERGE JOIN 演算子 (2) は、 ジ ョ イ ン ・ キー に関 し て一致す る 2 つ の
ロ ー を 取得す る ま で、 左右の子演算子の ど ち ら か一方か ら ロ ー を 呼び
出 し 続け ま す。 次に、 一致す る ロ ーは MERGE JOIN 演算子 (1) に渡 さ れ
ま す。 MERGE JOIN 演算子 (1) も 、 一致す る も の が見つ か る ま で、 子演
算子か ら ロ ー を 呼び出 し 続け ま す。 見つ か っ た ロ ーは、 EMIT 演算子
に渡 さ れ、 ク ラ イ ア ン ト に返 さ れ ま す。 実際は、 こ れ ら の演算子は左
側が深い ポ ス ト フ ィ ッ ク ス再帰方式 を 使用 し て処理 さ れ ま す。
図 2-2 は、 同 じ ク エ リ 例に対す る 別の ク エ リ ・ プ ラ ン を 図で表 し た も
の です。 こ の ク エ リ ・ プ ラ ン に は、 同 じ 演算子がすべて含ま れて い ま
すが、 ツ リ ー の形状は異な り ま す。
図 2-2: 別のクエリ・プラン
EMIT
VA=
MergeJoinOp(1)
内部ジョイン
VA=
MergeJoinOp(2)
内部ジョイン
VA=
ScanOp
sales
VA=
ScanOp
salesdetailind
VA=
SortOp
VA=
ScanOp
stores
VA=
56
Adaptive Server Enterprise
第2章
showplan の使用
図 2-2 の ク エ リ ・ プ ラ ン に対応す る showplan 出力は、 次の と お り です。
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
6 operator(s) under root
ク エ リ の タ イ プは SELECT です。
ROOT:EMIT Operator
|MERGE JOIN Operator (Join Type: Inner Join)
| 内部記憶領域 と し て Worktable3 を使用 し て い ま す。
| Key Count: 1
| Key Ordering: ASC
|
|
|MERGE JOIN Operator (Join Type: Inner Join)
|
| 内部記憶領域 と し て Worktable2 を使用 し て い ま す。
|
| Key Count: 1
|
| Key Ordering: ASC
|
|
|
|
|SCAN Operator
|
|
| FROM TABLE
|
|
| sales
|
|
| テーブル ・ ス キ ャ ン です。
|
|
| 前方ス キ ャ ン
|
|
| テーブルの最初に位置付け ま す。
|
|
| デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
|
|
| デー タ ・ ペー ジ に対す る LRU で のバ ッ フ ァ 置換方式
|
|
|
|
|SORT Operator
|
|
| 内部記憶領域 と し て Worktable1 を使用 し て い ま す。
|
|
|
|
|
|
|SCAN Operator
|
|
|
| FROM TABLE
|
|
|
| stores
|
|
|
| テーブル ・ ス キ ャ ン です。
|
|
|
| 前方ス キ ャ ン
|
|
|
| テーブルの最初に位置付け ま す。
|
|
|
| デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
|
|
|
| デー タ ・ ペー ジ に対す る LRU で のバ ッ フ ァ 置換方式
|
|
|SCAN Operator
|
| FROM TABLE
|
| salesdetail
|
| イ ン デ ッ ク ス : salesdetailind
|
| 前方ス キ ャ ン
|
| テーブルの最初に位置付け ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
57
クエリ・プランの形状
|
|
れ ま せん。
|
|
|
|
イ ン デ ッ ク ス に は、 必要な カ ラ ム がすべて含ま れて い ま す。 ベー ス ・ テーブルは読み込ま
イ ン デ ッ ク ス の リ ー フ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
イ ン デ ッ ク ス の リ ー フ ・ ペー ジ に対す る LRU で の バ ッ フ ァ 置換方式
showplan 出力は、 イ ン デ ン ト と パ イ プ (“|”) 記号で ク エ リ ・ プ ラ ン の形
状 を 伝え ま す。 こ れ ら に よ っ て、 ど の演算子が ど の演算子の下に く る
の か、 お よ び ど の演算子が ツ リ ー の同 じ ブ ラ ン チ ま た は別の ブ ラ ン チ
に く る の かが示 さ れ ま す。 ツ リ ー の形状 を 解釈す る た め のルールが 2
つ あ り ま す。
•
パ イ プ (“|”) 記号は、 演算子名か ら 始ま る 垂直線 を 形成 し て、 同 じ
ブ ラ ン チ上でそ の下に あ る すべて の演算子の横 を 通過 し て下に伸
びて い き ま す。
•
子演算子は、 ネ ス ト の各 レ ベルで左に イ ン デ ン ト さ れ ま す。
こ れ ら の ルール を 使用す る と 、 図 2-2 の ク エ リ ・ プ ラ ン の形状 を 前の
showplan 出力か ら 導き出す こ と がで き ま す。 そ の手順は次の と お り
です。
1
演算子 ROOT ま た は EMIT が、 ク エ リ ・ プ ラ ン ・ ツ リ ー の最上部に
あ り ま す。
2
MERGE JOIN 演算子 (1) は、 ROOT の左側の子です。 MERGE JOIN 演
算子 (1) か ら 始ま る 垂直線が、 出力全体の長 さ 分だけ下に伸びて
い き、 そ の他すべて の演算子は、 MERGE JOIN 演算子 (1) の下位 と
な り 同 じ ブ ラ ン チ上に き ま す。
3
MERGE JOIN 演算子 (1) の左側の子演算子は、 MERGE JOIN 演算子
(2) です。
4
MERGE JOIN 演算子 (2) か ら 始ま る 垂直線が、 SCAN、 SORT、 お よ び
も う 1 つ の SCAN 演算子の横 を 通過 し て下に伸びて い き、 停止 し
ま す。 こ れ ら の演算子はすべて、 MERGE JOIN 演算子 (2) の サブブ
ラ ン チ と し て ネ ス ト さ れ ま す。
58
5
MERGE JOIN 演算子 (2) 下の最初の SCAN 演算子は、 左側の子で あ
る sales テーブルの SCAN 演算子です。
6
MERGE JOIN 演算子 (2) の右側の子は、SORT 演算子です。stores テー
ブルの SCAN は、 SORT 演算子の唯一の子です。
7
複数の垂直線が、 stores テーブルの SCAN の出力の下ま で伸びて停
止 し ま す。 こ れは、 ツ リ ー の 1 つ の ブ ラ ン チが こ こ で終了 し た こ
と を 意味 し ま す。
Adaptive Server Enterprise
第2章
8
showplan の使用
次の出力は、 salesdetail テーブルの SCAN の出力です。 こ の イ ン デ
ン ト は、 MERGE JOIN 演算子 (2) の場合 と 同 じ で あ り 、 同 じ レ ベル
上に あ る こ と を 示 し ま す。 実際、 こ の SCAN は、 MERGE JOIN 演算
子 (1) の右側の子です。
注意 大半の演算子は、 単項か二項の ど ち ら かです。 つ ま り 、 直下に子
演算子が 1 つ か 2 つ存在 し ま す。 子演算子が 3 つ以上あ る 演算子は、
「N 項」 と 呼ばれ ま す。 子演算子がな い演算子は、 ツ リ ー の リ ー フ 演算
子で あ り 、 「null 項オ ペ レ ー タ 」 と 呼ばれ ま す。
ク エ リ ・ プ ラ ン を 図示す る 別の方法は、 コ マ ン ド set statistics plancost
on を 使用す る こ と です。 詳細に つ い ては、 『ASE リ フ ァ レ ン ス ・ マ
ニ ュ ア ル : コ マ ン ド 』 を 参照 し て く だ さ い。 こ の コ マ ン ド は、 ク エ リ ・
プ ラ ン内の見積 も り コ ス ト と 実際の コ ス ト を 比較す る た め に使用 さ れ
ま す。 ク エ リ ・ プ ラ ン ・ ツ リ ー を あ る 程度グ ラ フ ィ カ ルな ツ リ ー表現
と し て出力 し ま す。 ク エ リ の パ フ ォ ー マ ン ス問題の診断に便利な ツ ー
ルです。
クエリ・プラン演算子
ク エ リ ・ プ ラ ン演算子 と それぞれの説明 を 表 1-3 (27 ペ ー ジ ) に示 し ま
す。 こ の セ ク シ ョ ン では、 各演算子に関 し て詳細な情報 を 提供す る 追
加 メ ッ セ ー ジ に つ い て説明 し ま す。
EMIT 演算子
EMIT 演算子は、 各 ク エ リ ・ プ ラ ン の最上部に表示 さ れ ま す。 ク エ リ ・
プ ラ ン ・ ツ リ ー のルー ト で あ り 、 子演算子が正確に 1 つ常に存在 し ま
す。 EMIT 演算子は、 ク エ リ の結果 ロ ー を ルー ト 指定 し ま す。 具体的に
は、 結果 ロ ー を ク ラ イ ア ン ト ( 任意の ア プ リ ケ ー シ ョ ン ま た は別の
Adaptive Server イ ン ス タ ン ス ) に送 る か、 結果 ロ ー の値 を ロ ー カ ル変
数ま た は fetch into 変数に割 り 当て ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
59
クエリ・プランの形状
SCAN 演算子
SCAN 演算子は、 ロ ー を ク エ リ ・ プ ラ ン に読み込ん で、 ク エ リ ・ プ ラ
ン内の別の演算子が さ ら に処理で き る よ う に し ま す。 SCAN 演算子は
リ ー フ 演算子です。 つ ま り 、 子演算子は存在 し ま せん。 ロ ー を 複数の
ソ ー ス か ら 読み込む こ と がで き ま す。 そ の た め、 ソ ー ス を 特定す る
showplan メ ッ セ ー ジ の後に、 FROM メ ッ セ ー ジ が常に続き、 実行中の
SCAN を 明示 し ま す。 FROM メ ッ セ ー ジ は、 次の と お り です。 FROM
CACHE、 FROM OR、 FROM LIST、 FROM TABLE です。
FROM cache メッセージ
こ の メ ッ セ ー ジ は、 CACHE SCAN 演算子が、 単一 ロ ー の メ モ リ 内テー
ブル を 読み込み中で あ る こ と を 示 し ま す。
FROM OR リスト
OR リ ス ト に は、 ロ ーが N 個あ り ま す。 ク エ リ で指定 さ れた別個の OR
値 ま た は IN 値それぞれ に対 し て、 1 つ の ロ ーが対応 し ま す。
最初の メ ッ セー ジ は、 OR ス キ ャ ン が ロ ー を メ モ リ 内テーブルか ら 読み
込ん で い る こ と を 示 し ま す。 こ の テーブル に は、 1 つ の IN リ ス ト ま た
は複数の or 句の値が、 同 じ カ ラ ム に格納 さ れて い ま す。 OR リ ス ト は、
in リ ス ト に対 し て特殊な or 方式 を 使用す る ク エ リ ・ プ ラ ン内に の み表
示 さ れ ま す。 2 番目の メ ッ セ ー ジ は、 メ モ リ 内テ ー ブル の最大 ロ ー数
(N) を 示 し ま す。 OR リ ス ト は、 メ モ リ 内テーブル を 埋め る と き に重複値
を 削除す る の で、 N は SQL 文に表示 さ れ る 値の個数よ り 少な く な る こ
と が あ り ま す。 た と えば、 次の ク エ リ は、 特殊な or 方式 と OR リ ス ト を
使用す る ク エ リ ・ プ ラ ン を 生成 し ま す。
select s.id from sysobjects s where s.id in (1, 0, 1, 2, 3)
go
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
STEP 1
ク エ リ の タ イ プは SELECT です。
4 operator(s) under root
ROOT:EMIT Operator (VA = 4)
60
Adaptive Server Enterprise
第2章
showplan の使用
|NESTED LOOP JOIN Operator (VA = 3) (Join Type: Inner Join)
|
|
|SCAN Operator (VA = 2)
|
| FROM OR List
|
| OR リ ス ト に は最大 5 ロ ー の OR/IN 値が あ り ま す。
|
|
|RESTRICT Operator (VA = 2)(0)(0)(0)(8)(0)
|
|
|SCAN Operator (VA = 1)
|
|
| FROM TABLE
|
|
| sysobjects
|
|
| s
|
|
| ク ラ ス タ ー ド ・ イ ン デ ッ ク ス を使用 し て い ま す。
|
|
| イ ン デ ッ ク ス : csysobjects
|
|
| 前方ス キ ャ ン
|
|
| キー に よ っ て位置付け ま す。
|
|
| イ ン デ ッ ク ス に は、 必要な カ ラ ム がすべて含ま れて い ま す。 ベー ス ・ テーブルは読み
込ま れ ま せん。
|
|
| Keys are:
|
|
| id ASC
|
|
| イ ン デ ッ ク ス の リ ー フ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま
す。
|
|
| イ ン デ ッ ク ス の リ ー フ ・ ペー ジ に対す る LRU で の バ ッ フ ァ 置換方式
こ の例では、 IN リ ス ト に値が 5 つ あ り ま すが、 4 つ の み他 と 異な り ま
す。 そ の た め、 OR リ ス ト は 4 つ の他 と 異な る 値の み を メ モ リ 内テーブ
ル に 入れ ま す。 ク エ リ ・ プ ラ ン 例 で は、 OR リ ス ト は、 NESTED LOOP
JOIN 演算子の左側の子演算子で あ り 、 SCAN 演算子は、 NESTED LOOP
JOIN 演算子の右側の子演算子です。 こ の プ ラ ン を 実行す る と 、 NESTED
LOOP JOIN 演算子は、 or コ マ ン ド を 呼び出 し て、 メ モ リ 内テーブル の
ロ ー を 1 つ返 し ま す。 次に、 SCAN 演算子 を 呼び出 し て、 検索用 ク ラ ス
タ ー ド ・ イ ン デ ッ ク ス を 使用 し 一致す る ロ ー を すべて見つ け ま す ( 一
度に 1 つずつ )。 こ の ク エ リ ・ プ ラ ン例は、 sysobjects の すべて の ロ ー を
読み込ん で か ら 、 各 ロ ー の sysobjects.id 値 を IN リ ス ト の 5 つ の値 と 比
較す る よ り 、 は る か に効率的です。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
61
クエリ・プランの形状
FROM TABLE
FROM TABLE は、 PARTITION SCAN 演算子がデー タ ベ ー ス ・ テーブル の
読み込み中で あ る こ と を 示 し ま す。 2 番目の メ ッ セ ー ジ に テ ー ブル名
が示 さ れ、 相関名が あ れば、 次の行 に 出力 さ れ ま す。 前の出力例 に 示
し た FROM TABLE メ ッ セ ー ジ の下では、 sysobjects がテーブル名、 s が
相関名で す。 前 の 例で は、 FROM TABLE メ ッ セ ー ジ の 下 に 追加 の メ ッ
セ ー ジ も 表示 さ れ て い ま す。 こ れ ら の メ ッ セ ー ジ か ら 、 PARTITION
SCAN 演 算 子 が、 ス キ ャ ン 中 の テ ー ブ ル か ら ロ ー を 取 得 す る よ う
Adaptive Server の ア ク セ ス層 に指示す る 方法 に つ い て の詳細 を 知 る こ
と がで き ま す。
次に示す メ ッ セ ー ジ は、 ス キ ャ ン がテーブル ・ ス キ ャ ン な の か イ ン
デ ッ ク ス ・ ス キ ャ ン な の か を 示 し ま す。
•
Table Scan - テーブル の ペ ー ジ を読み込む こ と で ロ ーが フ ェ ッ チ
さ れ ま す。
•
Using Clustered Index - テーブルの ロ ー の フ ェ ッ チ に ク ラ ス
タ ー ド ・ イ ン デ ッ ク ス が使用 さ れ ま す。
•
Index: indexname - テーブルの ロ ー の フ ェ ッ チ に イ ン デ ッ ク ス が使
用 さ れ ま す。 こ の メ ッ セ ー ジ の前に "using clustered index"
がな い場合、 ノ ン ク ラ ス タ ー ド ・ イ ン デ ッ ク ス が使用 さ れ ま す。
indexname は、 使用 さ れ る イ ン デ ッ ク ス の名前です。
こ れ ら の メ ッ セ ー ジ は、 テーブル ・ ス キ ャ ン ま た は イ ン デ ッ ク ス ・ ス
キ ャ ン の方向 を 示 し ま す。 ス キ ャ ン の方向は、 イ ン デ ッ ク ス作成時に
指定 さ れた順序、 お よ び order by 句で カ ラ ム に対 し て指定 さ れた順序、
ま た はそ の他の有益な順序に基づ い て決ま り ま す。 こ の有益な順序 と
は、 演算子が ク エ リ ・ プ ラ ン内で さ ら に有効に使用で き る 順序の こ と
です (merge-join 方式に対す る ソ ー ト さ れた順序な ど )。
order by 句に イ ン デ ッ ク ス ・ キー に関す る 昇順ま た は降順の修飾子が
含 ま れて い る 場合 (create index 句の修飾子 と は正反対 ) に は、 後方ス
キ ャ ン を 使用す る こ と がで き ま す。
Forward scan
Backward scan
62
Adaptive Server Enterprise
第2章
showplan の使用
ス キ ャ ン方向の メ ッ セ ー ジ の後に、 テーブルへ の ア ク セ ス ま た は イ ン
デ ッ ク ス の リ ー フ ・ レ ベルへ の ア ク セ ス が ど の よ う に実行 さ れ る の か
を 示す メ ッ セ ー ジ を 配置 し ま す。
•
Positioning at start of table - テーブル ・ ス キ ャ ン が、
テーブルの最初の ロ ー か ら 始ま っ て前に進み ま す。
•
Positioning at end of table - テーブル ・ ス キ ャ ン が、 テー
ブルの最後の ロ ー か ら 始 ま っ て さ か のぼ っ て い き ま す。
•
Positioning by key - 最初に条件に合 う ロ ー に ス キ ャ ン を 配置
す る た め に、 イ ン デ ッ ク ス が使用 さ れ ま す。
•
Positioning at index start/Positioning at index end -
こ れ ら の メ ッ セ ー ジ は、 テーブル ・ ス キ ャ ン の対応す る メ ッ セー
ジ と 同 じ ですが、 テーブルでは な く イ ン デ ッ ク ス が ス キ ャ ン さ れ
ま す。
ク エ リ の性質の た め に ス キ ャ ン を 制限で き る 場合、 次の メ ッ セー ジ が
そ の方法 を 示 し ま す。
•
Scanning only the last page of the table - ス キ ャ ン が イ
ン デ ッ ク ス を 使用 し て、 ス カ ラ 集合の最大値 を 検索 し て い る 場合
に表示 さ れ ま す。 イ ン デ ッ ク ス が、 最大値が見つ か っ た カ ラ ム に
あ り 、 イ ン デ ッ ク ス値が昇順の場合、 最大値は最後の ペー ジ に あ
り ま す。
•
Scanning only up to the first qualifying row - ス キ ャ ン
が イ ン デ ッ ク ス を 使用 し て、 ス カ ラ 集合の最小値 を 検索 し て い る
場合に表示 さ れ ま す。
注意 イ ン デ ッ ク ス ・ キーが降順に ソ ー ト さ れ る 場合、 最小集合 と 最
大集合に対す る 上記 メ ッ セ ー ジ は、 順序が反対に な り ま す。
場合に よ っ ては、 ク エ リ で必要 と さ れ る テーブルの カ ラ ム がすべて、
ス キ ャ ン中の イ ン デ ッ ク ス に含 ま れ る こ と が あ り ま す。 こ の よ う な場
合は、 次の メ ッ セ ー ジ が出力 さ れ ま す。
イ ンデ ッ ク ス に は、 必要な カ ラ ムがすべて含ま れて い ま す。 ベー ス ・
テーブルは読み込ま れ ま せん。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
63
クエリ・プランの形状
ク エ リ が必要 と す る カ ラ ム がすべて イ ン デ ッ ク ス に含ま れ る 場合、
オプテ ィ マ イ ザは、 イ ン デ ッ ク ス ・ カ ラ ム に有益な キーがな く て も 、
Table Scan では な く Index Scan を 選択す る こ と が あ り ま す。 イ ン
デ ッ ク ス の読み込み に必要な I/O の量は、 ベ ー ス ・ テーブル の読み込
み に必要な量よ り は る か に少 く な る こ と が あ り ま す。 読み込み対象の
ベー ス ・ テーブル ・ ペー ジ を 必要 と し な い イ ン デ ッ ク ス ・ ス キ ャ ン
は、 「カ バー ド ・ イ ン デ ッ ク ス ・ ス キ ャ ン」 と 呼ばれ ま す。
index scan が、 キー を 使用 し て ス キ ャ ン を 配置す る 場合、 次の メ ッ
セ ー ジ が出力 さ れ ま す。
Keys are:
Key <ASC/DESC>
こ の メ ッ セ ー ジ は、 キー ( 固有の出力行上の各キー ) と し て使用 さ れ
る カ ラ ム の名前 を 示 し ま す。 ま た、 そ の key に関す る イ ン デ ッ ク ス順
序 を 昇順な ら ASC、 降順な ら DESC で示 し ま す。
scan 演算子が使用中の ア ク セ ス の タ イ プ を 記述す る メ ッ セ ー ジ の後
に、 I/O サ イ ズ と バ ッ フ ァ ・ キ ャ ッ シ ュ 方式に つ い て の メ ッ セ ー ジ が
出力 さ れ ま す。
I/O サイズのメッセージ
I/O メ ッ セ ー ジ は次の と お り です。
デー タ ・ ペー ジ に対 し て N キ ロ バ イ ト を使用 し て い ま す。
イ ンデ ッ ク ス ・ リ ー フ ・ ペー ジ に対 し て N キ ロ バ イ ト を使用 し て い ま
す。
こ れ ら の メ ッ セ ー ジ は、 ク エ リ で使用 さ れ る I/O サ イ ズ を 出力 し ま す。
使用で き る I/O サ イ ズは、 2、 4、 8、 16 KB です。
ク エ リ で使用 さ れて い る テーブル、 イ ン デ ッ ク ス、 ま た はデー タ ベ ー
ス が、 大容量 I/O プール を 持つデー タ ・ キ ャ ッ シ ュ を 使用す る 場合、
オプテ ィ マ イ ザは大容量 I/O を 選択で き ま す。 1 つ の I/O サ イ ズ を 使用
し て イ ン デ ッ ク ス の リ ー フ ・ ペ ー ジ を 読み込み、 別のサ イ ズ を 使用 し
てデー タ ・ ペー ジ を 読み込む よ う に選択で き ま す。 そ の選択は、
キ ャ ッ シ ュ 内で使用可能な プール ・ サ イ ズ、 読み込むペー ジ数、 オブ
ジ ェ ク ト の キ ャ ッ シ ュ ・ バ イ ン ド 、 テーブルや イ ン デ ッ ク ス ・ ペ ー ジ
の ク ラ ス タ 率に よ っ て異な り ま す。
64
Adaptive Server Enterprise
第2章
showplan の使用
こ れ ら の メ ッ セ ー ジ の一方 ( ま た は両方 ) が、 SCAN 演算子の showplan
出力に表示 さ れ る こ と が あ り ま す。 テーブル ・ ス キ ャ ン の場合、 最初
の メ ッ セ ー ジ の み出力 さ れ ま す。 カ バー ド ・ イ ン デ ッ ク ス ・ ス キ ャ ン
の場合に は、 2 番目の メ ッ セ ー ジ の み出力 さ れ ま す。 ベー ス ・ テーブ
ル ・ ア ク セ ス を 必要 と す る Index Scan の場合、 両方の メ ッ セ ー ジ が
出力 さ れ ま す。
I/O サ イ ズ の各 メ ッ セ ー ジ の後に、 キ ャ ッ シ ュ 方式 メ ッ セー ジ が出力
さ れ ま す。
デー タ ・ ペー ジ に対す る <LRU/MRU> で の バ ッ フ ァ 置換方式
イ ンデ ッ ク ス の リ ー フ ・ ペー ジ に対す る <LRU/MRU> で の バ ッ フ ァ
置換方式
LRU 置換方式では、 最後に ア ク セ ス さ れた ペ ー ジ が、 で き る かぎ り
長期間保持 さ れ る キ ャ ッ シ ュ に配置 さ れ ま す。 MRU 置換方式では、 最
後に ア ク セ ス さ れた ペー ジ が、 す ぐ に置換 さ れ る キ ャ ッ シ ュ に配置 さ
れ ま す。
サ ン プル と な る I/O と キ ャ ッ シ ュ ・ メ ッ セ ー ジ を 次の ク エ リ に示 し
ま す。
use pubs2
go
set showplan on
go
select au_fname, au_lname, au_id from authors
where au_lname = "Williams"
go
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
1 operator(s) under root
ク エ リ の タ イ プは SELECT です。
ROOT:EMIT Operator (VA = 1)
|SCAN Operator (VA = 0)
| FROM TABLE
| authors
| イ ンデ ッ ク ス : aunmind
| 前方ス キ ャ ン
| キー に よ っ て位置付け ま す。
| Keys are:
|
au_lname ASC
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
65
クエリ・プランの形状
|
|
|
|
イ ンデ ッ ク ス の リ ー フ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
イ ンデ ッ ク ス の リ ー フ ・ ペー ジ に対す る LRU で のバ ッ フ ァ 置換方式
デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
デー タ ・ ペー ジ に対す る LRU で のバ ッ フ ァ 置換方式
authors テーブルの SCAN 演算子は、 イ ン デ ッ ク ス aunmind を 使用 し ま
すが、 ベー ス ・ テーブル ・ ペー ジ を 読み込む必要 も あ り ま す。 こ れ
は、 必要な カ ラ ム を authors か ら すべて取得す る た め です。 こ の例に
は、 I/O サ イ ズ ・ メ ッ セ ー ジ が 2 つ あ り ま す。 各 メ ッ セ ー ジ の後に対
応す る バ ッ フ ァ 置換 メ ッ セー ジ が続き ま す。
独自の メ ッ セー ジ が あ る テーブル SCAN 演算子は、 2 種類あ り ま す。
RID SCAN と LOG SCAN です。
RID scan
Positioning by Row IDentifier (RID) ス キ ャ ン が見 ら れ る の は、
オプテ ィ マ イ ザが選択で き る 2 番目の or 方式、 つ ま り 汎用の or 方式
を 使用す る ク エ リ ・ プ ラ ン の みです。 汎用の or 方式は、 さ ま ざ ま な カ
ラ ム に複数の or 句が存在す る と き に使用 さ れ る こ と が あ り ま す。 オプ
テ ィ マ イ ザが、 汎用の or 方式 と そ の showplan 出力 を 選択で き る ク エ
リ の例 を 次に示 し ま す。
use pubs2
go
set showplan on
go
select id from sysobjects where id = 4 or name = 'foo'
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
6 operator(s) under root
ク エ リ の タ イ プは SELECT です。
ROOT:EMIT Operator (VA = 6)
|RID JOIN Operator (VA = 5)
| 内部記憶領域 と し て Worktable2 を使用 し て い ま す。
|
|
|HASH UNION Operator has 2 children.
|
| 内部記憶領域 と し て Worktable1 を使用 し て い ま す。
|
|
|
|
|SCAN Operator (VA = 0)
|
|
| FROM TABLE
|
|
| sysobjects
66
Adaptive Server Enterprise
第2章
showplan の使用
|
|
| ク ラ ス タ ー ド ・ イ ンデ ッ ク ス を使用 し て い ま す。
|
|
| イ ンデ ッ ク ス : csysobjects
|
|
| 前方ス キ ャ ン
|
|
| キー に よ っ て位置付け ま す。
|
|
| イ ンデ ッ ク ス に は、 必要な カ ラ ム がすべて含ま れて い ま す。 ベー ス ・ テーブルは読み
込ま れ ま せん。
|
|
| Keys are:
|
|
|
id ASC
|
|
| イ ン デ ッ ク ス の リ ー フ ・ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
|
|
| イ ンデ ッ ク ス の リ ー フ ・ ペー ジ に対す る LRU で のバ ッ フ ァ 置換方式
|
|
|
|
|SCAN Operator (VA = 1)
|
|
| FROM TABLE
|
|
| sysobjects
|
|
| イ ンデ ッ ク ス : ncsysobjects
|
|
| 前方ス キ ャ ン
|
|
| キー に よ っ て位置付け ま す。
|
|
| イ ンデ ッ ク ス に は、 必要な カ ラ ム がすべて含ま れて い ま す。 ベー ス ・ テーブルは読み
込ま れ ま せん。
|
|
| Keys are:
|
|
|
name ASC
|
|
| イ ン デ ッ ク ス の リ ー フ ・ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
|
|
| イ ンデ ッ ク ス の リ ー フ ・ ペー ジ に対す る LRU で のバ ッ フ ァ 置換方式
|
|
|RESTRICT Operator (VA = 4)(0)(0)(0)(11)(0)
|
|
|
|
|SCAN Operator(VA = 3)
|
|
| FROM TABLE
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
sysobjects
動的 イ ンデ ッ ク ス を使用 し て い ま す。
前方ス キ ャ ン
ロ ー識別子 (RID) に よ っ て位置付け ま す。
デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
デー タ ・ ペー ジ に対す る LRU で のバ ッ フ ァ 置換方式
こ の例では、 where 句に論理和が 2 つ含ま れて お り 、 それぞれ別の カ
ラ ム (id と name) に あ り ま す。 こ れ ら の各カ ラ ム に は イ ン デ ッ ク ス
(csysobjects と ncsysobjects) が あ り ま す。 そ の た め、 オプテ ィ マ イ ザ
は、 あ る 特徴 を 持つ ク エ リ ・ プ ラ ン を 選択 し ま す。 それは、 あ る イ ン
デ ッ ク ス ・ ス キ ャ ン を 使用 し て id カ ラ ム が 4 で あ る ロ ー を すべて見つ
け、 別の イ ン デ ッ ク ス ・ ス キ ャ ン を 使用 し て name カ ラ ム が “foo” で あ
る ロ ー を すべて見つ け る ク エ リ ・ プ ラ ン です。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
67
クエリ・プランの形状
1 つ の ロ ーが 4 と い う ID と “foo” と い う 名前 を 持つ こ と は可能な の で、
そ の ロ ーは結果セ ッ ト に 2 回表示 さ れ ま す。 こ の よ う な重複 ロ ー を 削
除す る た め に、 イ ン デ ッ ク ス ・ ス キ ャ ン は条件に合 う ロ ー の ロ ー識別
子 (RID) の み を 返 し ま す。 RID の 2 つ の ス ト リ ー ム は、 HASH UNION 演
算子に よ っ て連結 さ れ ま す。 こ の処理に よ っ て も 、 重複 し た RID が削
除 さ れ ま す。
ユニー ク な RID の ス ト リ ー ム は RID JOIN 演算子に渡 さ れ ま す。 rid join
演算子は ワ ー ク ・ テーブル を 作成 し 、 各 RID を 持つ単一カ ラ ム の ロ ー
を そ の ワ ー ク ・ テーブル に入力 し ま す。 次に、 RID の ワ ー ク ・ テーブ
ル を RID SCAN 演算子に渡 し ま す。 RID SCAN 演算子は、 ワ ー ク ・ テー
ブル を ア ク セ ス層に渡 し ま す。 ア ク セ ス層では、 ワ ー ク ・ テーブルは
キー の な い ノ ン ク ラ ス タ ー ド ・ イ ン デ ッ ク ス と し て扱われ、 RID に対
応す る ロ ーが フ ェ ッ チ さ れ、 返 さ れ ま す。
showplan 出力の最後の SCAN は、 RID SCAN です。 出力例か ら わ か る よ
う に、 RID SCAN 出力に は、 既に説明 し た メ ッ セ ー ジ が多 く 含ま れて
い ま す。 し か し 、 RID SCAN 以外では出力 さ れな い メ ッ セ ー ジ も 2 つ
含 ま れて い ま す。
•
Using Dynamic Index - SCAN が RID 付き の ワ ー ク ・ テーブル を
使用 し て い る こ と を 示 し ま す。 こ の ワ ー ク ・ テーブルは、 RID
JOIN 演算子に よ る 実行時に、 一致す る ロ ー の位置 を 指定す る た め
の イ ン デ ッ ク ス と し て作成 さ れた も の です。
•
Positioning by Row Identifier (RID) - ロ ーが RID に よ っ て
直接位置 を 指定 さ れて い る こ と を 示 し ま す。
Log Scan
Log Scan が表示 さ れ る の は、 挿入 さ れ る テーブル ま た は削除 さ れ る
テーブル に ア ク セ ス す る ト リ ガの みです。 こ れ ら の テーブルは、 ト リ
ガの実行時に ト ラ ン ザ ク シ ョ ン ・ ロ グ を ス キ ャ ン す る こ と に よ っ て動
的に作成 さ れ ま す。 ト リ ガが実行 さ れ る の は、 insert、 delete、 ま た は
update ク エ リ が、 特定の ク エ リ ・ タ イ プ の ト リ ガが定義 さ れた テーブ
ル を 修正 し た後に かぎ ら れ ま す。 次の例に、 titles テーブル に対す る
delete ク エ リ を 示 し ま す。 こ の テーブル に は、 deltitle と い う 名前の削
除 ト リ ガが定義 さ れて い ま す。
use pubs2
go
set showplan on
go
delete from titles where title_id = 'xxxx'
68
Adaptive Server Enterprise
第2章
showplan の使用
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
STEP 1
ク エ リ の タ イ プは DELETE です。
2 operator(s) under root
|ROOT:EMIT Operator (VA = 2)
|DELETE Operator (VA = 1)
| 直接更新モ ー ド です。
|
|
|SCAN Operator (VA = 0)
|
| FROM TABLE
|
| titles
|
| ク ラ ス タ ー ド ・ イ ン デ ッ ク ス を使用 し て い ま す。
|
| イ ン デ ッ ク ス : titleidind
|
| 前方ス キ ャ ン
|
| キー に よ っ て位置付け ま す。
|
| Keys are:
|
|
title_id ASC
|
| デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
|
| デー タ ・ ペー ジ に対す る LRU で のバ ッ フ ァ 置換方式
|
| TO TABLE
| titles
| デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
こ こ ま で の showplan 出力は、 実際の delete ク エ リ に対す る も の です。
次に示す出力は、 ト リ ガで あ る deltitle に対す る も の です。
文 1 (5 行目 ) の ク エ リ ・ プ ラ ン。
STEP 1
ク エ リ の タ イ プは COND です。
6 operator(s) under root
ROOT:EMIT Operator (VA = 6)
|RESTRICT Operator (VA = 5)(0)(0)(0)(5)(0)
|
|
|SCALAR AGGREGATE Operator (VA = 4)
|
| グループ化 さ れて い な い COUNT AGGREGATE を評価 し ま す。
|
|
|
|
|MERGE JOIN Operator (Join Type: Inner Join) (VA = 3)
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
69
クエリ・プランの形状
|
|
| 内部記憶領域 と し て Worktable2 を使用 し て い ま す。
|
|
| Key Count: 1
|
|
| Key Ordering: ASC
|
|
|
|
|
|
|SORT Operator (VA = 1)
|
|
|
| 内部記憶領域 と し て Worktable1 を使用 し て い ま す。
|
|
|
|
|
|
|
|
|SCAN Operator (VA = 0)
|
|
|
|
| FROM TABLE
|
|
|
|
| titles
|
|
|
|
| ロ グ ・ ス キ ャ ン です。
|
|
|
|
| 前方ス キ ャ ン
|
|
|
|
| テーブルの最初に位置付け ま す。
|
|
|
|
| デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
|
|
|
|
| デー タ ・ ペー ジ に対す る MRU で のバ ッ フ ァ 置換方式
|
|
|
|
|
|
|SCAN Operator (VA = 2)
|
|
|
| FROM TABLE
|
|
|
| salesdetail
|
|
|
| イ ン デ ッ ク ス : titleidind
|
|
|
| 前方ス キ ャ ン
|
|
|
| テーブルの最初に位置付け ま す。
|
|
|
| イ ン デ ッ ク ス に は、 必要な カ ラ ム がすべて含ま れて い ま す。 ベー ス ・ テーブル
は読み込ま れ ま せん。
|
|
|
| イ ン デ ッ ク ス の リ ー フ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し
て い ま す。
|
|
|
| イ ン デ ッ ク ス の リ ー フ ・ ペー ジ に対す る LRU で の バ ッ フ ァ 置換方式
文 2 (8 行目 ) の ク エ リ ・ プ ラ ン。
STEP 1
ク エ リ の タ イ プは ROLLBACK TRANSACTION です。
文 3 (9 行目 ) の ク エ リ ・ プ ラ ン。
STEP 1
ク エ リ の タ イ プは PRINT です。
文 4 (0 行目 ) の ク エ リ ・ プ ラ ン。
STEP 1
ク エ リ の タ イ プは GOTO です。
70
Adaptive Server Enterprise
第2章
showplan の使用
deltitle ト リ ガ を 定義す る プ ロ シ ー ジ ャ は、 4 つ の SQL 文で構成 さ れ ま
す。 sp_helptext deltitle を 使用 し て、 deltitle の テ キ ス ト を 表示 し ま す。
deltitle の最初の文は、 ク エ リ ・ プ ラ ン に コ ン パ イ ル済み です。 そ の他
の 3 つ の文は、 レ ガシ の ク エ リ ・ プ ラ ン に コ ン パ イ ル さ れ、 ク エ リ 実
行エ ン ジ ン では な く 手続き型実行エ ン ジ ン に よ っ て実行 さ れ ま す。
titles テ ー ブルに 対する SCAN 演算子の showplan 出力は、 Log Scan を
出力す る こ と に よ っ て ロ グ の ス キ ャ ン を 行っ て い る こ と を 示し て い
ま す。
DELETE、INSERT、UPDATE 演算子
DELETE、 INSERT、 UPDATE の各演算子では、 通常は子演算子が 1 つ の
みです。 ただ し 、 子演算子 を さ ら に 2 つ増や し て、 参照整合性の制約
を 実行 し た り 、 テキ ス ト ・ カ ラ ム の alter table drop を 実行 し た場合に テ
キ ス ト ・ デー タ の割 り 付け を 解除 し た り で き ま す。
こ れ ら の演算子は、 タ ーゲ ッ ト ・ テーブル に属す る ロ ー の挿入、 削
除、 ま た は更新 を 行 う こ と に よ っ て、 デー タ を 修正 し ま す。
DML 演算子の子演算子は、 SCAN 演算子、 JOIN 演算子、 ま た は任意の
デー タ ・ ス ト リ ー ミ ン グ演算子の いずれかです。
デー タ 修正は、 次の メ ッ セ ー ジ に よ っ て指定 さ れ る よ う に、 さ ま ざ
ま な更新モ ー ド を 使用 し て実行で き ま す。
更新モ ー ド は <Update Mode> です。
テーブル更新モ ー ド は、 direct、 deferred、 deferred for an
index、 ま た は deferred for a variable column の いずれかです。
ワ ー ク ・ テーブルの更新モ ー ド は常に direct です。
デー タ 修正の タ ーゲ ッ ト ・ テーブルは、 次の メ ッ セ ー ジ に表示 さ れ
ま す。
TO TABLE
<Table Name>
デー タ 修整に使用 さ れ る I/O サ イ ズ も 表示 さ れ ま す。
デー タ ・ペー ジ に対 し て I/O サ イ ズ <N> キ ロ バ イ ト を使用 し て い
ま す。
次の例では、 DELETE 演算子が使用 さ れて い ま す。
use pubs2
go
set showplan on
go
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
71
クエリ・プランの形状
delete from authors where postalcode = '90210'
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
STEP 1
ク エ リ の タ イ プは DELETE です。
2 operator(s) under root
ROOT:EMIT Operator (VA = 2)
|DELETE Operator (VA = 1)
| 直接更新モ ー ド です。
|
|
|SCAN Operator (VA = 0)
|
| FROM TABLE
|
| authors
|
| テーブル ・ ス キ ャ ン です。
|
| 前方ス キ ャ ン
|
| テーブルの最初に位置付け ま す。
|
| デー タ ・ ペー ジ に対 し て I/O サ イ ズ 4 キ ロ バ イ ト を使用 し て い ま す。
|
| デー タ ・ ペー ジ に対す る LRU で の バ ッ フ ァ 置換方式
|
| TO TABLE
| authors
| デー タ ・ ペー ジ に対 し て I/O サ イ ズ 4 キ ロ バ イ ト を 使用 し て い ま す。
TEXT DELETE 演算子
DELETE、 INSERT、 UPDATE の各演算子が子演算子 を 複数個持て る 別の
タ イ プ の ク エ リ ・ プ ラ ン は、 alter table drop textcol コ マ ン ド です。 こ こ
で、 textcol は、 デー タ 型が text、 image、 ま た は unitext で あ る カ ラ ム の
名前です。 こ の バー ジ ョ ン の コ マ ン ド では、 ク エ リ ・ プ ラ ン に TEXT
DELETE 演算子 を 使用 し ま し た。 次に例 を 示 し ま す。
72
Adaptive Server Enterprise
第2章
showplan の使用
use tempdb
go
create table t1 (c1 int, c2 text, c3 text)
go
set showplan on
go
alter table t1 drop c2
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
PLAN 句の Abstract Plan を使用 し て最適化 し ま し た。
STEP 1
ク エ リ の タ イ プは ALTER TABLE です。
5 operator(s) under root
ROOT:EMIT Operator (VA = 5)
|INSERT Operator (VA = 52)
| 直接更新モ ー ド です。
|
|
|RESTRICT Operator (VA = 1)(0)(0)(3)(0)(0)
|
|
|
|
|SCAN Operator (VA = 0)
|
|
| FROM TABLE
|
|
| t1
|
|
| テーブル ・ ス キ ャ ン です。
|
|
| 前方ス キ ャ ン
|
|
| テーブルの最初に位置付け ま す。
|
|
| デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
|
|
| デー タ ・ ペー ジ に対す る LRU で のバ ッ フ ァ 置換方式
|
|
|TEXT DELETE Operator
|
| 直接更新モ ー ド です。
|
|
|
|
|SCAN Operator (VA = 3)
|
|
| FROM TABLE
|
|
| t1
|
|
| テーブル ・ ス キ ャ ン です。
|
|
| 前方ス キ ャ ン
|
|
| テーブルの最初に位置付け ま す。
|
|
| デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
|
|
| デー タ ・ ペー ジ に対す る LRU で のバ ッ フ ァ 置換方式
|
| TO TABLE
| #syb__altab
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
73
クエリ・プランの形状
|
デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を 使用 し て い ま す。
t1 の 2 つ の text カ ラ ム の一方が、 alter table コ マ ン ド を 使用 し て削除 さ
れ ま す。 showplan 出力は、 select into ク エ リ ・ プ ラ ン と 同 じ よ う に見え
ま す。 こ れは、 alter table が select into ク エ リ ・ プ ラ ン を 内部で生成 し た
た め です。
INSERT 演算子が、 左側の子演算子で あ る t1 の SCAN を 呼び出 し て、
t1 の ロ ー を 読み込み ま す。 次に、 #syb_altab に挿入 さ れた c1 カ ラ ム と
c3 カ ラ ム の み を 持つ新 し い ロ ー を 作成 し ま す。 新 し い ロ ーがすべて
#syb_altab に挿入 さ れた ら 、 INSERT 演算子は右側の子で あ る TEXT
DELETE を 呼び出 し ま す。 こ れは、 t1 か ら 削除済み の c2 カ ラ ム の テキ
ス ト ・ ペー ジ ・ チ ェ ー ン を 削除す る た め です。
後処理に よ っ て、 t1 の元の ペー ジ は #syb_altab の ペ ー ジ に置き換え ら
れて、 alter table コ マ ン ド の実行が完了 し ま す。
TEXT DELETE 演算子が表示 さ れ る の は、 テーブルの テキ ス ト ・ カ ラ
ム を ( 全部では な く ) 一部の み削除す る alter table コ マ ン ド の みです。
ま た、 こ の演算子は、 INSERT 演算子の右側の子 と し て常に表示 さ れ
ま す。
TEXT DELETE 演算子は、 更新モ ー ド ・ メ ッ セ ー ジ を 表示 し ま す。
こ れは、 INSERT、 UPDATE、 DELETE の各演算子 と 同 じ です。
参照整合性実行用のクエリ・プラン
INSERT、 UPDATE、 DELETE の各演算子が、 参照整合性制約が 1 つ以上
あ る テーブルで使用 さ れ る 場合、 showplan 出力に DML 演算子の
DIRECT RI FILTER と DEFERRED RI FILTER の各子演算子 も 表示 さ れ
ま す。 参照整合性制約の タ イ プ に よ っ て、 こ れ ら の演算子の一方の み
が表示 さ れ る の か、 それ と も 両方表示 さ れ る の かが決ま り ま す。
次の例は、 pubs3 デー タ ベ ー ス の titles テーブル に insert す る 場合です。
こ の テーブル に は pub_id と 呼ばれ る カ ラ ム が あ り ま す。 こ の カ ラ ム
は、 publishers テーブルの pub_id カ ラ ム を 参照 し ま す。 titles.pub_id に関
す る 参照整合性制約に よ っ て、 titles.pub_id に挿入 さ れ る 各値に、
publishers.pub_id で の対応す る 値が存在す る こ と が必須 と な り ま す。
ク エ リ と そ の ク エ リ ・ プ ラ ン は、 次の と お り です。
use pubs3
go
set showplan on
insert into titles values ("AB1234", "Abcdefg", "test", "9999", 9.95, 1000.00,
10, null, getdate(),1)
74
Adaptive Server Enterprise
第2章
showplan の使用
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
STEP 1
ク エ リ の タ イ プは INSERT です。
4 operator(s) under root
ROOT:EMIT Operator (VA = 3)
|INSERT Operator (VA = 2)
| 直接更新モ ー ド です。
|
|
|SCAN Operator (VA = 1)
|
| FROM CACHE
|
|
|DIRECT RI FILTER 演算子に は子が 1 つ あ り ま す。
|
|
|
|
|SCAN Operator (VA = 0)
|
|
| FROM TABLE
|
|
| publishers
|
|
| イ ンデ ッ ク ス : publishers_6240022232
|
|
| 前方ス キ ャ ン
|
|
| キー に よ っ て位置付け ま す。
|
|
| イ ンデ ッ ク ス に は、 必要な カ ラ ム がすべて含ま れて い ま す。 ベー ス ・ テーブルは
読み込ま れ ま せん。
|
|
| Keys are:
|
|
|
pub_id ASC
|
|
| イ ンデ ッ ク ス の リ ー フ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て
い ま す。
|
|
| イ ンデ ッ ク ス の リ ー フ ・ ペー ジ に対す る LRU で のバ ッ フ ァ 置換方式
|
| TO TABLE
| titles
| デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
こ の ク エ リ ・ プ ラ ン で、 INSERT 演算子の左側の子演算子は、 CACHE
SCAN です。 こ の演算子は、 titles に挿入 さ れ る 値の ロ ー を 返 し ま す。
INSERT 演算子の右側の子は、 DIRECT RI FILTER 演算子です。
DIRECT RI FILTER 演算子は、 publishers テーブルの ス キ ャ ン を 実行 し
ま す。 それは、 titles に挿入 さ れ る pub_id の値に一致す る pub_id の値 を
持 つ ロ ー を 見 つ け る た め で す。 一 致 す る ロ ー が 見 つ か っ た 場 合、
DIRECT RI FILTER 演算子は insert の実行 を 許可 し ま す。 し か し 、 pub_id
の一致す る 値が publishers に見つ か ら な い場合に は、 DIRECT RI
FILTER 演算子は コ マ ン ド を ア ボー ト し ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
75
クエリ・プランの形状
こ の例では、 DIRECT RI FILTER は、 各 ロ ー の挿入時に、 挿入 ロ ー に
対 し て titles の参照整合性制約 を チ ェ ッ ク し て実行 し ま す。
次の例では、 DEFERRED RI FILTER 演算子 と 連携 し て別の モ ー ド で機
能す る DIRECT RI FILTER を 示 し ま す。
use pubs3
go
set showplan on
go
update publishers set pub_id = '0001'
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
STEP 1
ク エ リ の タ イ プは UPDATE です。
13 operator(s) under root
ROOT:EMIT Operator (VA = 13)
|UPDATE Operator (VA = 1)
| deferred_index 更新モ ー ド です
|
|
|SCAN Operator (VA = 0)
|
| FROM TABLE
|
| publishers
|
| テーブル ・ ス キ ャ ン です。
|
| 前方ス キ ャ ン
|
| テーブルの最初に位置付け ま す。
|
| デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
|
| デー タ ・ ペー ジ に対す る LRU で の バ ッ フ ァ 置換方式
|
|
|DIRECT RI FILTER 演算子 (VA = 7) に は子が 1 つ あ り ま す。
|
|
|
|
|INSERT Operator (VA = 6)
|
|
| 直接更新モ ー ド です。
|
|
|
|
|
|
|SQFILTER 演算子 (VA = 5) に は子が 2 つ あ り ま す。
|
|
|
|
|
|
|
|
|SCAN Operator (VA = 2)
|
|
|
|
| FROM CACHE
|
|
|
|
|
|
|
| サブ ク エ リ 1 の実行 ( ネ ス ト ・ レ ベル 0)
|
|
|
|
|
|
|
| サブ ク エ リ 1 に対す る ク エ リ ・ プ ラ ン ( ネ ス ト ・ レ ベル 1、 1 行目 )
|
|
|
|
76
Adaptive Server Enterprise
第2章
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
非相関サブ ク エ リ 。
EXISTS 述語内のサブ ク エ リ 。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
showplan の使用
|SCALAR AGGREGATE Operator (VA = 4)
| グループ化 さ れて い な い ANY AGGREGATE を評価 し ま す。
| 最初に該当す る ロ ー ま でだけ を ス キ ャ ン し ま す。
|
|
|SCAN Operator (VA = 3)
|
| FROM TABLE
|
| titles
|
| テーブル ・ ス キ ャ ン です。
|
| 前方ス キ ャ ン
|
| テーブルの最初に位置付け ま す。
|
| デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て
い ま す。
|
デー タ ・ ペー ジ に対す る LRU で の バ ッ フ ァ 置換方式
サブ ク エ リ 1 に対す る ク エ リ ・ プ ラ ン終了
TO TABLE
ワ ー ク ・ テーブル 1
|DEFERRED RI FILTER 演算子 (VA = 12) に は子が 1 つ あ り ま す。
|
|
|SQFILTER 演算子 (VA = 11) に は子が 2 つ あ り ま す。
|
|
|
|
|SCAN Operator (VA = 8)
|
|
| FROM TABLE
|
|
| ワ ー ク ・ テーブル 1
|
|
| テーブル ・ ス キ ャ ン です。
|
|
| 前方ス キ ャ ン
|
|
| テーブルの最初に位置付け ま す。
|
|
| デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
|
|
| デー タ ・ ペー ジ に対す る LRU で の バ ッ フ ァ 置換方式
|
|
|
| サブ ク エ リ 1 の実行 ( ネ ス ト ・ レ ベル 0)
|
|
|
| サブ ク エ リ 1 に対す る ク エ リ ・ プ ラ ン ( ネ ス ト ・ レ ベル 0、 0 行目 )
|
|
|
|
非相関サブ ク エ リ 。
|
|
EXISTS 述語内のサブ ク エ リ 。
|
|
|
|
|SCALAR AGGREGATE Operator (VA = 10)
|
|
| グループ化 さ れて い な い ANY AGGREGATE を評価 し ま す。
|
|
| 最初に該当す る ロ ー ま でだけ を ス キ ャ ン し ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
77
クエリ・プランの形状
|
|
|
|
|
|
|
|
|SCAN Operator (VA = 9)
|
|
|
|
| FROM TABLE
|
|
|
|
| publishers
|
|
|
|
| イ ンデ ッ ク ス : publishers_6240022232
|
|
|
|
| 前方ス キ ャ ン
|
|
|
|
| キー に よ っ て位置付け ま す。
|
|
|
|
| イ ンデ ッ ク ス に は、 必要な カ ラ ム がすべて含ま れて い ま す。 ベー ス ・
テーブルは読み込ま れ ま せん。
|
|
|
|
| Keys are:
|
|
|
|
|
pub_id ASC
|
|
|
|
| イ ンデ ッ ク ス の リ ー フ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト
を使用 し て い ま す。
|
|
|
|
| イ ンデ ッ ク ス の リ ー フ ・ ペー ジ に対す る LRU で のバ ッ フ ァ 置換方式
|
|
|
|
|
| サブ ク エ リ 1 に対す る ク エ リ ・ プ ラ ン終了|
| TO TABLE
| publishers
| デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を 使用 し て い ま す。
titles の参照整合性制約が あ る た め、 titles.pub_id の各値に対 し て
publishers.pub_id の値が存在す る 必要が あ り ま す。 た だ し 、 こ の ク エ リ
例では publisher.pub_id の値が変更 さ れて い ま す。 そ の た め、 チ ェ ッ ク
を 実行 し て参照整合性制約 を 維持す る 必要が あ り ま す。
こ の ク エ リ 例では、 publishers の複数の ロ ー に関 し て publishers.pub_id の
値 を 変更で き ま す。 そ の た め、 titles.pub_id の値がすべて publisher.pub_id
に ま だ存在す る こ と を 確認で き る の は、 publishers の ロ ーがすべて処理
さ れた後です。
こ の例では、 遅延参照整合性チ ェ ッ ク を 呼び出 し ま す。 publishers の各
ロ ーが読み込ま れ る と 、 UPDATE 演算子が DIRECT RI FILTER 演算子 を
呼び出 し ま す。 こ れは、 変更 さ れ よ う と し て い る 値 と 同 じ pub_id 値 を
持 つ ロ ー が、 titles に な い か ど う か を 検索す る た め で す。 ロ ー が見 つ
か っ た場合、 pub_id の こ の値が、 titles の参照整合性制約 を 維持す る た
め に publishers に 依然 と し て 存在す る こ と が わ か り ま す。 そ の た め、
pub_id の値が WorkTable1 に挿入 さ れ ま す。
publishers の ロ ーがすべて更新 さ れた後に、UPDATE 演算子が DEFERRED
RI FILTER 演算子 を 呼び出 し てサブ ク エ リ を 実行 し ま す。 こ れは、
Worktable1 の値がすべて依然 と し て publishers に存在す る こ と を 確認す
る た め です。 DEFERRED RI FILTER の左側の子演算子は、 Worktable1
か ら ロ ー を 読み込む SCAN です。 右側の子は、 SQFILTER 演算子です。
こ れは、 存在サブ ク エ リ を 実行 し て、 一致す る 値が publishers に あ る
か ど う か を チ ェ ッ ク し ま す。 一致す る 値が見つ か ら な い場合、 コ マ ン
ド は ア ボー ト さ れ ま す。
78
Adaptive Server Enterprise
第2章
showplan の使用
こ の セ ク シ ョ ン の例では、 単純な参照整合性制約 を わずか 2 つ の テー
ブルの間で使用 し ま し た。 Adaptive Server では、 1 テーブル当た り 最高
192 個の制約 を 使用で き ま す。 そ の た め、 は る か に複雑な ク エ リ ・ プ
ラ ン を 生成で き ま す。 制約 を 複数実行す る 必要が あ る 場合で も 、 ク エ
リ ・プ ラ ン に存在す る 演算子は、 DIRECT RI FILTER ま た は DEFERRED
RI FILTER の みです。 ただ し 、 こ の演算子はサブプ ラ ン を 複数持つ こ
と がで き 、 実行する 必要があ る 制約ご と に サブ プ ラ ン が 1 つ 存在し
ま す。
JOIN 演算子
Adaptive Server に は、 4 つ の主要な JOIN 演算子方式が あ り ま す。
それは、 NESTED LOOP JOIN、 MERGE JOIN、 HASH JOIN、 NESTED LOOP
JOIN の変形で あ る NARY NESTED LOOP JOIN です。 15.0 よ り 前の バー
ジ ョ ン では、 NESTED LOOP JOIN が主要な JOIN 方式で し た。 MERGE
JOIN も 使用で き ま し たが、 デ フ ォ ル ト では無効で し た。
各 JOIN 演算子に つ い て、 各ア ルゴ リ ズ ム の一般的な説明 も 含め て、
こ れ以降で詳細に説明 し て あ り ま す。 こ の説明に よ っ て、 各 JOIN 方
式に必要な処理の大ま か な概要 を 把握で き ま す。
NESTED LOOP JOIN
NESTED LOOP JOIN は、 最 も 単純な ジ ョ イ ン方式で あ り 、 外側デー
タ ・ ス ト リ ー ム を 形成す る 左側の子 と 内側デー タ ・ ス ト リ ー ム を 形成
す る 右側の子 を 持つ二項演算子です。
外側デー タ ・ ス ト リ ー ム の各 ロ ー に対 し て、 内側デー タ ・ ス ト リ ー ム
が開かれ ま す。 右側の子が scan 演算子で あ る こ と が よ く あ り ま す。 内
側デー タ ・ ス ト リ ー ム を 開 く と 、 探索可能な引数すべて の条件 を 満た
す最初の ロ ー に ス キ ャ ン が配置 さ れ る の で、 効率的です。
条件に合 う ロ ーが、 NESTED LOOP JOIN の親演算子に返 さ れ ま す。
ジ ョ イ ン演算子に対す る それ以降の呼び出 し で も 、 条件に合 う 内側ス
ト リ ー ム の ロ ーが引き続き返 さ れ ま す。
現在の外側 ロ ー に関 し て、 条件に合 う 内側ス ト リ ー ム の最後の ロ ーが
返 さ れ る と 、 内側ス ト リ ー ム が閉 じ ら れ ま す。 呼び出 し が行われ、 条
件に合 う 次の ロ ーが外側ス ト リ ー ム か ら 取得 さ れ ま す。 こ の ロ ー の値
か ら 、 探索可能な引数 を 得 ら れ ま す。 こ の引数は、 内側ス ト リ ー ム を
開い て ス キ ャ ン を 配置す る た め に使用 さ れ ま す。 こ の プ ロ セ ス は、
NESTED LOOP JOIN の左側の子が End Of Scan を 返す ま で続き ま す。
-- Collect all of the title ids for books written by "Bloom".
select ta.title_id
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
79
クエリ・プランの形状
from titleauthor ta, authors a
where a.au_id = ta.au_id
and au_lname = "Bloom"
go
文 1 (2 行目 ) の ク エ リ ・ プ ラ ン。
STEP 1
ク エ リ の タ イ プは SELECT です。
3 operator(s) under root
ROOT:EMIT Operator (VA = 3)
|NESTED LOOP JOIN Operator (Join Type: Inner Join)
|
|
|SCAN Operator (VA = 0)
|
| FROM TABLE
|
| authors
|
| a
|
| イ ン デ ッ ク ス : aunmind
|
| 前方ス キ ャ ン
|
| キー に よ っ て位置付け ま す。
|
| Keys are:
|
|
au_lname ASC
|
| イ ン デ ッ ク ス の リ ー フ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま
す。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
80
|
|
|
イ ン デ ッ ク ス の リ ー フ ・ ペー ジ に対す る LRU で の バ ッ フ ァ 置換方式
デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
デー タ ・ ペー ジ に対す る LRU で の バ ッ フ ァ 置換方式
|SCAN Operator (VA = 1)
| FROM TABLE
| titleauthor
| ta
| ク ラ ス タ ー ド ・ イ ン デ ッ ク ス を使用 し て い ま す。
| イ ン デ ッ ク ス : taind
| 前方ス キ ャ ン
| キー に よ っ て位置付け ま す。
| Keys are:
|
au_id ASC
| デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
| デー タ ・ ペー ジ に対す る LRU で の バ ッ フ ァ 置換方式
Adaptive Server Enterprise
第2章
showplan の使用
authors テーブルが titleauthor テーブル と ジ ョ イ ン さ れ ま す。 NESTED
LOOP JOIN 方式が選択 さ れ ま し た。 NESTED LOOP JOIN 演算子の タ イ
プは “Inner Join” です。 最初に、 authors テーブルが開かれ、 “Bloom” と
い う l_name 値 を 格納 し て い る 最初の ロ ー (aunmind イ ン デ ッ ク ス を 使
用 ) に配置 さ れ ま す。 次に、 titleauthor テーブルが開かれ ま す。 そ し て、
現在の authors の ロ ー ( ク ラ ス タ ー ド ・ イ ン デ ッ ク ス “taind” を 使用 ) の
au_id 値に等 し い au_id 値 を 持つ最初の ロ ー に配置 さ れ ま す。 内側ス ト
リ ー ム の検索に役立つ イ ン デ ッ ク ス がな い場合、 オプテ ィ マ イ ザは再
フ ォ ー マ ッ ト 方式 を 生成す る こ と が あ り ま す。
一般に、 NESTED LOOP JOIN 方式が効果的な の は、 内側ス ト リ ー ム
の ジ ョ イ ン述部の修飾に使用で き る 役立つ イ ン デ ッ ク ス が あ る 場合
です。
MERGE JOIN
MERGE JOIN 演算子は、 二項演算子です。 左側の子は外側デー タ ・ ス ト
リ ー ム、 右側の子は内側デー タ ・ ス ト リ ー ム です。 両方のデー タ ・ ス ト
リ ー ム を MERGE JOIN の キー値で ソ ー ト す る 必要が あ り ま す。
最初に、 外側ス ト リ ー ム の ロ ーが フ ェ ッ チ さ れ ま す。 こ れ に よ り 、
MERGE JOIN の ジ ョ イ ン ・ キー値が初期化 さ れ ま す。 次に、 内側ス ト
リ ー ム の ロ ーが フ ェ ッ チ さ れ ま す。 こ れは、 同 じ かそれ以上 ( キー ・
カ ラ ム が降順の場合はそれ未満 ) の キー値 を 持つ ロ ーが見つ か る ま で
続き ま す。 ジ ョ イ ン ・ キー値が一致す る と 、 条件に合 う ロ ーが さ ら に
処理 を 受け る た め に渡 さ れ ま す。 そ し て、 MERGE JOIN 演算子の次以
降の呼び出 し が、 現在ア ク テ ィ ブな ス ト リ ー ム か ら フ ェ ッ チ し 続け
ま す。
新 し い値が現在の比較キー よ り 大き い場合、 も う 一方の ス ト リ ー ム
か ら ロ ー を フ ェ ッ チす る 間、 そ の値が新 し い比較ジ ョ イ ン ・ キー と し
て使用 さ れ ま す。 こ の プ ロ セ ス は、 デー タ ・ ス ト リ ー ム の 1 つ がな く
な る ま で続き ま す。
一般に、 MERGE JOIN 方式が効果的な の は、 ロ ー の大半が処理 さ れ る
こ と 、 お よ びいずれか の入力ス ト リ ー ム が大き い場合に は入力ス ト
リ ー ム が ジ ョ イ ン ・ キーで事前に ソ ー ト さ れて い る こ と 、 を デー タ ・
ス ト リ ー ム の ス キ ャ ン が要求す る 場合です。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
81
クエリ・プランの形状
select ta.title_id
from titleauthor ta, authors a
where a.au_id = ta.au_id
and au_lname = "Bloom"
go
文 1 (2 行目 ) の ク エ リ ・ プ ラ ン。
STEP 1
ク エ リ の タ イ プは EXECUTE です。
新た に キ ャ ッ シ ュ さ れた文 を実行中です。
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
STEP 1
ク エ リ の タ イ プは SELECT です。
3 operator(s) under root
ROOT:EMIT Operator (VA = 3)
|MERGE JOIN Operator (Join Type: Inner Join)
| 内部記憶領域 と し て Worktable2 を使用 し て い ま す。
| Key Count: 1
| Key Ordering: ASC
|
|
|SORT Operator
|
| 内部記憶領域 と し て Worktable1 を使用 し て い ま す。
|
|
|
|
|SCAN Operator
|
|
| FROM TABLE
|
|
| authors
|
|
| a
|
|
| イ ンデ ッ ク ス : aunmind
|
|
| 前方ス キ ャ ン
|
|
| キー に よ っ て位置付け ま す。
|
|
| Keys are:
|
|
|
au_lname ASC
|
|
| イ ンデ ッ ク ス の リ ー フ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て
い ま す。
|
|
|
|
|
|
82
|
|
|
|
|
|
イ ンデ ッ ク ス の リ ー フ ・ ペー ジ に対す る LRU で のバ ッ フ ァ 置換方式
デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を 使用 し て い ま す。
デー タ ・ ペー ジ に対す る LRU で のバ ッ フ ァ 置換方式
|SCAN Operator
| FROM TABLE
Adaptive Server Enterprise
第2章
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
showplan の使用
titleauthor
ta
イ ン デ ッ ク ス : auidind
前方ス キ ャ ン
テーブルの最初に位置付け ま す。
イ ン デ ッ ク ス の リ ー フ ・ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
イ ン デ ッ ク ス の リ ー フ ・ ペー ジ に対す る LRU で の バ ッ フ ァ 置換方式
デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
デー タ ・ ペー ジ に対す る LRU で の バ ッ フ ァ 置換方式
こ の例では、 ソ ー ト 演算子は左側の子、 つ ま り 外側ス ト リ ー ム です。
ソ ー ト 演算子のデー タ ・ ソ ー ス は、 authors テーブルです。 ソ ー ト 演算
子が必要 と さ れ る の は、 authors テーブル に au_id の イ ン デ ッ ク ス がな
い た め です ( こ の イ ン デ ッ ク ス が あ れば、 必要な ソ ー ト 済み順 を 提示
で き ま す )。 titleauthor テーブルの ス キ ャ ン は、 右側の子 / 内側ス ト リ ー
ム です。 こ の ス キ ャ ン で auidind イ ン デ ッ ク ス が使用 さ れ ま す。 こ の イ
ン デ ッ ク ス は、 必要な ソ ー ト 順 を MERGE JOIN 方式に提示 し ま す。
外側ス ト リ ー ム (authors テーブルが元の ソ ー ス ) か ら ロ ーが フ ェ ッ チ
さ れ、 初回ジ ョ イ ン ・ キー比較値が確立 さ れ ま す。 次に、 titleauthor
テーブルか ら ロ ーが フ ェ ッ チ さ れ ま す。 こ れは、 比較キー に等 し い か
それ よ り 大き い ジ ョ イ ン ・ キー を 持つ ロ ーが見つ か る ま で続き ま す。
一致す る キー を 持つ内側ス ト リ ー ム ・ ロ ーは、 再 フ ェ ッ チが必要な場
合に備え て、 キ ャ ッ シ ュ に格納 さ れ ま す。 こ の よ う な ロ ーは、 外側ス
ト リ ー ム に重複キーが含 ま れ る 場合に再 フ ェ ッ チ さ れ ま す。 現在の
ジ ョ イ ン ・ キー比較値よ り 大き い titleauthor.au_id 値が フ ェ ッ チ さ れ る
と 、 MERGE JOIN 演算子は外側ス ト リ ー ム か ら の フ ェ ッ チ を 開始 し ま
す。 こ れは、 現在の titleauthor.au_id 値に等 し い かそれ よ り 大き い ジ ョ
イ ン ・ キー値が見つ か る ま で続き ま す。 そ の時点で、 内側ス ト リ ー ム
の ス キ ャ ン が再開 さ れ ま す。
MERGE JOIN 演算子の showplan 出力に は、 内側ス ト リ ー ム の補助記憶
に使用 さ れ る ワ ー ク ・ テーブル を 示す メ ッ セ ー ジ が含ま れ ま す。 重複
し た ジ ョ イ ン ・ キーが あ る 内側 ロ ーが、 キ ャ ッ シ ュ ・ メ モ リ に入 り き
ら な く な っ た場合に、 ワ ー ク ・ テーブル に書き込ま れ ま す。 キ ャ ッ
シ ュ ・ ロ ー の幅は、 64 KB に制限 さ れて い ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
83
クエリ・プランの形状
HASH JOIN
HASH JOIN 演算子は、二項演算子です。 左側の子が ビ ル ド 入力ス ト リ ー
ム を 生成 し ま す。 右側 の 子が プ ロ ー ブ入力 ス ト リ ー ム を 生成 し ま す。
最初の ロ ーが HASH JOIN 演算子か ら 要求 さ れた と き に、 ビ ル ド 入力ス
ト リ ー ム を 完全に排出す る こ と に よ っ て、 ビ ル ド ・ セ ッ ト が生成 さ れ
ま す。 各 ロ ーが入力 ス ト リ ー ム か ら 読み込 ま れて、 ハ ッ シ ュ ・ キ ー を
使用 し て該当す る バケ ッ ト に ハ ッ シ ュ さ れ ま す。
ビ ル ド ・ セ ッ ト 全体 を 保持す る た め に十分な メ モ リ がな い場合、 一部
がデ ィ ス ク に あ ふれ出ま す。 こ の部分は 「ハ ッ シ ュ 分割」 と 呼ばれ ま
す。 「テーブル分割」 と 混同 し な い で く だ さ い。 ハ ッ シ ュ 分割は、
ハ ッ シ ュ ・ バケ ッ ト の集ま り で構成 さ れ ま す。 左側の子の ス ト リ ー ム
全体が排出 さ れた後、 プ ロ ーブ入力が読み込ま れ ま す。
プ ロ ー ブ ・ セ ッ ト の各 ロ ー が ハ ッ シ ュ さ れ ま す。 一致す る ハ ッ シ ュ ・
キ ー を 持つ ロ ーがな い か ど う か を チ ェ ッ ク す る た め に、 対応す る ビ ル
ド ・ バ ケ ッ ト で検索が行われ ま す。 こ れは、 ビ ル ド ・ セ ッ ト の バ ケ ッ
ト が メ モ リ に常駐す る 場合に発生し ま す。 あ ふれ出た場合、 プ ロ ーブ ・
ロ ー は対応す る あ ふ れ出 た プ ロ ー ブ分割 に 書 き 込 ま れ ま す。 プ ロ ー
ブ ・ ロ ー の キ ー が、 ビ ル ド ・ ロ ー の キ ー と 一致す る と 、 2 つ の ロ ー の
カ ラ ム の必要な射影が、 さ ら に処理 を 受け る た め に渡 さ れ ま す。
あ ふれ出た分割は、 HASH JOIN ア ルゴ リ ズ ム の それ以降の再帰パ ス で
処理 さ れ ま す。 各パ ス で新 し い ハ ッ シ ュ ・ シ ー ド が使用 さ れ る の で、 複
数の ハ ッ シ ュ ・ バ ケ ッ ト 間でデー タ が再分配 さ れ ま す。 こ の再帰処理
は、 あ ふれ出た最後 の 分割が完全 に メ モ リ 常駐 に な る ま で続 き ま す。
ビ ル ド ・ セ ッ ト の ハ ッ シ ュ 分割に重複 し た項目が多数あ る 場合、 HASH
JOIN 演算子は NESTED LOOP JOIN 処理に戻 り ま す。
一般に、 HASH JOIN 方式が役立つ の は、 ソ ー ス ・ セ ッ ト の ロ ー の大半
を 処理す る 必要が あ り 、 し か も ジ ョ イ ン ・ キー に関 し て固有の役立つ
順序がな い か、 ま た は呼び出 し 元演算子に昇格で き る 興味深い順序が
な い場合です ( ジ ョ イ ン ・ キー の order by 句な ど )。 HASH JOIN が特に
力 を 発揮す る の は、 デー タ ・ セ ッ ト の 1 つ が小 さ く て、 メ モ リ に常駐
で き る 場合です。 こ の よ う な場合 に は、 あ ふれ出 し も 発生せず、 HASH
JOIN ア ルゴ リ ズ ム を 実行す る た め の I/O は不要です。
select ta.title_id
from titleauthor ta, authors a
where a.au_id = ta.au_id
and au_lname = "Bloom"
文 1 (2 行目 ) の ク エ リ ・ プ ラ ン。
3 operator(s) under root
84
Adaptive Server Enterprise
第2章
showplan の使用
ク エ リ の タ イ プは SELECT です。
ROOT:EMIT Operator
|HASH JOIN Operator (Join Type: Inner Join)
| 内部記憶領域 と し て Worktable1 を使用 し て い ま す。
|
|
|SCAN Operator
|
| FROM TABLE
|
| authors
|
| a
|
| イ ン デ ッ ク ス : aunmind
|
| 前方ス キ ャ ン
|
| キー に よ っ て位置付け ま す。
|
| Keys are:
|
|
au_lname ASC
|
| イ ン デ ッ ク ス の リ ー フ ・ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
|
| イ ン デ ッ ク ス の リ ー フ ・ ペー ジ に対す る LRU で の バ ッ フ ァ 置換方式
|
| デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
|
| デー タ ・ ペー ジ に対す る LRU で の バ ッ フ ァ 置換方式
|
|
|SCAN Operator
|
| FROM TABLE
|
| titleauthor
|
| ta
|
| イ ン デ ッ ク ス : auidind
|
| 前方ス キ ャ ン
|
| テーブルの最初に位置付け ま す。
|
| イ ン デ ッ ク ス の リ ー フ ・ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
|
| イ ン デ ッ ク ス の リ ー フ ・ ペー ジ に対す る LRU で の バ ッ フ ァ 置換方式
|
| デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
|
| デー タ ・ ペー ジ に対す る LRU で の バ ッ フ ァ 置換方式
こ の例では、 ビ ル ド 入力ス ト リ ー ム の ソ ー ス は、 author.aunmind の イ ン
デ ッ ク ス ・ ス キ ャ ン です。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
85
クエリ・プランの形状
こ の ス キ ャ ン か ら 、 au_lname 値が “Bloom” の ロ ー の みが返 さ れ ま す。
次に、 こ の ロ ーは au_id 値で ハ ッ シ ュ さ れ、 対応す る ハ ッ シ ュ ・ バ
ケ ッ ト に入れ ら れ ま す。 ビ ル ド の初期段階が完了す る と 、 プ ロ ーブ ・
ス ト リ ー ム が開き、 ス キ ャ ン さ れ ま す。 ソ ー ス ・ イ ン デ ッ ク ス で あ る
titleauthor.auidind の各 ロ ーは、 au_id カ ラ ム でハ ッ シ ュ さ れ ま す。 そ の
結果の ハ ッ シ ュ 値は、 一致す る ハ ッ シ ュ ・ キー の検索対象 と す る ビ ル
ド ・ セ ッ ト の バケ ッ ト を 判断す る た め に使用 さ れ ま す。 ビ ル ド ・ セ ッ
ト の ハ ッ シ ュ ・ バケ ッ ト の各 ロ ーは、 プ ロ ーブ ・ ロ ー の ハ ッ シ ュ ・
キー と 等 し い か ど う か を比較 さ れ ま す。 ロ ーが一致 し た場合、
titleauthor.au_id カ ラ ム が EMIT 演算子に返 さ れ ま す。
HASH JOIN 演算子の showplan 出力に は、 あ ふれ出た分割の補助記憶に
使用 さ れ る ワ ー ク ・ テーブル を 示す メ ッ セ ー ジ が含ま れ ま す。 入力
ロ ー の幅は、 64 KB に制限 さ れて い ま す。
NARY NESTED LOOP JOIN 演算子
NARY NESTED LOOP JOIN 方式がオプテ ィ マ イ ザに よ っ て評価 さ れた り
選択 さ れた り す る こ と は あ り ま せん。 こ れは コ ー ド 生成時に作成 さ れ
る 演算子です。 コ ン パ イ ラ は、 左側が深い複数の NESTED LOOP JOIN
を 見つ け る と 、 NARY NESTED LOOP JOIN 演算子へ の変換 を 試み ま す。
変換ス キ ャ ン に は、 さ ら に 2 つ の要件が設定 さ れて い ま す。 各
NESTED LOOP JOIN 演算子に は 「内部ジ ョ イ ン」 タ イ プが あ る こ と 、
お よ び各 NESTED LOOP JOIN 演算子の右側の子は SCAN 演算子で あ る
こ と です。 RESTRICT 演算子は、 SCAN 演算子よ り 上位で許可 さ れ ま す。
NARY NESTED LOOP JOIN の実行は、 一連の NESTED LOOP JOIN 演算
子の実行 よ り も パ フ ォ ー マ ン ス の点で優れて い ま す。 次の例は、 こ の
2 つ の実行方法の基本的な違い を 示 し た も の です。
一連の NESTED LOOP JOIN が あ る と 、 以前の ス キ ャ ン に よ っ て初期化
さ れた探索可能な引数値に基づ い て、 ス キ ャ ン が ロ ー を 削除す る こ と
が あ り ま す。 そ の ス キ ャ ン は、 失敗 し た ス キ ャ ン の直前に行われた ス
キ ャ ン では な い可能性が あ り ま す。 一連の NESTED LOOP JOIN が あ る
と 、 以前の ス キ ャ ン が、 失敗 し た ス キ ャ ン に何の影響 も 及ぼ し て い な
い場合で も 、 完全に排出 さ れ ま す。 そ の結果、 不必要な I/O が大量に
発生す る こ と が あ り ま す。 NARY NESTED LOOP JOIN の場合、 フ ェ ッ チ
さ れた次の ロ ーは、 失敗 し た探索可能な引数値 を 生み出 し た ス キ ャ ン
か ら 来ま す。 こ の方が、 は る か に効率的です。
select a.au_id, au_fname, au_lname
from titles t, titleauthor ta, authors a
where a.au_id = ta.au_id
and ta.title_id = t.title_id
and a.au_id = t.title_id
86
Adaptive Server Enterprise
第2章
showplan の使用
and au_lname = "Bloom"
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
STEP 1
ク エ リ の タ イ プは SELECT です。
4 operator(s) under root
|ROOT:EMIT Operator (VA = 4)
|
|
|N-ARY NESTED LOOP JOIN 演算子 (VA = 3) に は子が 3 つ あ り ま す。
|
|
|
|
| SCAN Operator (VA = 0)
|
|
| FROM TABLE
|
|
| authors
|
|
| a
|
|
| テーブル ・ ス キ ャ ン です。
|
|
| 前方ス キ ャ ン
|
|
| テーブルの最初に位置付け ま す。
|
|
| デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
|
|
| デー タ ・ ペー ジ に対す る LRU で の バ ッ フ ァ 置換方式
|
|
|
|SCAN Operator (VA = 1)
|
|
| FROM TABLE
|
|
| titleauthor
|
|
| ta
|
|
| テーブル ・ ス キ ャ ン です。
|
|
| 前方ス キ ャ ン
|
|
| テーブルの最初に位置付け ま す。
|
|
| デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
|
|
| デー タ ・ ペー ジ に対す る LRU で の バ ッ フ ァ 置換方式
|
|
|
|
| SCAN Operator (VA = 2)
|
|
| FROM TABLE
|
|
| titles
|
|
| t
|
|
| イ ン デ ッ ク ス : titles_6720023942
|
|
| 前方ス キ ャ ン
|
|
| キー に よ っ て位置付け ま す。
|
|
| イ ン デ ッ ク ス に は、 必要な カ ラ ム がすべて含ま れて い ま す。 ベー ス ・ テーブルは読み
込ま れ ま せん。
|
|
| Keys are:
|
|
| title_id ASC
|
|
| イ ン デ ッ ク ス の リ ー フ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま
す。
|
|
| イ ン デ ッ ク ス の リ ー フ ・ ペー ジ に対す る LRU で の バ ッ フ ァ 置換方式
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
87
クエリ・プランの形状
図 2-3 は一連の NESTED LOOP JOIN を 表現 し た図です。
図 2-3: Nested loop join がある Emit 演算子ツリー
Emit
(VA=6)
NestLoopJoin
InnerJoin
(VA = 5)
NestLoopJoin
InnerJoin
(VA = 3)
IndexScan
aunmid (a)
(VA = 0)
IndexScan
titleidind (t2)
(VA = 4)
Restrict
(0) (0) (4) (0)
(VA = 2)
IndexScan
auidind (ta)
(VA = 1)
ク エ リ ・ プ ロ セ ッ サ演算子に はすべて、 仮想ア ド レ ス が割 り 当て ら れ
ま す。 図 2-3 で VA = が あ る 行は、 所定の演算子の仮想ア ド レ ス を 示 し
て い ま す。
有効な ジ ョ イ ン順は、 authors、 titleauthor、 titles です。 RESTRICT 演算子
は、 titleauthors の ス キ ャ ン の親演算子です。 こ の プ ラ ン は、 次に示す
NARY NESTED LOOP JOIN プ ラ ン に変換 さ れ ま す。
88
Adaptive Server Enterprise
第2章
showplan の使用
図 2-4: NARY NESTED LOOP JOIN 演算子
EMIT
(VA=6)
NaryNLJoin
(VA = 4)
NaryNLJoin
(VA = 4)
IndexScan
(VA = 0)
aunmid (a)
RESTRICT
(VA = 2)
(0) (0) (4) (0)
IndexScan
(VA = 1)
auidind (ta)
NaryNLJoin
(VA = 4)
IndexScan
(VA = 3)
titleidind(t)
変換時で も 、 authors、 titleauthor、 titles と い う 元の ジ ョ イ ン順が維持 さ
れ ま す。 こ の例では、 titles の ス キ ャ ン に ta.title_id = t.title_id と a.au_id =
t.title_id と い う 探索可能な引数が 2 つ あ り ま す。 し たが っ て、 titleauthor
の ス キ ャ ン ま た は authors の ス キ ャ ン が確立 し た探索可能な引数値が
原因 と な っ て、 titles の ス キ ャ ン に失敗 し ま す。 authors の ス キ ャ ン に
よ っ て設定 さ れた探索可能な引数値が原因 と な っ て、 titles の ス キ ャ ン
か ら ロ ーが何 も 返 さ れな い場合、 titleauthor の ス キ ャ ン を 続け る こ と は
無意味です。 titleauthor か ら フ ェ ッ チ し た各 ロ ー に対 し て、 titles の ス
キ ャ ン に失敗 し ま す。 titles の ス キ ャ ン に成功す る 可能性が あ る の は、
新 し い ロ ー を authors か ら フ ェ ッ チ し た と き に かぎ ら れ ま す。 NARY
NESTED LOOP JOIN が実装 さ れた の は こ の た め です。 ス キ ャ ン に成功
し て返 さ れた ロ ー に何の影響 も 及ぼ さ な い テーブルの無駄な排出 を 防
止で き ま す。
こ の例では、 NARY NESTED LOOP JOIN 演算子が titleauthor ス キ ャ ン を
閉 じ て、 authors か ら 新 し い ロ ー を フ ェ ッ チ し 、 titleauthor の ス キ ャ ン を
配置 し 直 し ま す。 こ の再配置は、 authors か ら フ ェ ッ チ さ れた au_id に
基づ き ま す。 こ こ で も ま た、 パ フ ォ ー マ ン ス が大幅に向上す る 可能性
が あ り ま す。 titleauthor テーブル の無駄な排出、 お よ び発生す る 可能性
の あ る 関連す る I/O を 防止で き る か ら です。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
89
クエリ・プランの形状
セミジョイン
セ ミ ジ ョ イ ン は NESTED LOOP JOIN 演算子の変形です。 結果セ ッ ト に
NESTED LOOP JOIN 演算子 を 含み ま す。 2 つ の テーブル間で セ ミ ジ ョ イ
ン を 行 う と 、 Adaptive Server は最初の テ ー ブル の ロ ー を 返 し ま す。 こ
の ロ ー に は、 2 番目の テ ーブル に あ る 一致項目が 1 つ以上含 ま れて い
ま す ( 通常の ジ ョ イ ン では、 最初の テーブルの一致 ロ ーが、 1 回の み返
さ れ ま す )。 つ ま り 、 セ ミ ジ ョ イ ン では、 テーブル を ス キ ャ ン し て一致
す る 値 を すべて返す の では な く 、 一致す る 最初の値 を 見つ け た時点で
ロ ー を 返 し て、 処理 を 停止 し ま す。 セ ミ ジ ョ イ ン は 「存在ジ ョ イ ン 」 と
も 呼ばれ ま す。
た と えば、 titles と titleauthor の各テーブル に対 し て セ ミ ジ ョ イ ン を 実行
す る と 、 次の よ う に な り ま す。
select title
from titles
where title_id in (select title_id from titleauthor)
and title like "A Tutorial%"
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
STEP 1
ク エ リ の タ イ プは SELECT です。
4 operator(s) under root
|ROOT:EMIT Operator (VA = 4)
|
|
|NESTED LOOP JOIN Operator (VA = 3) (Join Type: Left Semi Join)
|
|
|
|
|RESTRICT Operator (VA = 1)(0)(0)(0)(6)(0)
|
|
|
|
|
|
|SCAN Operator (VA = 0)
|
|
|
| FROM TABLE
|
|
|
| titles
|
|
|
| イ ン デ ッ ク ス : titleind
|
|
|
| 前方ス キ ャ ン
|
|
|
| キー に よ っ て位置付け ま す。
|
|
|
| Keys are:
|
|
|
| title ASC
|
|
|
| イ ン デ ッ ク ス の リ ー フ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い
ま す。
|
|
|
| イ ン デ ッ ク ス の リ ー フ ・ ペー ジ に対す る LRU で のバ ッ フ ァ 置換方式
|
|
|
| デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
|
|
|
| デー タ ・ ペー ジ に対す る LRU で のバ ッ フ ァ 置換方式
|
|
|
|
|SCAN Operator (VA = 2)
90
Adaptive Server Enterprise
第2章
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
込ま れ ま せん。
|
|
|
|
|
|
|
|
|
|
|
|
showplan の使用
FROM TABLE
titleauthor
イ ン デ ッ ク ス : titleidind
前方ス キ ャ ン
キー に よ っ て位置付け ま す。
イ ン デ ッ ク ス に は、 必要な カ ラ ム がすべて含ま れて い ま す。 ベー ス ・ テーブルは読み
Keys are:
title_id ASC
イ ン デ ッ ク ス の リ ー フ ・ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
イ ン デ ッ ク ス の リ ー フ ・ ペー ジ に対す る LRU で の バ ッ フ ァ 置換方式
Distinct 演算子
重複削除の実行に使用で き る 単項演算子が 3 つ あ り ま す。 GROUP
SORTED Distinct、 SORT Distinct、 HASH Distinct です。 それぞれ
に利点 と 欠点が あ り ま す。 オプテ ィ マ イ ザは、 ク エ リ ・ プ ラ ン全体 と
の兼ね合い を 考慮 し て、 ど の distinct 演算子 を 使用す る の が効率的な
の か を 判断 し ま す。
すべて の ク エ リ ・ プ ロ セ ッ サ演算子の リ ス ト と そ の説明に つ い ては、
表 1-3 (27 ペ ー ジ ) を 参照 し て く だ さ い。
GROUP SORTED Distinct 演算子
GROUP SORTED Distinct 演算子 を 使用 し て、 重複削除 を 実行で き ま
す。 GROUP SORTED Distinct では、 入力ス ト リ ー ム が distinct カ ラ ム
に あ ら か じ め格納 さ れて い る 必要が あ り ま す。 子演算子か ら ロ ー を 読
み込み、 フ ィ ル タ す る 現在の distinct カ ラ ム の値 を 初期化 し ま す。
ロ ーが親演算子に返 さ れ ま す。 GROUP SORTED 演算子は、 別の ロ ー を
フ ェ ッ チす る た め に再度呼び出 さ れ る と 、 そ の子演算子か ら 別の ロ ー
を フ ェ ッ チ し て、 そ の値 を 現在の キ ャ ッ シ ュ 値 と 比較 し ま す。 値が重
複 し て い る と 、 ロ ーは廃棄 さ れ、 新 し い ロ ー を フ ェ ッ チす る た め に子
演算子が再度呼び出 さ れ ま す。
こ の プ ロ セ ス は、 新 し い distinct ロ ーが見つ か る ま で続き ま す。 こ の
ロ ー に対す る distinct カ ラ ム の値は、 キ ャ ッ シ ュ さ れて、 distinct ロ ー
以外の ロ ー を 後で削除す る た め に使用 さ れ ま す。 現在の ロ ーが、 さ ら
に処理 を 受け る た め に親演算子に返 さ れ ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
91
クエリ・プランの形状
GROUP SORTED Distinct 演算子は、 ソ ー ト さ れた ス ト リ ー ム を 返 し ま
す。 他 と 異な る ソ ー ト さ れたデー タ ・ ス ト リ ー ム を 返す と い う 事実は、
オプテ ィ マ イ ザが追加の ア ッ プ ス ト リ ー ム処理の パ フ ォ ー マ ン ス を 向
上 さ せ る た め に使用で き る 特性です。 GROUP SORTED Distinct 演算子
は、 非ブ ロ ッ ク ・ オペ レ ー タ です。 フ ェ ッ チ し た distinct ロ ー を す ぐ に
親演算子に返 し ま す。 入力ス ト リ ー ム全体を処理 し な く て も 、 ロ ー を返
し 始め る こ と がで き ま す。 次の ク エ リ は、 作家の姓 ( ラ ス ト ・ ネー ム )
と 名 ( フ ァ ー ス ト ・ ネ ー ム ) を 別個に収集 し ま す。
select distinct au_lname, au_fname
from authors
where au_lname = "Bloom"
文 1 (2 行目 ) の ク エ リ ・ プ ラ ン。
STEP 1
ク エ リ の タ イ プは SELECT です。
2 operator(s) under root
ROOT:EMIT Operator (VA = 2)
|GROUP SORTED Operator (VA = 1)
|Distinct
|
|
|SCAN Operator (VA = 0)
|
| FROM TABLE
|
| authors
|
| イ ン デ ッ ク ス : aunmind
|
| 前方ス キ ャ ン
|
| キー に よ っ て位置付け ま す。
|
| イ ン デ ッ ク ス に は、 必要な カ ラ ム がすべて含ま れて い ま す。 ベー ス ・ テーブルは読み
込ま れ ま せん。
|
| Keys are:
|
|
au_lname ASC
|
| イ ンデ ッ ク ス の リ ー フ ・ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
|
| イ ン デ ッ ク ス の リ ー フ ・ ペー ジ に対す る LRU で の バ ッ フ ァ 置換方式
こ の ク エ リ ・ プ ラ ン では distinct プ ロ パテ ィ を 適用す る た め に GROUP
SORTED Distinct 演算子が選択 さ れて い ま す。 それは、 ス キ ャ ン演算
子が、 distinct カ ラ ム の au_lname と au_fname に関 し て ソ ー ト さ れた順
序で ロ ー を 返 し て い る た め です。 GROUP SORTED では、 I/O は発生せ
ず、 CPU オ ーバヘ ッ ド は最小です。
92
Adaptive Server Enterprise
第2章
showplan の使用
GROUP SORTED Distinct 演算子 を 使用 し て、 ベ ク ト ル集合 を 実行で
き ま す。 詳細に つ い ては、 「ベ ク ト ル集合演算子」 (95 ペー ジ ) を 参照
し て く だ さ い。 showplan 出力に行 Distinct が出力 さ れ ま すが、 こ れ
は、 こ の GROUP SORTED Distinct 演算子が distinct プ ロ パテ ィ を 備え
て い る こ と を 示 し ま す。
SORT Distinct 演算子
SORT Distinct 演算子では、 入力ス ト リ ー ム が distinct キー ・ カ ラ ム
で あ ら か じ め ソ ー ト さ れて い る 必要は あ り ま せん。 こ の演算子はブ
ロ ッ ク ・ オ ペ レ ー タ で あ り 、 子演算子の ス ト リ ー ム を 排出 し て、 読み
込み順に ロ ー を ソ ー ト し ま す。 すべて の ロ ーが ソ ー ト さ れた後に、
distinct ロ ーが親演算子に返 さ れ ま す。 ロ ーは distinct キー ・ カ ラ ム で
ソ ー ト さ れて返 さ れ ま す。 入力セ ッ ト が メ モ リ に収ま り き ら な い場
合、 内部 ワ ー ク ・ テーブルが補助記憶 と し て使用 さ れ ま す。
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
STEP 1
ク エ リ の タ イ プは SELECT です。
2 operator(s) under root
ROOT:EMIT Operator (VA = 2)
|SORT Operator
| 内部記憶領域 と し て Worktable1 を使用 し て い ま す。
|
|
|SCAN Operator
|
| FROM TABLE
|
| authors
|
| テーブル ・ ス キ ャ ン です。
|
| 前方ス キ ャ ン
|
| テーブルの最初に位置付け ま す。
|
| デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
|
| デー タ ・ ペー ジ に対す る LRU で の バ ッ フ ァ 置換方式
authors テーブルの ス キ ャ ン では、 distinct キー ・ カ ラ ム で ソ ー ト さ
れた ロ ーは返 さ れ ま せん。 し たが っ て、 GROUP SORTED Distinct 演算
子では な く SORT Distinct 演算子 を 使用す る 必要が あ り ま す。 SORT
演算子の distinct キー ・ カ ラ ム は、 au_lname と au_fname です。 showplan
出力は、 入力セ ッ ト が メ モ リ に収ま り き ら な い場合、 Worktable1 が
デ ィ ス ク ・ ス ト レ ー ジ と し て使用 さ れ る こ と を 示 し て い ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
93
クエリ・プランの形状
HASH Distinct 演算子
HASH Distinct 演算子では、 入力セ ッ ト が distinct キー ・ カ ラ ム で
ソ ー ト さ れて い る 必要は あ り ま せん。 こ の演算子は、 非ブ ロ ッ ク ・ オ
ペ レ ー タ です。 ロ ーが子演算子か ら 読み込ま れて、 distinct キー ・ カ ラ
ム でハ ッ シ ュ さ れ ま す。 こ れ に よ り 、 ロ ー の バケ ッ ト 位置が決ま り
ま す。 キーが既に あ る か ど う か を 確認す る た め に、 対応す る バケ ッ ト
が検索 さ れ ま す。 ロ ー に重複キーが含ま れて い る 場合、 そ の ロ ーは廃
棄 さ れ、 子演算子か ら 別の ロ ーが フ ェ ッ チ さ れ ま す。 重複 し た キーが
存在 し な ければ、 ロ ーはバケ ッ ト に追加 さ れて、 さ ら に処理 を 受け る
た め に親演算子に渡 さ れ ま す。 ロ ーは distinct キー ・ カ ラ ム で ソ ー ト さ
れずに返 さ れ ま す。
HASH Distinct 演算子が使用 さ れ る の は一般に、 入力セ ッ ト が
distinct キー ・ カ ラ ム で ま だ ソ ー ト さ れて い な い場合、 ま た はオプ
テ ィ マ イ ザが、 プ ラ ン内の後で実行 さ れ る distinct 処理に基づ く 順序
を 使用で き な い場合です。
select distinct au_lname, au_fname
from authors
where city = "Oakland"
go
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
STEP 1
ク エ リ の タ イ プは SELECT です。
2 operator(s) under root
ROOT:EMIT Operator (VA = 2)
|HASH DISTINCT Operator (VA = 1)
| 内部記憶領域 と し て Worktable1 を使用 し て い ま す。
|
|
| SCAN Operator (VA = 0)
|
| FROM TABLE
|
| authors
|
| テーブル ・ ス キ ャ ン です。
|
| 前方ス キ ャ ン
|
| テーブルの最初に位置付け ま す。
|
| デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
|
| デー タ ・ ペー ジ に対す る LRU で の バ ッ フ ァ 置換方式
94
Adaptive Server Enterprise
第2章
showplan の使用
こ の例では、 authors テーブル ・ ス キ ャ ン の出力は ソ ー ト さ れ ま せん。
オプテ ィ マ イ ザは、 SORT Distinct か HASH Distinct の ど ち ら か の
演算子方式 を 選択で き ま す。 SORT Distinct 方式が提示す る 順序は、
プ ラ ン内の ど こ に も 役立て る こ と がで き ま せん。 そ こ で、 オプテ ィ マ
イ ザは HASH Distinct 方式 を 選択 し ま す。 オプテ ィ マ イ ザの決定は、
最終的に は コ ス ト の見積 も り に基づ き ま す。 通常は、 HASH Distinct
の方が低 コ ス ト です。 こ れは、 ソ ー ト さ れな い入力ス ト リ ー ム では、
常駐分割の た め に ロ ー を そ の場で削除で き る か ら です。 SORT
Distinct 演算子は、 デー タ ・ セ ッ ト 全体の ソ ー ト が完了す る ま
では、 ロ ー を 削除で き ま せん。
HASH Distinct 演算子の showplan 出力に、 Worktable1 が使用 さ れ る こ
と が示 さ れ ま す。 distinct ロ ー の結果セ ッ ト が メ モ リ に収 ま り き ら な い
場合、 ワ ー ク ・ テーブルが必要に な り ま す。 そ の場合、 部分的に処理
さ れた グループが、 デ ィ ス ク に書き込 ま れ ま す。
ベクトル集合演算子
ベ ク ト ル集合に使用 さ れ る 単項演算子は、 3 つ あ り ま す。 GROUP
SORTED COUNT AGGREGATE、 HASH VECTOR AGGREGATE、 GROUP
INSERTING です。
すべて の ク エ リ ・ プ ロ セ ッ サ演算子の リ ス ト と そ の説明に つ い ては、
表 1-3 (27 ペ ー ジ ) を 参照 し て く だ さ い。
GROUP SORTED COUNT AGGREGATE 演算子
GROUP SORTED COUNT AGGREGATE 非ブ ロ ッ ク ・ オ ペ レ ー タ は、
「GROUP SORTED Distinct 演算子」 (91 ペー ジ ) で説明 し た GROUP
SORTED Distinct 演算子の変形です。 GROUP SORTED COUNT
AGGREGATE 演算子では、 入力セ ッ ト が group by カ ラ ム で ソ ー ト さ
れ る こ と が必要です。 ア ルゴ リ ズ ム は、 GROUP SORTED Distinct
の場合 と 非常に よ く 似て い ま す。
ロ ーが子演算子か ら 読み込ま れ ま す。 そ の ロ ーが、 新 し い ベ ク ト ルの
開始点で あ る 場合、 グループ化カ ラ ム がキ ャ ッ シ ュ さ れ、 集約結果が
初期化 さ れ ま す。
ロ ーが現在処理中の グループ に属 し て い る 場合、 集約関数が集約結果
に適用 さ れ ま す。 子演算子が、 新 し い グループ を 開始す る ロ ー ま た は
End Of Scan を 返す と 、 現在の ベ ク ト ル と そ の集約値が親演算子に返
さ れ ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
95
クエリ・プランの形状
グループ全体が処理 さ れた後、 GROUP SORTED COUNT AGGREGATE
演算子の最初の ロ ーが返 さ れ ま す。 こ の場合、 新 し い グループ の開
始時に、 GROUP SORTED Distinct 演算子の最初の ロ ーが返 さ れ ま す。
こ の例では、 作家が住む city すべて と 各 city に住ん で い る 人数の リ ス
ト を 収集 し ま す。
select city, total_authors = count(*)
from authors
group by city
plan
"(group_sorted
(sort (scan authors))
)"
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
PLAN 句の Abstract Plan を使用 し て最適化 し ま し た。
STEP 1
ク エ リ の タ イ プは SELECT です。
3 operator(s) under root
ROOT:EMIT Operator (VA = 3)
|GROUP SORTED Operator (VA = 2)
| グループ化 さ れた COUNT AGGREGATE を 評価 し ま す。
|
|
|SORT Operator (VA = 1)
|
| 内部記憶領域 と し て Worktable1 を 使用 し て い ま す。
|
|
|
|
| SCAN Operator (VA = 0)
|
|
| FROM TABLE
|
|
| authors
|
|
| テーブル ・ ス キ ャ ン です。
|
|
| 前方ス キ ャ ン
|
|
| テーブルの最初に位置付け ま す。
|
|
| デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を 使用 し て い ま す。
|
|
| デー タ ・ ペー ジ に対す る LRU で のバ ッ フ ァ 置換方式
96
Adaptive Server Enterprise
第2章
showplan の使用
こ の ク エ リ ・ プ ラ ン では、 authors の ス キ ャ ン で ロ ーはグループ化の
順序で返 さ れ ま せん。 グループ化カ ラ ム city に基づ い て ス ト リ ー ム の
順序 を 指定す る た め に、 SORT 演算子が適用 さ れ ま す。 こ の時点で、
GROUP SORTED COUNT AGGREGATE 演算子 を 適用 し て、 count 集約 を
評価で き ま す。
GROUP SORTED COUNT AGGREGATE 演算子の showplan 出力に、 適用中の
集約関数が次の よ う に示 さ れ ま す。
|
グループ化 さ れた COUNT AGGREGATE を評価 し ま す。
HASH VECTOR AGGREGATE 演算子
HASH VECTOR AGGREGATE 演算子は、 ブ ロ ッ ク ・ オ ペ レ ー タ です。 子演
算子の ロ ー を すべて処理 し な い と 、 HASH VECTOR AGGREGATE 演算子
の最初の ロ ー を 親演算子に返せ ま せん。 さ ら に、ア ルゴ リ ズ ム が HASH
Distinct 演算子の ア ルゴ リ ズ ム に似て い ま す。
子演算子か ら ロ ーが フ ェ ッ チ さ れ ま す。 各 ロ ーは、 ク エ リ の グループ
化カ ラ ム で ハ ッ シ ュ さ れ ま す。 ベ ク ト ルが既に あ る か ど う か を 確認す
る た め に、 ハ ッ シ ュ さ れ る バケ ッ ト が検索 さ れ ま す。
group by 値がな い場合、 ベ ク ト ルが追加 さ れ、 こ の最初の ロ ー を 使用
し て集約値が初期化 さ れ ま す。 group by 値が あ る 場合、 現在の ロ ーが
既存の値に集約 さ れ ま す。 こ の例では、 作家が住む city すべて と 各
city に住ん で い る 人数の リ ス ト を 収集 し ま す。
select city, total_authors = count(*)
from authors
group by city
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
STEP 1
ク エ リ の タ イ プは SELECT です。
2 operator(s) under root
ROOT:EMIT Operator (VA = 2)
|HASH VECTOR AGGREGATE Operator (VA = 1)
| GROUP BY
| グループ化 さ れた COUNT AGGREGATE を評価 し ま す。
| 内部記憶領域 と し て Worktable1 を使用 し て い ま す。
| Key Count: 1
|
|
|SCAN Operator (VA = 0)
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
97
クエリ・プランの形状
|
|
|
|
|
|
|
|
|
|
|
|
FROM TABLE
authors
テーブル ・ ス キ ャ ン です。
前方ス キ ャ ン
デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
デー タ ・ ペー ジ に対す る LRU で の バ ッ フ ァ 置換方式
こ の ク エ リ ・ プ ラ ン では、 HASH VECTOR AGGREGATE 演算子が、 子演
算子の ロ ー を すべて読み込み ま す。 こ の子演算子は、 authors テーブル
を ス キ ャ ン し て い ま す。 現在の city 値に対 し てバケ ッ ト ・ エ ン ト リ が
既に あ る か ど う か、 各 ロ ーがチ ェ ッ ク さ れ ま す。 な い場合、 新 し い
city グループ化値 を 持つ ハ ッ シ ュ ・ エ ン ト リ ・ ロ ーが追加 さ れ ま す。
カ ウ ン ト 結果は 1 に初期化 さ れ ま す。 新 し い ロ ー の city 値が既に あ る
場合、 集合関数が適用 さ れ ま す。 こ の場合、 カ ウ ン ト 結果は イ ン ク リ
メ ン ト さ れ ま す。
showplan 出力に、 特に HASH VECTOR AGGREGATE 演算子の た め の group
by メ ッ セ ー ジ が表示 さ れ、 次に グループ化集約 メ ッ セ ー ジ が表示 さ れ
ま す。
|
グループ化 さ れた COUNT AGGREGATE を評価 し ま す。
showplan 出力に、 あ ふれ出た グループ と 未処理の ロ ー を 格納す る た
め に使用 さ れ る ワ ー ク ・ テーブルが示 さ れ ま す。
| 内部記憶領域 と し て Worktable1 を使用 し て い ま す。
GROUP INSERTING
GROUP INSERTING は、 ブ ロ ッ ク ・ オ ペ レ ー タ です。 子演算子の ロ ー を
すべて処理 し な い と 、 GROUP INSERTING 演算子の最初の ロ ー を 返せ ま
せん。
GROUP INSERTING では、 group by 句に使用で き る カ ラ ム数は、 31 以下
に制限 さ れて い ま す。 グループ化カ ラ ム の ク ラ ス タ ー ド ・ イ ン デ ッ ク
ス の あ る ワ ー ク ・ テーブル を 作成す る こ と に よ っ て、 演算子が開始 さ
れ ま す。 各 ロ ーが子か ら フ ェ ッ チ さ れ る と 、 ワ ー ク ・ テーブル の検索
が、 グループ化カ ラ ム に基づ い て実行 さ れ ま す。 ロ ーが何 も 見つ か ら
な い場合、 ロ ーが挿入 さ れ ま す。 こ れ に よ り 、 新 し い グループが効果
的に作成 さ れ、 集約値が初期化 さ れ ま す。 ロ ーが見つ か っ た場合、
評価 し て い る 新 し い値に基づ い て、 新 し い集約値が更新 さ れ ま す。
GROUP INSERTING 演算子は、 グループ化カ ラ ム で順序指定 さ れた
ロ ー を 返 し ま す。
select city, total_authors = count(*)
from authors
group by city
98
Adaptive Server Enterprise
第2章
showplan の使用
plan
'(group_inserting (i_scan auidind authors ))'
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
PLAN 句の Abstract Plan を使用 し て最適化 し ま し た。
STEP 1
ク エ リ の タ イ プは SELECT です。
2 operator(s) under root
|ROOT:EMIT Operator (VA = 2)
|
|
|GROUP INSERTING Operator (VA = 1)
|
| GROUP BY
|
| グループ化 さ れた COUNT AGGREGATE を評価 し ま す。
|
| 内部記憶領域 と し て Worktable1 を使用 し て い ま す。
|
|
|
|
|SCAN Operator (VA = 0)
|
|
| FROM TABLE
|
|
| authors
|
|
| テーブル ・ ス キ ャ ン です。
|
|
| 前方ス キ ャ ン
|
|
| テーブルの最初に位置付け ま す。
|
|
| デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を 使用 し て い ま す。
|
|
| デー タ ・ ペー ジ に対す る LRU で のバ ッ フ ァ 置換方式
こ の例では、 city カ ラ ム でキー化 さ れた ク ラ ス タ ー ド ・ イ ン デ ッ ク ス
の あ る ワ ー ク ・ テーブル を 作成す る こ と に よ っ て、 group inserting 演
算子が開始 さ れ ま す。 次に、 group inserting 演算子は、 authors テーブル
を 排出 し ま す。 各 ロ ー に対 し て、 city 値で検索が実行 さ れ ま す。 現在の
city 値 を 持つ集約 ワ ー ク ・ テーブル に ロ ーが何 も な い場合、 ロ ーが挿
入 さ れ ま す。 こ れ に よ り 、 現在の city 値に対 し て新 し い グループが作
成 さ れ、 count 値が初期化 さ れ ま す。 現在の city 値に対す る ロ ーが見つ
か っ た場合、 評価が実行 さ れ、 COUNT AGGREGATE 値が イ ン ク リ メ ン ト
さ れ ま す。
compute by メッセージ
処理が EMIT 演算子で実行 さ れ ま す。 そ し て、 EMIT 演算子の入力ス ト
リ ー ム が、 ク エ リ 内の任意の order by 要件に従 っ て ソ ー ト さ れ る こ と
が要求 さ れ ま す。 処理は GROUP SORTED AGGREGATE 演算子で実行 さ れ
る 内容 と 似て い ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
99
クエリ・プランの形状
子か ら 読み込ま れ る 各 ロ ーは、 新 し い グループ を 開始す る か ど う か を
チ ェ ッ ク さ れ ま す。 開始 し な い場合、 ク エ リ の要求 さ れた グループ に
集約関数が適切な仕方で適用 さ れ ま す。 新 し い グループが開始 さ れ る
場合、 現在の グループ と そ の集約値がユーザに返 さ れ ま す。 次に、 新
し い グループが開始 さ れ、 そ の集約値が新 し い ロ ー の値か ら 初期化 さ
れ ま す。 次の例では、 すべて の city の順序付け ら れた リ ス ト が収集 さ
れ ま す。 ま た、 各 city の エ ン ト リ 数の総計が、 city リ ス ト の後に報告
さ れ ま す。
select city
from authors
order by city
compute count(city) by city
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
STEP 1
ク エ リ の タ イ プは SELECT です。
2 operator(s) under root
Emit with Compute semantics
ROOT:EMIT Operator (VA = 2)
|SORT Operator (VA = 1)
| 内部記憶領域 と し て Worktable1 を使用 し て い ま す。
|
|
|SCAN Operator (VA = 0)
|
| FROM TABLE
|
| authors
|
| テーブル ・ ス キ ャ ン です。
|
| 前方ス キ ャ ン
|
| テーブルの最初に位置付け ま す。
|
| デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
|
| デー タ ・ ペー ジ に対す る LRU で の バ ッ フ ァ 置換方式
こ の例では、 EMIT 演算子の入力ス ト リ ー ム は、 city 属性で ソ ー ト さ れ
ま す。 各 ロ ー に対 し て、 compute by カ ウ ン ト 値が イ ン ク リ メ ン ト さ れ
ま す。 新 し い city 値が フ ェ ッ チ さ れ る と 、 現在の city の値お よ び関連
づけ ら れた カ ウ ン ト 値がユーザに返 さ れ ま す。 新 し い city 値が、 新 し
い compute by グループ化値に な り 、 カ ウ ン ト が 1 に初期化 さ れ ま す。
100
Adaptive Server Enterprise
第2章
showplan の使用
union 演算子
UNION ALL 演算子
UNION ALL 演算子は、 重複削除 を 実行す る こ と な く 互換性の あ る 複数
の入力ス ト リ ー ム を マ ー ジ し ま す。 UNION ALL 演算子に入力 さ れ る 各
デー タ ・ ロ ーは、 演算子の出力ス ト リ ー ム に入れ ら れ ま す。
UNION ALL 演算子は、 次の メ ッ セ ー ジ を 表示す る N 項演算子です。
UNION ALL OPERATOR
has N children.
<N> は演算子に入 っ て く る 入力ス ト リ ー ム の数です。
こ の例では、 UNION ALL の使い方 を 示 し ま す。
select * from sysindexes where id < 100
union all
select * from sysindexes where id > 200
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
STEP 1
ク エ リ の タ イ プは SELECT です。
3 operator(s) under root
|ROOT:EMIT Operator (VA = 3)
|
| |UNION ALL Operator (VA = 2) has 2 children.
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|SCAN Operator (VA = 0)
| FROM TABLE
| sysindexes
| ク ラ ス タ ー ド ・ イ ン デ ッ ク ス を使用 し て い ま す。
| イ ン デ ッ ク ス : csysindexes
| 前方ス キ ャ ン
| キー に よ っ て位置付け ま す。
| Keys are:
| id ASC
| イ ン デ ッ ク ス の リ ー フ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を 使用 し て い ま す。
| イ ン デ ッ ク ス の リ ー フ ・ ペー ジ に対す る LRU で のバ ッ フ ァ 置換方式
| デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を 使用 し て い ま す。
| デー タ ・ ペー ジ に対す る LRU で のバ ッ フ ァ 置換方式
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
101
union 演算子
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|SCAN Operator (VA = 1)
| FROM TABLE
| sysindexes
| ク ラ ス タ ー ド ・ イ ン デ ッ ク ス を使用 し て い ま す。
| イ ン デ ッ ク ス : csysindexes
| 前方ス キ ャ ン
| キー に よ っ て位置付け ま す。
| Keys are:
| id ASC
| イ ン デ ッ ク ス の リ ー フ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
| イ ン デ ッ ク ス の リ ー フ ・ ペー ジ に対す る LRU で の バ ッ フ ァ 置換方式
| デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
| デー タ ・ ペー ジ に対す る LRU で の バ ッ フ ァ 置換方式
UNION ALL 演算子は、 左端の子か ら ロ ー を すべて フ ェ ッ チす る こ と に
よ っ て開始 さ れ ま す。 こ の例では、 ID が 100 未満の sysindexes ロ ーす
べて を 返 し ま す。 各子演算子のデー タ ・ ス ト リ ー ム が空に な る と 、
UNION ALL 演算子は、 右隣に あ る 子演算子に移 り ま す。 こ の ス ト リ ー
ム が開かれ、 空に な り ま す。 こ の処理は、 最後 (N 番目 ) の子演算子が
空に な る ま で続き ま す。
MERGE UNION 演算子
MERGE UNION 演算子は、 ソ ー ト さ れた互換性の あ る 複数のデー タ ・
ス ト リ ー ム に対 し て UNION ALL 演算 を 実行 し ま す。 そ し て、 デー タ ・
ス ト リ ー ム内の重複 を 削除 し ま す。
MERGE UNION 演算子は、 次の メ ッ セー ジ を 表示す る N 項演算子です。
MERGE UNION OPERATOR has <N> children.
<N> は演算子に入 っ て く る 入力ス ト リ ー ム の数です。
102
Adaptive Server Enterprise
第2章
showplan の使用
HASH UNION
HASH UNION 演算子は、 Adaptive Server の ハ ッ シ ュ ・ ア ルゴ リ ズ ム を 使
用 し て、 複数のデー タ ・ ス ト リ ー ム に対す る UNION ALL 演算の実行、
ハ ッ シ ュ ・ ベ ー ス の重複削除 を 同時に実行 し ま す。
HASH UNION 演算子は、 次の メ ッ セ ー ジ を 表示す る N 項演算子です。
HASH UNION OPERATOR has <N> children.
<N> は演算子に入 っ て く る 入力ス ト リ ー ム の数です。
HASH UNION は、 使用す る ワ ー ク ・ テーブルの名前 も 次の フ ォ ー マ ッ
ト で表示 し ま す。
HASH UNION OPERATOR Using Worktable
storage.
<X>
for internal
こ の ワ ー ク ・ テーブルは、 HASH UNION が現在の反復処理の た め に、
現在空い て い る メ モ リ では処理で き な いデー タ を 一時的に格納す る
た め に使用 さ れ ま す。
こ の例では、 HASH UNION の使い方 を 示 し ま す。
select * from sysindexes
union
select * from sysindexes
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
STEP 1
ク エ リ の タ イ プは SELECT です。
3 operator(s) under root
| ROOT:EMIT Operator (VA = 3)
|
|
|HASH UNION Operator has 2 children.
|
| 内部記憶領域 と し て Worktable1 を使用 し て い ま す。
|
|
|
|
|SCAN Operator
|
|
| FROM TABLE
|
|
| sysindexes
|
|
| テーブル ・ ス キ ャ ン です。
|
|
| 前方ス キ ャ ン
|
|
| テーブルの最初に位置付け ま す。
|
|
| デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
|
|
| デー タ ・ ペー ジ に対す る LRU で のバ ッ フ ァ 置換方式
|
|
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
103
union 演算子
|
|
|
|
|
|
|
|
|SCAN Operator (VA = 1)
|
| FROM TABLE
|
| sysindexes
|
| テーブル ・ ス キ ャ ン です。
|
| 前方ス キ ャ ン
|
| テーブルの最初に位置付け ま す。
|
| デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
|
| デー タ ・ ペー ジ に対す る LRU で のバ ッ フ ァ 置換方式
SCALAR AGGREGATE 演算子
SCALAR AGGREGATE 演算子は、 入力デー タ ・ ス ト リ ー ム に つ い て の実
行情報 を 追跡 し 続け ま す。 た と えば、 ス ト リ ー ム内の ロ ー数や所定の
カ ラ ム の最大値な ど です。
SCALAR AGGREGATE 演算子は、 最大 10 件ま で記載 し た メ ッ セ ー ジ の リ
ス ト を 出力 し ま す。 メ ッ セー ジ の内容は、 実行 さ れた ス カ ラ 集合演算
に つ い てです。 メ ッ セー ジ の フ ォ ー マ ッ ト は次の と お り です。
Evaluate Ungrouped
<Type of Aggregate> Aggregate
<Type of Aggregate> は次の いずれか と な り ま す。 count、 sum、
average、 min、 max、 any、 once-unique、 count-unique、 sum-unique、
average-unique、 ま た は once。
次の ク エ リ は、 pubs2 デー タ ベ ー ス の authors テーブルで SCALAR
AGGREGATE ( つ ま り 、 ラ ッ プ さ れな い ) 集約 を 実行 し ま す。
select count(*) from authors
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
STEP 1
ク エ リ の タ イ プは SELECT です。
2 operator(s) under root
ROOT:EMIT Operator (VA = 2)
|SCALAR AGGREGATE Operator (VA = 1)
| グループ化 さ れて い な い COUNT AGGREGATE を評価 し ま す。
|
|
|SCAN Operator (VA =0)
|
| FROM TABLE
|
| authors
|
| イ ン デ ッ ク ス : aunmind
104
Adaptive Server Enterprise
第2章
|
|
|
れ ま せん。
|
|
showplan の使用
| 前方ス キ ャ ン
| テーブルの最初に位置付け ま す。
| イ ン デ ッ ク ス に は、 必要な カ ラ ム がすべて含ま れて い ま す。 ベー ス ・ テーブルは読み込 ま
| イ ン デ ッ ク ス の リ ー フ ・ ペー ジ に対 し て I/O サ イ ズ 4 キ ロ バ イ ト を使用 し て い ま す。
| イ ン デ ッ ク ス の リ ー フ ・ ペー ジ に対す る LRU で のバ ッ フ ァ 置換方式
SCALAR AGGREGATE メ ッ セ ー ジ は、 実行す る ク エ リ が、 グループ化 さ
れて い な い カ ウ ン ト 集計で あ る こ と を 示 し ま す。
RESTRICT 演算子
RESTRICT 演算子は、 カ ラ ム値 に 基づ い て式 を 評価す る 単項演算子で
す。 RESTRICT 演算子は、 複数の カ ラ ム評価 リ ス ト に関連づけ ら れて い
ま す。 こ の リ ス ト は、 ロ ー を 子演算子か ら フ ェ ッ チす る 前で も フ ェ ッ
チ し た後に で も 処理で き ま す。 ま た、 ロ ー を 子演算子か ら フ ェ ッ チ し
た後に仮想カ ラ ム の値 を 計算す る た め に関連づけ ら れて い ま す。
SORT 演算子
SORT 演算子に は、 ク エ リ ・ プ ラ ン 内に子演算子が 1 つ の み存在 し
ま す。 役割は、 指定 さ れた ソ ー ト ・ キー を 使用 し て、 入力ス ト リ ー ム
か ら 出力デー タ ・ ス ト リ ー ム を 生成す る こ と です。
SORT 演算子は、 可能な場合に は ス ト リ ー ミ ン グ ・ ソ ー ト を 実行す る
こ と が あ り ま すが、 結果 を 一時的に ワ ー ク ・ テーブル に格納 し な けれ
ばな ら な い こ と も あ り ま す。 SORT 演算子は、 ワ ー ク ・ テーブル名 を 次
の フ ォ ー マ ッ ト で表示 し ま す。
Using Worktable <N> for internal storage.
ただ し 、 <N> は showplan 出力内の ワ ー ク ・ テーブル の数値識別子
です。
次の例は、 SORT 演算子 と ワ ー ク ・ テーブル を 使用 し た単純な ク エ リ ・
プ ラ ン の例です。
select au_id from authors order by postalcode
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
STEP 1
ク エ リ の タ イ プは SELECT です。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
105
union 演算子
2 operator(s) under root
ROOT:EMIT Operator (VA = 2)
|SORT Operator (VA = 1)
| 内部記憶領域 と し て Worktable1 を使用 し て い ま す。
|
|
|SCAN Operator (VA = 0)
|
| FROM TABLE
|
| authors
|
| テーブル ・ ス キ ャ ン です。
|
| 前方ス キ ャ ン
|
| テーブルの最初に位置付け ま す。
|
| デー タ ・ ペー ジ に対 し て I/O サ イ ズ 4 キ ロ バ イ ト を使用 し て い ま す。
|
| デー タ ・ ペー ジ に対す る LRU で の バ ッ フ ァ 置換方式
SORT 演算子は、 子演算子 を 排出 し て、 ロ ー を ソ ー ト し ま す。 こ の
場合、 postalcode 属性 を 使用 し て authors テーブルか ら フ ェ ッ チ し た各
ロ ー を ソ ー ト し ま す。 ロ ーがすべて メ モ リ に収ま る 場合に は、 デー タ
がデ ィ ス ク に あ ふれ出 る こ と は あ り ま せん。 し か し 、 入力デー タ の サ
イ ズが、 バ ッ フ ァ の空き領域 を 超え る 場合に は、 ソ ー ト さ れた実行が
デ ィ ス ク に あ ふれ出ま す。 こ の よ う な実行は、 よ り 大き い ソ ー ト さ れ
た実行に再帰的に マ ー ジ さ れ ま す。 こ れは、 実行 を 読み込ん で マ ー ジ
す る た め に使用で き る バ ッ フ ァ の数よ り 、 実行の数が少な く な る ま で
続き ま す。
STORE 演算子
STORE 演算子は、 ワ ー ク ・ テーブルの作成、 ワ ー ク ・ テーブルへ の入
力、 そ し て恐 ら く はそ の イ ン デ ッ ク ス の作成に使用 さ れ ま す。 ワ ー
ク ・ テーブルは、 ク エ リ ・ プ ラ ン 実行の一部 と し て、 プ ラ ン内の他の
演算子に よ っ て使用 さ れ ま す。 SEQUENCER 演算子に よ っ て、 ワ ー ク ・
テーブルお よ び実行 さ れ る 可能性の あ る イ ン デ ッ ク ス作成に対応す る
プ ラ ン ・ フ ラ グ メ ン ト が先に実行 さ れて か ら 、 そ の ワ ー ク ・ テーブル
を 使用す る 他の プ ラ ン ・ フ ラ グ メ ン ト が実行 さ れ る こ と が保証 さ れ ま
す。 こ れは、 あ る プ ラ ン が並列で実行 さ れ る 場合に重要です。 実行プ
ロ セ ス は非同期的に行われ る か ら です。
再 フ ォ ー マ ッ ト 方式では、 STORE 演算子 を 使用 し て、 ク ラ ス タ ー ド ・
イ ン デ ッ ク ス の あ る ワ ー ク ・ テーブル を 作成 し ま す。
106
Adaptive Server Enterprise
第2章
showplan の使用
再 フ ォ ー マ ッ ト 演算に STORE 演算子が使用 さ れた場合、 次の メ ッ セ ー
ジ が出力 さ れ ま す。
Worktable <X> created, in <L> locking mode for
reformatting.
ロ ッ キ ン グ ・ モ ー ド <L> は、 “allpages”、 “datapages”、 “datarows” の い
ずれかで な ければな り ま せん。
STORE 演算子は、 次の メ ッ セ ー ジ も 出力 し ま す。
Creating clustered index.
再 フ ォ ー マ ッ ト 演算に STORE 演算子が使用 さ れな い場合に は、 次の
メ ッ セ ー ジ が出力 さ れ ま す。
Worktable <X> created, in <L> locking mode.
次の例は、 STORE 演算子 と SEQUENCER 演算子に適用 さ れ ま す。
select * from bigun a, bigun b where a.c4 = b.c4 and a.c2 < 10
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
PLAN 句の Abstract Plan を使用 し て最適化 し ま し た。
STEP 1
ク エ リ の タ イ プは SELECT です。
7 operator(s) under root
|ROOT:EMIT Operator (VA = 7)
|
| |SEQUENCER Operator (VA = 6) に は子が 2 つ あ り ま す。
| |
| | |STORE Operator (VA = 5)
| | | REFORMATTING に対 し て全ペー ジ ・ ロ ッ ク ・ モ ー ド で Worktable1 が作成 さ れ ま し た。
| | | ク ラ ス タ ー ド ・ イ ン デ ッ ク ス を使用 し て い ま す。
| | |
| | | |INSERT Operator(VA = 4)
| | | | 直接更新モ ー ド です。
| | | |
| | | | |SCAN Operator(VA = 0)
| | | | | FROM TABLE
| | | | | bigun
| | | | | b
| | | | | テーブル ・ ス キ ャ ン です。
| | | | | 前方ス キ ャ ン
| | | | | テーブルの最初に位置付け ま す。
| | | | | デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
107
union 演算子
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| | デー タ ・ ペー ジ に対す る LRU で のバ ッ フ ァ 置換方式
|
| TO TABLE (VA = 3)
| ワ ー ク ・ テーブル 1
|NESTED LOOP JOIN (Join Type: Inner Join)(VA = 7)
|
| |SCAN Operator (VA = 2)
| | FROM TABLE
| | bigun
| | a
| | テーブル ・ ス キ ャ ン です。
| | 前方ス キ ャ ン
| | テーブルの最初に位置付け ま す。
| | デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
| | デー タ ・ ペー ジ に対す る LRU で のバ ッ フ ァ 置換方式
|
| |SCAN Operator (VA = 1)
| | FROM TABLE
| | ワ ー ク ・ テーブル 1
| | ク ラ ス タ ー ド ・ イ ン デ ッ ク ス を使用 し て い ま す。
| | 前方ス キ ャ ン
| | Positioning key.
| デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
| デー タ ・ ペー ジ に対す る LRU で のバ ッ フ ァ 置換方式
上記の プ ラ ン例では、 STORE 演算子は、 再 フ ォ ー マ ッ ト 方式で使用 さ
れて い ま す。 位置は、 SEQUENCER 演算子の左端の子の SEQUENCER 演算
子の直下です。
STORE 演算子は、 Worktable1 を 作成 し ま す。 そ の下に あ る INSERT 演算
子がそ の ワ ー ク ・ テーブル に挿入 し ま す。 次に、 STORE 演算子は、
Worktable1 の ク ラ ス タ ー ド ・ イ ン デ ッ ク ス を 作成 し ま す。 イ ン デ ッ ク
ス は、 ジ ョ イ ン ・ キー b.c4 で作成 さ れ ま す。
108
Adaptive Server Enterprise
第2章
showplan の使用
SEQUENCER 演算子
SEQUENCER 演算子は、 N 項演算子で あ り 、 下に あ る 各子プ ラ ン を 順序
ど お り に実行す る た め に使用 さ れ ま す。 SEQUENCER 演算子は、
reformatting プ ラ ン と 特定の集約処理プ ラ ン で使用 さ れ ま す。
SEQUENCER 演算子は、 右端以外の各子サブプ ラ ン を 実行 し ま す。 左側
の子サブプ ラ ン がすべて実行 さ れた後に、 右端の子サブプ ラ ン が実行
さ れ ま す。
SEQUENCER 演算子は、 次の メ ッ セ ー ジ を 表示 し ま す。
SEQUENCER operator has N children.
select * from tab1 a, tab2 b where a.c4 = b.c4 and a.c2 < 10
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
PLAN 句の Abstract Plan を使用 し て最適化 し ま し た。
STEP 1
ク エ リ の タ イ プは SELECT です。
7 operator(s) under root
|ROOT:EMIT Operator (VA = 7)
|
| |SEQUENCER Operator (VA = 6) に は子が 2 つ あ り ま す。
| |
| | |STORE Operator (VA = 5)
| | | REFORMATTING に対 し て全ペー ジ ・ ロ ッ ク ・ モ ー ド で Worktable1 が作成 さ れ ま し
た。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| ク ラ ス タ ー ド ・ イ ン デ ッ ク ス を使用 し て い ま す。
|
| |INSERT Operator (VA = 4)
| | 直接更新モ ー ド です。
| |
| | |SCAN Operator (VA = 0)
| | | FROM TABLE
| | | tab2
| | | b
| | | テーブル ・ ス キ ャ ン です。
| | | 前方ス キ ャ ン
| | | テーブルの最初に位置付け ま す。
| | | デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を 使用 し て い ま す。
| | | デー タ ・ ペー ジ に対す る LRU で のバ ッ フ ァ 置換方式
| |
| | TO TABLE
| | ワ ー ク ・ テーブル 1
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
109
union 演算子
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|NESTED LOOP JOIN Operator (Join Type: Inner Join) (VA = 3)
|
| |SCAN Operator (VA = 2)
| | FROM TABLE
| | tab1
| | a
| | テーブル ・ ス キ ャ ン です。
| | 前方ス キ ャ ン
| | テーブルの最初に位置付け ま す。
| | デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
| | デー タ ・ ペー ジ に対す る LRU で のバ ッ フ ァ 置換方式
|
| |SCAN Operator (VA = 1)
| | FROM TABLE
| | ワ ー ク ・ テーブル 1
| | ク ラ ス タ ー ド ・ イ ンデ ッ ク ス を 使用 し て い ま す。
| | 前方ス キ ャ ン
| | キー に よ っ て位置付け ま す。
| | デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
| | デー タ ・ ペー ジ に対す る LRU で のバ ッ フ ァ 置換方式
こ の例では、 SEQUENCER 演算子は、 再 フ ォ ー マ ッ ト 方式 を 実施 し
ま す。 SEQUENCER 演算子の左端の ブ ラ ン チが、 Worktable1 の ク ラ ス
タ ー ド ・ イ ン デ ッ ク ス を 作成 し ま す。 SEQUENCER 演算子は、 こ の ブ ラ
ン チが実行 さ れて閉 じ ら れて か ら 、 次の子演算子に進み ま す。 やがて
右端の子に到達 し 、 開い て排出 し 始め て親演算子に ロ ー を 返 し ま す。
SEQUENCER 演算子の設計意図は、 右端の ブ ラ ン チ に あ る 演算子が、
SEQUENCER 演算子の先行す る 外側の ブ ラ ン チで作成 さ れた ワ ー ク ・
テーブル を 使用す る よ う に す る こ と です。 こ の例では、 Worktable1 が
ネ ス ト ループ ・ ジ ョ イ ン方式で使用 さ れ ま す。 Worktable1 の ス キ ャ ン
は、 キー に よ っ て tab1 の外側ス キ ャ ン に由来す る 各 ロ ー の ク ラ ス
タ ー ド ・ イ ン デ ッ ク ス に配置 さ れ ま す。
REMOTE SCAN 演算子
REMOTE SCAN 演算子は、 SQL ク エ リ を 実行す る た め に リ モ ー ト ・ サー
バ に送信 し ま す。 次に、 リ モ ー ト ・ サーバか ら 結果が返 さ れた場合に
は、 そ の結果 を 処理 し ま す。 REMOTE SCAN は、 処理す る SQL ク エ リ の
書式設定済みテキ ス ト を 表示 し ま す。
REMOTE SCAN 演算子の子演算子は、 0 個か 1 個です。
110
Adaptive Server Enterprise
第2章
showplan の使用
SCROLL 演算子
SCROLL 演算子は、 Adaptive Server の ス ク ロ ール可能カ ー ソ ル の機能 を
カ プセル化 し ま す。 ス ク ロ ール可能カ ー ソ ルは、 非反映型で あ る こ と
が あ り ま す。 こ の場合、 カ ー ソ ルが開かれた と き に撮 ら れた関連づけ
ら れたデー タ の ス ナ ッ プ シ ョ ッ ト が表示 さ れ ま す。 ま た、 半反映型で
あ る こ と も あ り ま す。 こ の場合に は、 フ ェ ッ チ対象の次の ロ ーは、 ラ
イ ブ ・ デー タ か ら 取得 さ れ ま す。
SCROLL 演算子は、 次の メ ッ セ ー ジ を 表示す る 単項演算子です。
SCROLL OPERATOR ( Sensitive Type: <T>)
タ イ プは非反映型か半反映型の ど ち ら かです。
次の例は、 非反映型ス ク ロ ール可能カ ー ソ ル を 特徴 と す る プ ラ ン の例
です。
declare CI insensitive scroll cursor for
select au_lname, au_id from authors
go
set showplan on
go
open CI
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
STEP 1
ク エ リ の タ イ プは OPEN CURSOR CI です。
文 1 (2 行目 ) の ク エ リ ・ プ ラ ン。
STEP 1
ク エ リ の タ イ プは DECLARE CURSOR です。
2 operator(s) under root
ROOT:EMIT Operator (VA = 2)
|SCROLL Operator (Sensitive Type: Insensitive) (VA = 1)
| 内部記憶領域 と し て Worktable1 を 使用 し て い ま す。
|
|
|SCAN Operator (VA = 0)
|
| FROM TABLE
|
| authors
|
| テーブル ・ ス キ ャ ン です。
|
| 前方ス キ ャ ン
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
111
union 演算子
|
|
|
| テーブルの最初に位置付け ま す。
| デー タ ・ ペー ジ に対 し て I/O サ イ ズ 4 キ ロ バ イ ト を使用 し て い ま す。
| デー タ ・ ペー ジ に対す る LRU で のバ ッ フ ァ 置換方式
SCROLL 演算子は、 ルー ト の EMIT 演算子の子演算子です。 唯一の子は、
authors テーブルの SCAN 演算子です。 SCROLL メ ッ セ ー ジ は、 CI カ ー ソ
ルが非反映型に な る こ と を 指定 し ま す。
ス ク ロ ール可能カ ー ソ ルの ロ ーは、 最初に メ モ リ に キ ャ ッ シ ュ さ れ ま
す。 処理対象デー タ の量が、 キ ャ ッ シ ュ の物理 メ モ リ 制限値 を 超え る
場合、 こ の キ ャ ッ シ ュ の補助記憶 と し て Worktable1 が使用 さ れ ま す。
RID JOIN 演算子
RID JOIN 演算子は、 二項演算子で あ り 、 同 じ ソ ー ス ・ テーブルの た め
に生成 さ れた ロ ー ID に基づ い て、 2 つ のデー タ ・ ス ト リ ー ム を ジ ョ イ
ン し ま す。 SQL テーブルの各デー タ ・ ロ ーは、 ユニー ク な ロ ー IR (RID)
に関連づけ ら れ ま す。 rid-join の こ と は、self-join ク エ リ の特殊な ケ ー ス
と 考え て く だ さ い。 左側の子が、 ユニー ク に条件 を 満たす RID の セ ッ
ト を ワ ー ク ・ テーブル に入力 し ま す。 RID は、 distinct フ ィ ル タ を RID
に 適用 し た こ と の 結果で す。 こ の RID は、 同 じ ソ ー ス ・ テ ー ブ ル の
ま っ た く 異な る 複数の イ ン デ ッ ク ス ・ ケ ー ス か ら 返 さ れた も の です。
RID JOIN 演算子は、一般的な or 方式 を 実施す る た め に使用 さ れ ま す。
一般的な or 方式が よ く 使用 さ れ る の は、 ク エ リ の述部に論理和の コ レ
ク シ ョ ン が含ま れ る 場合です。 こ の述部は、 同 じ テーブルの さ ま ざ ま
な イ ン デ ッ ク ス を 使用 し て修飾で き ま す。 こ の場合、 各 イ ン デ ッ ク ス
は、 そ の イ ン デ ッ ク ス で修飾で き る 述部に基づ い て ス キ ャ ン さ れ ま
す。 修飾す る 各 イ ン デ ッ ク ス ・ ロ ー に対 し て、 RID が返 さ れ ま す。
返 さ れた RID は、 処理 さ れて一意性が確保 さ れ、 同 じ ロ ーが 2 回返 さ
れ る こ と は あ り ま せん ( それ ら の論理和の う ち 、 複数の も の が同 じ
ロ ー を 修飾す る と 、 2 回返 さ れ る こ と が あ り ま す )。
RID JOIN 演算子は、 ユニー ク な RID を ワ ー ク ・ テーブル に挿入 し ま
す。 ユニー ク な RID の ワ ー ク ・ テーブルは、 rid-join の右ブ ラ ン チ に あ
る ス キ ャ ン演算子に渡 さ れ ま す。 こ の ア ク セ ス ・ メ ソ ッ ド は、 処理対
象の次の RID を ワ ー ク ・ テーブルか ら 直接、 繰 り 返 し フ ェ ッ チで き ま
す。 次に、 こ の ロ ーは RID JOIN 親演算子に返 さ れ ま す。
112
Adaptive Server Enterprise
第2章
showplan の使用
RID JOIN 演算子は、 次の メ ッ セ ー ジ を 表示 し ま す。
Using Worktable <N> for internal storage.
こ の ワ ー ク ・ テーブルは、 左側の子か ら 生成 さ れたユニー ク な RID を
格納 し ま す。
次の例は、 RID JOIN 演算子の showplan 出力 を 示 し た も の です。
select * from tab1 a where a.c1 = 10 or a.c3 = 10
文 1 (2 行目 ) の ク エ リ ・ プ ラ ン。
STEP 1
ク エ リ の タ イ プは SELECT です。
6 operator(s) under root.
|ROOT:EMIT Operator (VA = 6)
|
| |RID JOIN Operator (VA = 5)
| | 内部記憶領域 と し て Worktable2 を使用 し て い ま す。
| |
| | |HASH UNION Operator (VA = 6) has 2 children.
| | | Key Count: 1
| | |
| | | |SCAN Operator (VA = 0)
| | | | FROM TABLE
| | | | tab1
| | | | a
| | | | イ ン デ ッ ク ス :tab1idx
| | | | 前方ス キ ャ ン
| | | | キー に よ っ て位置付け ま す。
| | | | イ ン デ ッ ク ス に は、 必要な カ ラ ム がすべて含ま れて い ま す。 ベー ス ・ テーブルは読み
込ま れ ま せん。
| | | | Keys are:
| | | | c1 ASC
| | | | イ ン デ ッ ク ス の リ ー フ ・ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
| | | | イ ン デ ッ ク ス の リ ー フ ・ ペー ジ に対す る LRU で の バ ッ フ ァ 置換方式
| | |
| | | |SCAN Operator (VA = 4)
| | | | FROM TABLE
| | | | tab1
| | | | a
| | | | イ ン デ ッ ク ス :tab1idx2
| | | | 前方ス キ ャ ン
| | | | キー に よ っ て位置付け ま す。
| | | | イ ン デ ッ ク ス に は、 必要な カ ラ ム がすべて含ま れて い ま す。 ベー ス ・ テーブルは読み
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
113
union 演算子
込ま れ ま せん。
| | | | Keys are:
| | | | c3 ASC
| | | | イ ンデ ッ ク ス の リ ー フ ・ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
| | | | イ ンデ ッ ク ス の リ ー フ ・ ペー ジ に対す る LRU で の バ ッ フ ァ 置換方式
| |
| | |RESTRICT Operator (VA = 3)
| | |
| | | |SCAN Operator (VA = 2)
| | | | FROM TABLE
| | | | tab1
| | | | a
| | | | 動的 イ ン デ ッ ク ス を使用 し て い ま す。
| | | | 前方ス キ ャ ン
| | | | ロ ー識別子 (RID) に よ っ て位置付け ま す。
| | | | デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
| | | | デー タ ・ ペー ジ に対す る LRU で のバ ッ フ ァ 置換方式
こ の例では、 イ ン デ ッ ク ス tab1idx が ス キ ャ ン さ れ、 c1 値が 10 の tab1
か ら RID がすべて取得 さ れ ま す。 Adaptive Server は、 tab1idx2 を ス キ ャ
ン し て、 c3 値が 10 の tab1 か ら RID を すべて取得 し ま す。
HASH UNION 演算子が使用 さ れて、 重複す る RID が削除 さ れ ま す。 c1
ロ ー と c3 ロ ー の値が共に 10 で あ る 任意の tab1 ロ ー に、 重複 RID が存
在 し ま す。
RID JOIN 演算子は、 返 さ れた ロ ー を すべて Worktable2 に挿入 し ま す。
Worktable2 は、 完全に入力 さ れた後に、 tab1 の ス キ ャ ン に渡 さ れ ま す。
ア ク セ ス ・ メ ソ ッ ド は、 最初の RID を フ ェ ッ チ し て、 関連づけ ら れた
ロ ー を 検索 し 、 RID JOIN 演算子に返 し ま す。 tab1 の ス キ ャ ン 演算子の
それ以降の呼び出 し に お い て、 ア ク セ ス ・ メ ソ ッ ド は、 次の処理対象
RID を フ ェ ッ チ し て、 関連づけ ら れた ロ ー を 返 し ま す。
SQLFILTER 演算子
SQLFILTER 演算子は、 サブ ク エ リ を 実行す る N 項演算子です。 左端の
子は外部 ク エ リ で あ り 、 そ の他の子は、 1 つ以上の サブ ク エ リ に関連
づけ ら れた ク エ リ ・ プ ラ ン ・ フ ラ グ メ ン ト です。
左端の子が、 他の子プ ラ ン に代入 さ れ る 相関値 を 生成 し ま す。
SQLFILTER 演算子は、 次の メ ッ セ ー ジ を 表示 し ま す。
SQFILTER Operator has <N> children.
こ の例では、 SQLFILTER の使い方 を 示 し ま す。
114
Adaptive Server Enterprise
第2章
showplan の使用
select pub_name from publishers
where pub_id =
(select distinct titles.pub_id from titles
where publishers.pub_id = titles.pub_id
and price > $1000)
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
4 operator(s) under root
STEP 1
ク エ リ の タ イ プは SELECT です。
4 operator(s) under root
ROOT:EMIT Operator (VA = 4)
|SQFILTER Operator (VA = 3) has 2 children.
|
| |SCAN Operator (VA = 0)
| | FROM TABLE
| | publishers
| | テーブル ・ ス キ ャ ン です。
| | 前方ス キ ャ ン
| | テーブルの最初に位置付け ま す。
| | デー タ ・ ペー ジ に対 し て I/O サ イ ズ 8 キ ロ バ イ ト を使用 し て い ま す。
| | デー タ ・ ペー ジ に対す る LRU で の バ ッ フ ァ 置換方式
|
| サブ ク エ リ 1 の実行 ( ネ ス ト ・ レ ベル 1)
|
| サブ ク エ リ 1 に対す る ク エ リ ・ プ ラ ン ( ネ ス ト ・ レ ベル 0、 3 行目 )
|
| Correlated Subquery
| Subquery under an EXPRESSION predicate.
|
| |SCALAR AGGREGATE Operator (VA = 2)
| | グループ化 さ れて い な い ONCE-UNIQUE AGGREGATE を評価 し ま す。
| |
| | |SCAN Operator (VA = 1)
| | | FROM TABLE
| | | titles
| | | テーブル ・ ス キ ャ ン です。
| | | 前方ス キ ャ ン
| | | Postitioning at start of table.
| | | デー タ ・ ペー ジ に対 し て I/O サ イ ズ 8 キ ロ バ イ ト を 使用 し て い ま す。
| | | デー タ ・ ペー ジ に対す る LRU で のバ ッ フ ァ 置換方式
|
| サブ ク エ リ 1 に対す る ク エ リ ・ プ ラ ン終了
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
115
union 演算子
こ の例では、 SQLFILTER 演算子に子が 2 つ あ り ま す。 左端の子は、 ク
エ リ の外部ブ ロ ッ ク です。 こ れは、 publishers テーブル の単純な ス キ ャ
ン です。 右側の子は、 ク エ リ の サブ ク エ リ を 評価す る た め に使用 さ れ
ま す。 SQLFILTER は外部ブ ロ ッ ク か ら ロ ー を フ ェ ッ チ し ま す。 外部ブ
ロ ッ ク の各 ロ ー に対 し て、 SQLFILTER は右側の子 を 呼び出 し て、 サブ
ク エ リ を 評価 し ま す。 サブ ク エ リ が TRUE と 評価 さ れた場合、
SQLFILTER の親演算子に ロ ーが返 さ れ ま す。
EXCHANGE 演算子
EXCHANGE 演算子は、 単項演算子で あ り 、 Adaptive Server の SQL ク エ
リ の並列処理 を カ プセル化 し ま す。 EXCHANGE は、 ク エ リ ・ プ ラ ン内
の ほぼ ど こ に で も 配置で き、 ク エ リ ・ プ ラ ン を 複数の プ ラ ン ・ フ ラ グ
メ ン ト に分割 し ま す。 1 つ の プ ラ ン ・ フ ラ グ メ ン ト が、 1 つ の ク エ リ ・
プ ラ ン ・ ツ リ ー に な り ま す。 こ の ツ リ ー のルー ト は、 EMIT 演算子か
EXCHANGE:EMIT 演算子です。 リ ー フ は SCAN 演算子か EXCHANGE 演算
子です。 単独の プ ロ セ ス に よ っ て実行 さ れ る プ ラ ン ・ フ ラ グ メ ン ト
は、 逐次プ ラ ン です。
EXCHANGE 演算子の子演算子は常に、 EXCHANGE:EMIT 演算子と な り ます。
EXCHANGE:EMIT は、 新 し い プ ラ ン ・ フ ラ グ メ ン ト の ル ー ト で す。
EXCHANGE 演算子に は、 「ベ ー タ ・ プ ロ セ ス」 と 呼ばれ る 関連づけ ら れ
たサーバ ・ プ ロ セ ス が あ り ま す。 こ の プ ロ セ ス は、 EXCHANGE 演算子の
ワ ー カ ー ・ プ ロ セ ス の ロ ー カ ル実行 コ ーデ ィ ネ ー タ と し て機能 し ま す。
ワ ー カ ー ・ プ ロ セ ス は、 親 EXCHANGE 演算子 と そ の ベ ー タ ・ プ ロ セ ス
の指示 に 従 っ て、 プ ラ ン ・ フ ラ グ メ ン ト を 実行 し ま す。 プ ラ ン ・ フ ラ
グ メ ン ト は、 プ ロ セ ス を 2 つ以上使用 し て並列実行 さ れ る こ と が よ く
あ り ま す。 EXCHANGE 演算子 と ベー タ ・ プ ロ セ ス は、 ア ク テ ィ ビ テ ィ
( フ ラ グ メ ン ト 境界間で のデー タ 交換な ど ) を コ ーデ ィ ネ ー ト し ま す。
最上部の プ ラ ン ・ フ ラ グ メ ン ト は、 ルー ト が EXCHANGE:EMIT 演算子
では な く EMIT 演算子で あ り 、 「ア ル フ ァ ・ プ ロ セ ス」 に よ っ て実行 さ
れ ま す。 ア ル フ ァ ・ プ ロ セ ス は、 ユーザ接続 と 関連づけ ら れた コ ン
シ ュ ー マ ・ プ ロ セ ス です。 ア ル フ ァ ・ プ ロ セ ス は、 ク エ リ ・ プ ラ ン の
ワ ー カ ー ・ プ ロ セ ス すべて の グ ロ ーバル ・ コ ーデ ィ ネ ー タ です。 初回
に プ ラ ン ・ フ ラ グ メ ン ト の ワ ー カ ー ・ プ ロ セ ス すべて を セ ッ ト ア ッ プ
し て、 最後に は ワ ー カ ー ・ プ ロ セ ス を 解放す る 処理 を 担当 し ま す。 実
行時に、 プ ラ ン ・ フ ラ グ メ ン ト の ワ ー カ ー ・ プ ロ セ ス すべて を 管理 し
て コ ーデ ィ ネ ー ト し ま す。
EXCHANGE 演算子は、 次の メ ッ セ ー ジ を 表示 し ま す。
Executed in parallel by N producer and P consumer processes.
116
Adaptive Server Enterprise
第2章
showplan の使用
プ ロ デ ュ ーサ数は、 プ ラ ン ・ フ ラ グ メ ン ト を 実行す る ワ ー カ ー ・ プ ロ
セ ス数 を 表 し ま す。 こ の プ ラ ン ・ フ ラ グ メ ン ト は、 EXCHANGE 演算子の
下 に 位置 し ま す。 コ ン シ ュ ー マ数は、 プ ラ ン ・ フ ラ グ メ ン ト を 実行す
る ワ ー カ ー ・ プ ロ セ ス 数 を 表 し ま す。 こ の プ ラ ン ・ フ ラ グ メ ン ト は、
EXCHANGE 演算子の上に位置 し ま す。 コ ン シ ュ ー マ は、 プ ロ デ ュ ーサか
ら 渡 さ れ た デ ー タ を 処理 し ま す。 デ ー タ は、 パ イ プ を 通 じ て プ ロ
デ ュ ー サ と コ ン シ ュ ー マ の プ ロ セ ス 間 で 交換 さ れ ま す。 パ イ プ は
EXCHANGE 演算子 で セ ッ ト ア ッ プ さ れ た も の で す。 プ ロ デ ュ ー サ の
EXCHANGE:EMIT 演算子は、 ロ ー を パ イ プ に書き込み ま す。 コ ン シ ュ ー
マ は、 こ の パ イ プ か ら ロ ー を 読み込み ま す。 パ イ プ ・ メ カ ニ ズ ム は、
デー タ が失われな い よ う に プ ロ デ ュ ーサ の書き込み と コ ン シ ュ ー マ の
読み込み を 同期 し ま す。
こ の例では、 シ ス テ ム ・ テーブル sysmessages に対す る master デー タ
ベー ス の並列 ク エ リ を 示 し ま す。
use master
go
set showplan on
go
select count(*) from sysmessages t1 plan '(t_scan t1)
(prop t1 (parallel 4))
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
強制的に選択 さ れた オプ シ ョ ン ( 内部で生成 さ れた Abstract Plan) を使用 し て最適化 し ま し た
調整プ ロ セ ス と 4 作業プ ロ セ ス に よ り 並列に実行 さ れ ま し た。
4 operator(s) under root
ク エ リ の タ イ プは SELECT です。
ROOT:EMIT Operator
|SCALAR AGGREGATE Operator
| グループ化 さ れて い な い COUNT AGGREGATE を 評価 し ま す。
|
|
|EXCHANGE Operator
|
|4 プ ロ デ ュ ーサ ・ プ ロ セ ス と 1 コ ン シ ュ ー マ ・ プ ロ セ ス に よ り 並列に実行 さ れ ま し た。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|EXCHANGE:EMIT Operator
|
|
|SCAN Operator
|
| FROM TABLE
|
| sysmessages
|
| テーブル ・ ス キ ャ ン です。
|
| 前方ス キ ャ ン
|
| テーブルの最初に位置付け ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
117
instead of トリガ演算子
|
|
|
|
|
|
|
|
|
|
|
|
4 方向ハ ッ シ ュ ・ ス キ ャ ン に よ り 並列に実行 さ れ ま し た。
デー タ ・ ペー ジ に対 し て I/O サ イ ズ 4 キ ロ バ イ ト を使用 し て い ま す。
デー タ ・ ペー ジ に対す る LRU で の バ ッ フ ァ 置換方式
こ の例に は、 プ ラ ン ・ フ ラ グ メ ン ト が 2 つ あ り ま す。 並列で あ ろ う と
な か ろ う と 、 任意の プ ラ ン に お け る 最初の フ ラ グ メ ン ト のルー ト は常
に、 EMIT と な り ま す。 こ の例の最初の フ ラ グ メ ン ト は、 EMIT、
SCALAR AGGREGATE、 EXCHANGE の各演算子で構成 さ れ ま す。 こ の最初
の フ ラ グ メ ン ト は常に、 単独の ア ル フ ァ ・ プ ロ セ ス に よ っ て実行 さ れ
ま す。 こ の例では、 最初の フ ラ グ メ ン ト は、 ベ ー タ ・ プ ロ セ ス と し て
も 機能 し て、 EXCHANGE 演算子の ワ ー カ ー ・ プ ロ セ ス の管理 を 担当 し
ま す。
2 番目の プ ラ ン ・ フ ラ グ メ ン ト のルー ト は、 EXCHANGE:EMIT 演算
子です。 SCAN 演算子が、 唯一の子演算子です。 SCAN 演算子は、
sysmessages テーブルの ス キ ャ ン を 担当 し ま す。 ス キ ャ ン は並列に
実行 さ れ ま す。
Executed in parallel with a 4-way hash scan
こ れは、 各 ワ ー カ ー ・ プ ロ セ ス が、 テーブルの約 1/4 を 担当す る こ と
を 示 し ま す。 保有す る デー タ ・ ペ ー ジ ID に基づ い て、 ワ ー カ ー ・ プ ロ
セ ス に ペー ジ が割 り 当て ら れ ま す。
EXCHANGE:EMIT 演算子は、 デー タ ・ ロ ー を コ ン シ ュ ー マ に書き込み
ま す。 具体的に は、 親 EXCHANGE 演算子に よ っ て作成 さ れた パ イ プ に
書き込み ま す。 こ の例では、 パ イ プは 4 対 1 のデマルチプ レ ク サで
あ り 、 ま っ た く 異な る 動作 を 実行す る 複数の パ イ プ の種類が含ま れて
い ま す。
instead of トリガ演算子
instead-of ト リ ガ機能に関連づけ ら れた演算子は、 2 つ あ り ま す。
instead of ト リ ガお よ び CURSOR SCAN です。 instead-of ト リ ガ機能は、
Adaptive Server バー ジ ョ ン 15.0.2 か ら 使用で き ま す。 instead-of ト リ ガ
機能では、 疑似テーブルが使用 さ れ ま す。 ビ ュ ー に対す る inserts、
deletes、 updates の各 コ マ ン ド の意味が あ い ま い に な る よ う な状況で、
こ の テーブル を 使用す る と 、 各 コ マ ン ド に関 し て特定の ア ク シ ョ ン を
適用で き ま す。
118
Adaptive Server Enterprise
第2章
showplan の使用
instead of トリガ演算子
instead of ト リ ガ演算子が表示 さ れ る の は、 instead-of trigger が作成 さ れ
た ビ ュ ー に対す る insert、 update、 ま た は delete 文の ク エ リ ・ プ ラ ン の
みです。 そ の機能は、 ト リ ガで使用 さ れ る 挿入 さ れ る 疑似テーブル と
削除 さ れ る 疑似テーブル を 作成 し て、 そ の テーブル に入力す る こ と で
す。 こ れは、 元の insert、 update、 ま た は delete ク エ リ に よ っ て修正 さ
れた可能性が あ る ロ ー を 検査す る た め です。 instead of ト リ ガ演算子 を
含む ク エ リ ・ プ ラ ン の唯一の目的は、 挿入 さ れ る テーブル と 削除 さ れ
る テーブル に入力す る こ と です。 元の SQL 文の実際の操作は、 文中
で言及 さ れた ビ ュ ー に対 し ては決 し て実行 さ れ ま せん。 む し ろ 、 挿入
さ れ る 疑似テーブル と 削除 さ れ る 疑似テーブルで得 ら れ る デー タ に基
づ い て、 ビ ュ ー の基本 と な る テーブル を 更新す る の は、 ト リ ガの責任
です。
次に、 instead of ト リ ガ演算子の showplan 出力の例 を 示 し ま す。
create table t12 (c0 int primary key, c1 int null, c2 int null)
go
. . .
create view t12view as select c1,c2 from t12
go
create trigger v12updtrg on t12view
instead of update as
select * from deleted
go
update t12view set c1 = 3
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
STEP 1
ク エ リ の タ イ プは SELECT です。
2 operator(s) under root
|ROOT:EMIT Operator (VA = 1)
|
| |INSTEAD-OF TRIGGER Operator
| | 内部記憶領域 と し て Worktable1 を使用 し て い ま す。
| | 内部記憶領域 と し て Worktable2 を使用 し て い ま す。
| |
| | |SCAN Operator (VA = 0)
| | | FROM TABLE
| | | t12
| | | テーブル ・ ス キ ャ ン です。
| | | 前方ス キ ャ ン
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
119
instead of トリガ演算子
|
|
|
|
|
|
| テーブルの最初に位置付け ま す。
| デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
| デー タ ・ ペー ジ に対す る LRU で の バ ッ フ ァ 置換方式
こ の例では、 v12updtrig instead-of ト リ ガが、 t12view に関 し て設定 さ れ
て い ま す。 t12view を 更新す る と 、 instead of ト リ ガ演算子が作成 さ れ ま
す。 instead of ト リ ガ演算子は、 ワ ー ク ・ テーブル を 2 つ作成 し ま す。
Worktable1 お よ び Worktable2 はそれぞれ、 挿入 さ れ る ロ ー お よ び削除
さ れ る ロ ー を 保持す る た め に使用 さ れ ま す。 こ れ ら の ワ ー ク ・ テーブ
ルは、 複数の文に ま たが っ て存続す る と い う 点で独特です。 ト リ ガ を
実行す る と 、 次の showplan 行が出力 さ れ ま す。
文 1 (3 行目 ) の ク エ リ ・ プ ラ ン。
STEP 1
ク エ リ の タ イ プは SELECT です。
1 operator(s) under root
|ROOT:EMIT Operator (VA = 1)
|
| |SCAN Operator (VA = 0)
| | FROM CACHE
前に示 し た showplan 文の出力は、 ト リ ガの文で あ る select * from deleted
の場合です。 ビ ュ ー か ら 削除 さ れ る ロ ーが、 初回更新文の実行時に、
「削除 さ れ る 」 キ ャ ッ シ ュ に挿入 さ れ ま す。 次に、 ト リ ガはテーブル
を ス キ ャ ン し て、 t12view ビ ュ ー か ら 削除 さ れた可能性の あ る ロ ー を 報
告 し ま す。
CURSOR SCAN 演算子
CURSOR SCAN 演算子が表示 さ れ る の は、 instead-of trigger が作成 さ れた
ビ ュ ー に対す る 、 配置 さ れた delete ま た は update ( つ ま り 、 delete viewname where current of cursor_name) 文の みです。 こ の演算子は、 そ の よ う
な も の と し て、 instead of ト リ ガ演算子の子演算子 と し て の み表示 さ れ
ま す。 配置 さ れた delete ま た は update は、 カ ー ソ ルが現在あ る ロ ー に
の み ア ク セ ス し ま す。 CURSOR SCAN 演算子は、 fetch cursor 文に対す る
ク エ リ ・ プ ラ ン の EMIT 演算子か ら カ ー ソ ル の現在の ロ ー を 直接読み
込み ま す。 こ れ ら の値は、 instead of ト リ ガ演算子に渡 さ れ、 挿入 さ れ
る 疑似テーブル ま た は削除 さ れ る 疑似テーブル に挿入 さ れ ま す ( こ の
例では、 前の例 と 同 じ テーブル を 使用 し て い ま す )。
120
Adaptive Server Enterprise
第2章
showplan の使用
declare curs1 cursor for select * from t12view
go
open curs1
go
fetch curs1
c1
c2
_________ ________
1
2
(1 row affected)
set showplan on
go
update t12view set c1 = 3
where current of curs1
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
STEP 1
ク エ リ の タ イ プは SELECT です。
2 operator(s) under root
|ROOT:EMIT Operator (VA = 2)
|
| |INSTEAD-OF TRIGGER Operator
| | 内部記憶領域 と し て Worktable1
| | 内部記憶領域 と し て Worktable2
| |
| | |CURSOR SCAN Operator (VA
| | | FROM EMIT OPERATOR
(VA = 1)
を使用 し て い ま す。
を使用 し て い ま す。
= 0)
こ の例で示 し た showplan 出力は、 前の instead of ト リ ガ演算子の例に
お け る 出力 と 基本的に は同 じ です。 ただ し 、 1 点の み相違が あ り ま
す。 CURSOR SCAN 演算子は、 ビ ュ ー の基本 と な る テーブル の ス キ ャ ン
では な く 、 instead of ト リ ガ演算子の子 と し て表示 さ れ ま す。
CURSOR SCAN は、 カ ー ソ ル ・ フ ェ ッ チ の結果に ア ク セ ス す る こ と に
よ っ て、 疑似テーブル に挿入 さ れ る 値 を 取得 し ま す。 こ れは、 FROM
EMIT OPERATOR メ ッ セ ー ジ に よ っ て伝え ら れ ま す。
文 1 (3 行目 ) の ク エ リ ・ プ ラ ン。
STEP 1
ク エ リ の タ イ プは SELECT です。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
121
instead of トリガ演算子
1 operator(s) under root
|ROOT:EMIT Operator (VA = 1)
|
| |SCAN Operator (VA = 0)
| | FROM CACHE
前の showplan 文は、 ト リ ガの文の場合です。 instead of ト リ ガの例の出
力 と 同 じ です。
deferred_index メッセージと deferred_varcol メッセージ
The update mode is deferred_varcol.
The update mode is deferred_index.
こ れ ら の showplan メ ッ セー ジ は、 Adaptive Server が、 update コ マ ン ド を
イ ンデ ッ ク ス の遅延更新 と し て処理す る 場合が あ る こ と を 示 し ま す。
Adaptive Server は、 1 つ ま た は複数の可変長カ ラ ム を 更新す る と き に
deferred_varcol モ ー ド を 使い ま す。 こ の更新は、 実行時だけ に利
用可能な情報に基づ い て、 遅延モ ー ド か直接モ ー ド で実行 さ れ ま す。
Adaptive Server は、 イ ン デ ッ ク ス がユニー ク で あ る 場合、 ま た は イ ン
デ ッ ク ス が更新の一部 と し て変更 さ れ る 場合に、 deferred_index
モ ー ド を 使い ま す。 こ の モ ー ド では、 Adaptive Server は イ ン デ ッ ク ス ・
エ ン ト リ の削除は直接モ ー ド で行い ま すが、 挿入は遅延モ ー ド で行い
ま す。
122
Adaptive Server Enterprise
第
3
章
クエリ最適化方式と見積もりの表示
こ の章では、 set コ マ ン ド の ク エ リ 最適化オプ シ ョ ン に よ っ て出
力 さ れ る メ ッ セ ー ジ に つ い て説明 し ま す。
トピック
テキ ス ト 形式 メ ッ セー ジ用の set コ マ ン ド
XML 形式 メ ッ セ ー ジ用の set コ マ ン ド
使用シ ナ リ オ
set コ マ ン ド の パー ミ ッ シ ョ ン
ページ
123
124
129
132
テキスト形式メッセージ用の set コマンド
診断出力は、 ク エ リ ・ オプテ ィ マ イ ザ ま た は ク エ リ 実行 レ イ ヤで
生成で き ま す。 診断出力 を テキ ス ト 形式で生成す る に は、 次の オ
プ シ ョ ン を 使用 し ま す。
set option
{ {show | show_lop | show_managers | show_log_props |
show_parallel | show_histograms | show_abstract_plan |
show_search_engine | show_counters | show_best_plan |
show_code_gen | show_pio_costing | show_lio_costing |
show_pll_costing | show_elimination | show_missing_stats}
{normal | brief | long | on | off} }...
注意 各オプ シ ョ ン の後に は、 normal、 brief、 long、 on、 ま た は
off を 指定す る 必要が あ り ま す。 on と normal は同等です。 各
show オプ シ ョ ン に は normal、brief な ど の選択肢の いずれか を 含
め る 必要が あ り ま す。 1 つ の セ ッ ト の オプ シ ョ ン ・ コ マ ン ド で複
数の オプ シ ョ ン を 指定す る に は、 各オプ シ ョ ン ま た は選択肢の ペ
ア を カ ン マ で区切 り ま す。
set オプ シ ョ ン の使用例に つ い ては、 「使用シ ナ リ オ」 (129 ペ ー ジ )
を 参照 し て く だ さ い。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
123
XML 形式メッセージ用の set コマンド
表 3-1: テキスト形式メッセージ用のオプティマイザの set コマンド
オプション
show
show_lop
show_managers
show_log_props
show_parallel
show_histograms
show_abstract_plan
show_search_engine
show_counters
show_best_plan
show_code_gen
show_pio_costing
show_lio_costing
show_pll_costing
show_elimination
show_missing_stats
定義
適切な詳細の コ レ ク シ ョ ン を示 し ま す。 コ レ ク シ ョ ン は、
{normal | brief | long | on | off} の選択に よ り 異な り ま す。
使用 さ れ る 論理演算子を示 し ま す。
最適化中に使用 さ れ る デー タ構造マ ネ ー ジ ャ を示 し ま す。
評価 さ れ る 論理プ ロ パテ ィ を示 し ま す。
並列 ク エ リ 最適化の詳細を示 し ま す。
SARG /ジ ョ イ ン ・ カ ラ ム に関連づけ ら れて い る ヒ ス ト グ ラ ム の処理を
示 し ま す。
抽象プ ラ ン の詳細を示 し ま す。
ジ ョ イ ン順序決定ア ルゴ リ ズ ム の詳細を示 し ま す。
最適化カ ウ ン タ を示 し ま す。
オプテ ィ マ イ ザに よ っ て選択 さ れ る 最適な ク エ リ ・ プ ラ ン の詳細を示
し ま す。
コ ー ド 生成の詳細 を示 し ま す。
物理的な入出力 ( デ ィ ス ク か ら の読み込み と デ ィ ス ク へ の書き込み )
の見積 も り を示 し ま す。
論理的な入出力 ( メ モ リ か ら の読み込み と メ モ リ へ の書き込み ) の見積
も り を示 し ま す。
並列実行の コ ス ト に関す る 見積 も り を示 し ま す。
パーテ ィ シ ョ ン排除を示 し ま す。
SARG /ジ ョ イ ン ・ カ ラ ム に欠け て い る 有益な統計の詳細を示 し ま す。
XML 形式メッセージ用の set コマンド
診断は XML ド キ ュ メ ン ト と し て再生成で き ま す。 それ に よ っ て、
フ ロ ン ト エ ン ド ・ ツ ールは ド キ ュ メ ン ト を 簡単に解釈で き る よ う に な
り ま す。 XML オプ シ ョ ン が有効に な っ て い る 場合は、 Adaptive Server
内の ネ イ テ ィ ブ の XPath ク エ リ ・ プ ロ セ ッ サ を 使用 し て こ の出力に対
す る ク エ リ を 実行で き ま す。
診断出力は、 ク エ リ ・ オプテ ィ マ イ ザま た は ク エ リ 実行 レ イ ヤで生成
で き ま す。 診断出力用の XML ド キ ュ メ ン ト を 生成す る に は、 次の set
plan コ マ ン ド を 使用 し ま す。
set plan for
{show_exec_xml, show_opt_xml, show_execio_xml,
show_lop_xml, show_managers_xml, show_log_props_xml,
show_parallel_xml, show_histograms_xml, show_final_plan_xml,
124
Adaptive Server Enterprise
第3章
クエリ最適化方式と見積もりの表示
show_abstract_plan_xml, show_search_engine_xml,
show_counters_xml, show_best_plan_xml, show_pio_costing_xml,
show_lio_costing_xml, show_elimination_xml}
to {client | message} on
オプション
show_exec_xml
show_opt_xml
show_execio_xml
show_lop_xml
show_managers_xml
show_log_props_xml
show_parallel_xml
show_histograms_xml
show_final_plan_xml
show_abstract_plan_xml
show_search_engine_xml
show_counters_xml
show_best_plan_xml
show_pio_costing_xml
show_lio_costing_xml
show_elimination_xml
client
message
定義
各 ク エ リ ・ プ ラ ン演算子を示 し た コ ン パ イ ル済み の プ ラ ン出力を XML 形式
で取得 し ま す。
論理演算子、 マ ネ ー ジ ャ か ら の出力、 検索エ ン ジ ン の診断、 最適な ク エ リ ・
プ ラ ン な ど の各 コ ン ポー ネ ン ト を示すオプテ ィ マ イ ザ診断出力を取得 し
ま す。
推定 I/O と 実際の I/O を含むプ ラ ン出力を取得 し ま す。 ク エ リ ・ テキ ス ト も
含ま れ ま す。
出力論理演算子ツ リ ー を XML 形式で取得 し ま す。
ク エ リ ・ オプテ ィ マ イ ザの準備 フ ェ ーズ中の各 コ ン ポー ネ ン ト ・ マ ネ ー
ジ ャ の出力 を示 し ま す。
任意の同等ク ラ ス の論理プ ロ パテ ィ ( ク エ リ 内の関係の 1 つ以上のグループ )
を示 し ま す。
並列 ク エ リ ・ プ ラ ン の生成中に オプテ ィ マ イ ザに関連す る 診断を示 し ま す。
ヒ ス ト グ ラ ム お よ び ヒ ス ト グ ラ ム の マ ー ジ に関連す る 診断を示 し ま す。
プ ラ ン出力 を取得 し ま す。 推定 I/O と 実際の I/O は含ま れ ま せん。 ク エ リ ・
テキ ス ト は含ま れ ま す。
生成 さ れた抽象プ ラ ン を示 し ま す。
検索エ ン ジ ン に関連す る 診断を示 し ま す。
プ ラ ン ・ オブ ジ ェ ク ト 作成/破棄カ ウ ン タ を示 し ま す。
ベ ス ト ・ プ ラ ン を XML 形式で示 し ま す。
実際の物理入出力 コ ス ト 計算を XML 形式で示 し ま す。
実際の論理入出力 コ ス ト 計算を XML 形式で示 し ま す。
パーテ ィ シ ョ ン排除 を XML 形式で示 し ま す。
指定 し た場合、 出力は ク ラ イ ア ン ト に送信 さ れ ま す。 デ フ ォ ル ト では、 出力
はエ ラ ー ・ ロ グ に送信 さ れ ま す。 ただ し ト レ ー ス ・ フ ラ グ 3604 が ア ク テ ィ
ブな場合、 出力は ク ラ イ ア ン ト 接続に送信 さ れ ま す。
指定 し た場合、 出力は内部 メ ッ セ ー ジ ・ バ ッ フ ァ に送信 さ れ ま す。
オプ シ ョ ン を オ フ に設定す る に は、 次の コ マ ン ド を 指定 し ま す。
set plan for
{show_exec_xml, show_opt_xml, show_execio_xml, show_lop_xml,
show_managers_xml, show_log_props_xml, show_parallel_xml,
show_histograms_xml,show_final_plan_xml
show_abstract_plan_xml, show_search_engine_xml,
show_counters_xml, show_best_plan_xml, show_pio_costing_xml,
show_lio_costing_xml, show_elimination_xml} off
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
125
XML 形式メッセージ用の set コマンド
オプ シ ョ ン を オ フ に す る と き に、 送信先ス ト リ ー ム を 指定す る 必要は
あ り ま せん。
message が指定 さ れて い る 場合、 ク ラ イ ア ン ト ・ ア プ リ ケ ー シ ョ ン は
showplan_in_xml(query_num) と い う 組み込み関数 を 使用 し てバ ッ フ ァ か
ら 診断 を 取得す る 必要が あ り ま す。
query_num は、 バ ッ フ ァ ・ キ ャ ッ シ ュ に格納 さ れ る ク エ リ の数 を 示 し
ま す。 現在、 バ ッ フ ァ ・ キ ャ ッ シ ュ に格納で き る ク エ リ の最大数は 20
個です。 キ ャ ッ シ ュ は ク エ リ の数が 20 個に達す る と 、 ク エ リ ・ プ ラ ン
の収集 を 停止 し 、 後続の ク エ リ ・ プ ラ ン を 無視 し ま す。 ただ し 、 メ ッ
セ ー ジ ・ バ ッ フ ァ では ク エ リ ・ プ ラ ン は収集 さ れ続け ま す。 ク エ リ が
20 個 を 超え た後は、 0 の値 を 使用す る こ と で メ ッ セ ー ジ ・ バ ッ フ ァ 全
体の み を 表示で き ま す。
query_num の有効な値は 1 ~ 20、 -1、 0 ( ゼ ロ ) です。 -1 の値はキ ャ ッ
シ ュ 内の最後の XML ド キ ュ メ ン ト を 示 し 、 0 の値は メ ッ セ ー ジ ・
バ ッ フ ァ 全体 を 示 し ま す。
メ ッ セー ジ ・ バ ッ フ ァ はオーバ フ ロ ーす る 場合が あ り ま す。 オ ーバー
フ ロ ーが発生す る と 、 XML ド キ ュ メ ン ト の すべて の ロ グ を 取 る こ と
がで き な く な り 、 部分的な XML ド キ ュ メ ン ト ま た は無効な XML ド
キ ュ メ ン ト が生成 さ れ る 場合が あ り ま す。
showplan_in_xml を 使用 し て メ ッ セ ー ジ ・ バ ッ フ ァ に ア ク セ ス し た場
合、 バ ッ フ ァ は実行後に空に な り ま す。
set textsize を 使用す る と 、 最大テキ ス ト ・ サ イ ズ を 設定で き ま す。
カ ラ ム の サ イ ズが十分で な い場合、 XML ド キ ュ メ ン ト はテキ ス ト ・
カ ラ ム と し て出力 さ れ、 ド キ ュ メ ン ト が ト ラ ン ケ ー ト さ れ ま す。 た と
えば、 次の コ マ ン ド を 使用 し てテキ ス ト ・ サ イ ズ を 100000 に設定で
き ま す。
set textsize 100000
off を 使用 し て set plan を 発行す る と 、 ト レ ー ス ・ オプ シ ョ ン がすべて
オ フ に な っ て い る 場合、 すべて の XML ト レ ー ス がオ フ に な り ま す。
それ以外の場合は、 指定 さ れて い る オプ シ ョ ン の みがオ フ に な り ま
す。 以前オ ン に し た他の オプ シ ョ ン は有効で、 ト レ ー ス は指定 さ れて
い る 送信先ス ト リ ー ム で続行 さ れ ま す。 別の set plan オプ シ ョ ン を 発行
す る と 、 以前の オプ シ ョ ン は現在の オプ シ ョ ン と 結合 さ れ ま すが、 送
信先ス ト リ ー ム は新 し い ス ト リ ー ム に無条件で切 り 替わ り ま す。
126
Adaptive Server Enterprise
第3章
クエリ最適化方式と見積もりの表示
show_execio_xml を使用したクエリ・プランの診断
show_execio_xml に は、 問題の あ る ク エ リ の調査に役立つ診断情報が含
ま れ ま す。 show_execio_xml の情報は次の と お り です。
•
ク エ リ ・ プ ラ ン の バー ジ ョ ン ・ レ ベル。 プ ラ ン の各バー ジ ョ ン は
一意に識別 さ れ ま す。 こ れはプ ラ ン の最初の バー ジ ョ ン です。
<planVersion>1.0</planVersion>
•
バ ッ チ ま た は ス ト ア ド ・ プ ロ シ ー ジ ャ の文の番号 と 、 元の テキ ス
ト 内の文の行番号。 こ れは ク エ リ では文の番号は 2 ですが、 行番
号は 6 です。
<statementNum>2</statementNum>
<lineNum>6</lineNum>
•
ク エ リ の抽象プ ラ ン。 た と えば、 こ れは ク エ リ select * from titles
の抽象プ ラ ン です。
<abstractPlan>
<![CDATA[>
( i_scan titleidind titles ) ( prop titles ( parallel 1
) ( prefetch 8 ) ( lru ) )
]]>
</abstractPlan>
•
論理 I/O、 物理 I/O、 CPU コ ス ト :
<costs>
<lio> 2 </lio>
<pio> 2 </pio>
<cpu> 18 </cpu>
</costs>
合計 コ ス ト は次の式 を 使用 し て見積 も る こ と がで き ま す (25、 2、
0.1 は定数です )。
25 × pio + 2 × lio + 0.1 × cpu
•
ク エ リ ・ プ ラ ン が使用す る ス レ ッ ド と 補助ス キ ャ ン記述子の数 を
含む、 実行 リ ソ ー ス使用量の見積 も り 。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
127
XML 形式メッセージ用の set コマンド
•
ク エ リ ・ エ ン ジ ン が表示 し たプ ラ ン の数、 ク エ リ ・ エ ン ジ ン に
よ っ て有効で あ る こ と が確認 さ れたプ ラ ン、 ク エ リ ・ エ ン ジ ン で
処理に要 し た ク エ リ の合計時間 ( ミ リ 秒 )、 ク エ リ ・ エ ン ジ ン が最
初の有効なプ ラ ン を 判断す る ま で に要 し た時間、 最適化プ ロ セ ス
中に使用 さ れた プ ロ シ ー ジ ャ ・ キ ャ ッ シ ュ の量。
<optimizerMetrics>
<optTimeMs>6</optTimeMs>
<optTimeToFirstPlanMs>3</optTimeToFirstPlanMs>
<plansEvaluated>1</plansEvaluated>
<plansValid>1</plansValid>
<procCacheBytes>140231</procCacheBytes>
</optimizerMetrics>
•
現在の テーブルで前回 update statistics が実行 さ れた時間 と 、 任意
の カ ラ ム に対 し 、 統計 を 利用で き れば改善で き た可能性の あ る
見積 も り 定数が ク エ リ ・ エ ン ジ ン に よ っ て使用 さ れた か ど う か。
こ の セ ク シ ョ ン に は、 統計の な い カ ラ ム に関す る 情報が含 ま れ
ま す。
<optimizerStatistics>
<statInfo>
<objName>titles</objName>
<columnStats>
<column>title_id</column>
<updateTime>Oct 5 2006 4:40:14:730PM</updateTime>
</columnStats>
<columnStats>
<column>title</column>
<updateTime>Oct 5 2006 4:40:14:730PM</updateTime>
</columnStats>
</statInfo>
</optimizerStatistics>
•
キ ャ ッ シ ュ 方式 と I/O サ イ ズ (insert、 update、 delete は タ ーゲ ッ ト ・
テーブル と 同 じ 情報 を 持 っ て い ま す ) に関す る 情報 を 持つ、 テー
ブル ・ ス キ ャ ン と イ ン デ ッ ク ス ・ ス キ ャ ン を 含む演算子ツ リ ー。
演算子ツ リ ー に は、 update が 「直接」 モ ー ド ま た は 「遅延」 モ ー
ド の ど ち ら で実行 さ れ る か も 示 さ れ ま す。 exchange 演算子は、 ク
エ リ が使用 し た プ ロ デ ュ ーサ ・ プ ロ セ ス と コ ン シ ュ ー マ ・ プ ロ セ
ス の数に関す る 情報 を 含み ま す。
<TableScan>
<VA>0</VA>
<est>
<rowCnt>18</rowCnt>
<lio> 2 </lio>
128
Adaptive Server Enterprise
第3章
クエリ最適化方式と見積もりの表示
<pio> 2 </pio>
<rowSz>218.5555</rowSz>
</est>
<varNo>0</varNo>
<objName>titles</objName>
<scanType>TableScan</scanType>
<partitionInfo>
<partitionCount>1</partitionCount>
</partitionInfo>
<scanOrder> ForwardScan </scanOrder>
<positioning> StartOfTable </positioning>
<dataIOSizeInKB>8</dataIOSizeInKB>
<dataBufReplStrategy> LRU </dataBufReplStrategy>
</TableScan>
使用シナリオ
次の例では、 dbcc traceon(3604) が設定 さ れて い る 場合、 ト レ ー ス情報
が ク ラ イ ア ン ト の接続に送信 さ れ ま す。 dbcc traceon(3605) が設定 さ れ
て い る 場合、 ト レ ー ス情報はエ ラ ー ・ ロ グ に送信 さ れ ま す。 Adaptive
Server バー ジ ョ ン 15.0.2 以降では、 set switch on を 使用で き ま す。 次に
例 を 示 し ま す。
set switch on 3604
set switch on 3605
Adaptive Server 15.0 よ り 前の バー ジ ョ ン の最適化 ト レ ー ス ・ オプ シ ョ
ン (dbcc traceon/off(302,310,317)) はサポー ト さ れな く な り ま し た。
通常はエ ラ ー ・ ロ グ に送 ら れ る ト レ ー ス出力 を ク ラ イ ア ン ト ・ プ ロ セ
ス に送信す る に は、 dbcc traceon(3604) ま た は set switch on
print_output_to_client を 使用 し ま す。 出力 を エ ラ ー ・ ロ グ と ク ラ イ ア ン
ト ・ プ ロ セ ス の両方に送信す る に は、 dbcc traceon(3605) ま た は set
switch on print_output_to_errorlog を 使用 し ま す。
シナリオ A
実行プ ラ ン の XML を ト レ ー ス出力 と し て ク ラ イ ア ン ト に送信す る に
は、 次の コ マ ン ド を 使用 し ま す。
set plan for show_exec_xml to client on
次に、 プ ラ ン を 必要 と す る ク エ リ を 実行 し ま す。
select id from sysindexes where id < 0
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
129
使用シナリオ
シナリオ B
実行プ ラ ン を 取得す る に は、 showplan_in_xml 関数 を 使用 し ま す。 出力
は前回の ク エ リ か ら 取得す る か、 バ ッ チ ま た は ス ト ア ド ・ プ ロ シ ー
ジ ャ 内の最初の 20 個の ク エ リ の いずれか か ら 取得で き ま す。
set plan for show_opt_xml to
message on
ク エ リ を 次の よ う に実行 し ま す。
select id from sysindexes where id < 0
select name from sysobjects where id > 0
go
select showplan_in_xml(0)
go
こ の例では、 2 つ の XML ド キ ュ メ ン ト がテキ ス ト ・ ス ト リ ー ム と し
て生成 さ れ ま す。 XPath ク エ リ は、 XML オプ シ ョ ン が Adaptive Server
で有効に な っ て い る かぎ り 、 こ の組み込み関数上で実行で き ま す。
select xmlextract("/", showplan_in_xml(-1))
go
こ れ に よ り 、 前回の ク エ リ に よ っ て作成 さ れた XML ド キ ュ メ ン ト に
対 し て XPath ク エ リ “/” を 実行で き る よ う に な り ま す。
シナリオ C
複数の オプ シ ョ ン を 設定す る に は、 次の コ マ ン ド を 実行 し ま す。
set plan for show_exec_xml, show_opt_xml to client on
go
select name from sysobjects where id > 0
go
こ れは、 通常の ト レ ー ス と 同様に、 オプテ ィ マ イ ザ と ク エ リ 実行エ ン
ジ ン の出力結果が ク ラ イ ア ン ト に送信 さ れ る よ う に設定 し ま す。
set plan for show_exec_xml off
go
select name from sysobjects where id > 0
go
show_opt_xml はオ ン の ま ま に な っ て い る た め、 オプテ ィ マ イ ザの診断
は利用で き ま す。
シナリオ D
バ ッ チ内の ク エ リ の セ ッ ト を 実行 し て い る 場合は、 オプテ ィ マ イ ザ ・
プ ラ ン に前回の ク エ リ を 要求で き ま す。
set plan for show_opt_xml to
go
declare @v int
select @v = 1
130
message on
Adaptive Server Enterprise
第3章
クエリ最適化方式と見積もりの表示
select name from sysobjects where id = @v
go
select showplan_in_xml(-1)
go
showplan_in_xml() は同 じ バ ッ チ の一部に す る こ と も で き ま す。 こ れは
同 じ よ う に機能す る た め です。 showplan_in_xml() 関数に対す る メ ッ セ ー
ジ の ロ ギ ン グは無視 さ れ ま す。
ス ト ア ド ・ プ ロ シ ー ジ ャ を 作成す る に は、 次の コ マ ン ド を 使用 し
ま す。
create proc PP as
declare @v int
select @v = 1
select name from sysobjects where id = @v
go
exec PP
go
select showplan_in_xml(-1)
go
ス ト ア ド ・ プ ロ シ ー ジ ャ が別の ス ト ア ド ・ プ ロ シ ー ジ ャ を 呼び出 し 、
呼び出 さ れた ス ト ア ド ・ プ ロ シ ー ジ ャ が コ ン パ イ ル を 行い、 オプテ ィ
マ イ ザ診断がオ ン に な っ て い る 場合は、 新 し い文の セ ッ ト の オプテ ィ
マ イ ザ診断 も 出力 さ れ ま す。 show_execio_xml がオ ン に な っ て い て、 呼
び出 さ れた ス ト ア ド ・ プ ロ シ ー ジ ャ が実行 さ れた場合 も 同様です。
シナリオ E
XML ド キ ュ メ ン ト の ク エ リ 実行プ ラ ン に対 し て showplan_in_xml() 関数
の出力の ク エ リ を 実行す る に は、 次の コ マ ン ド を 実行 し ま す。
set plan for show_exec_xml to message on
go
select name from sysobjects
go
select case when
'/Emit/Scan[@Label=“Scan:myobjectss”]' xmltest
showplan_in_xml(-1)
then “PASSED” else "FAILED" end
go
set plan for show_exec_xml off
go
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
131
set コマンドのパーミッション
シナリオ F
show_final_plan_xml を 使用 し て、 Adaptive Server が ク エ リ ・ プ ラ ン を
XML 出力 と し て表示す る よ う に構成 し ま す。 こ の出力に は実際の LIO
コ ス ト 、 PIO コ ス ト 、 ま た は ロ ー ・ カ ウ ン ト は含ま れ ま せん。
show_final_plan_xml が有効に な っ て い る 場合は、 前回実行 し た ク エ リ
(-1 の ク エ リ ID を 持つ ) か ら ク エ リ ・ プ ラ ン を 選択で き ま す。
show_final_plan_xml を 有効に す る に は、 次の コ マ ン ド を 実行 し ま す。
set plan for show_final_plan_xml to message on
ク エ リ を た と えば次の よ う に実行 し ま す。
use pubs2
go
select * from titles
go
showplan_in_xml パ ラ メ ー タ を 使用 し て、 前回実行 し た ク エ リ
の ク エ リ ・ プ ラ ン を 選択 し ま す。
select showplan_in_xml(-1)
set コマンドのパーミッション
sa_role は前述の set コ マ ン ド に対 し て完全な ア ク セ ス権 を 持 っ て い
ま す。
他の ユーザに対 し ては、 シ ス テ ム管理者は set tracing パー ミ ッ シ ョ ン
を付与ま た は取 り 消 し て、 XML に対す る set option と set plan、 お よ び
dbcc traceon/off (3604、 3605) を 許可す る 必要が あ り ま す。
詳細は、 『Adaptive Server リ フ ァ レ ン ス ・ マ ニ ュ ア ル : コ マ ン ド 』 の
grant コ マ ン ド の説明 を 参照 し て く だ さ い。
132
Adaptive Server Enterprise
第
4
章
長時間実行されているクエリの検出
トピック
ト レ ー ス ・ フ ァ イ ルへ の診断の保存
SQL テキ ス ト の表示
セ ッ シ ョ ン設定の保持
ページ
133
138
141
Adaptive Server に は、 showplan ま た は他の検査用パ ラ メ ー タ を 事
前に有効に し て い な く て も 、 適切に実行 さ れて い な い ク エ リ に関
す る 診断情報 を 収集で き る set show_sqltext、 set tracefile、 お よ び set
export_options パ ラ メ ー タ を 用意 し て い ま す。
トレース・ファイルへの診断の保存
有効に な っ た set tracefile は、 現在の セ ッ シ ョ ン の SQL テキ ス ト す
べて を 指定の フ ァ イ ル に保存 し ま す。 各 SQL テキ ス ト の バ ッ チ
は、 以前の バ ッ チ に追加 さ れ ま す。
ト レ ー ス を 有効に す る 構文は次の と お り です。
set tracefile file_name [off] [for spid
ト レ ー ス を 無効に す る 構文は次の と お り です。
set tracefile off [for spid]
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
133
トレース・ファイルへの診断の保存
各パ ラ メ ー タ の意味は、 次の と お り です。
•
file_name – SQL テキ ス ト を 保存す る フ ァ イ ルへ の フ ル ・ パ ス。
デ ィ レ ク ト リ ・ パ ス を 指定 し な い場合は、 $SYBASE 内に フ ァ イ ル
が作成 さ れ る 。
注意 file_name に英数字以外の特殊文字 ( “:”、 “/” な ど ) が含ま れ
て い る 場合は、 file_name を 引用符で囲ん で く だ さ い。 た と えば、
次の file_name は、 デ ィ レ ク ト リ 構造の “/” の た め に引用符で囲
む必要が あ り ま す。
set tracefile '/tmp/mytracefile.txt' for 25
file_name に特殊文字が含ま れて お ら ず、 フ ァ イ ル を $SYBASE
に保存す る 場合は、 引用符で囲む必要は あ り ま せん。 た と えば、
次の file_name は引用符で囲む必要は あ り ま せん。
set tracefile mytracefile.txt
例
•
off – こ の セ ッ シ ョ ン ま た は spid の ト レ ー ス を 無効に す る 。
•
spid – ト レ ー ス ・ フ ァ イ ル に保存す る SQL テキ ス ト のサーバ ・ プ
ロ セ ス ID。 sa ま た は SSO の役割 を 持つ ユーザだけが、 他の spid
の ト レ ー ス を 有効に で き ま す。 シ ス テ ム ・ タ ス ク ( ハ ウ ス キー ピ
ン グやポー ト ・ マ ネ ー ジ ャ な ど ) の SQL テキ ス ト を 保存す る こ と
はで き な い。
•
次の例では、 現在の セ ッ シ ョ ン に対 し て sql_text_file と い う 名前の
ト レ ー ス ・ フ ァ イ ル を 開き ま す。
set tracefile '/var/sybase/REL1502/text_dir/sql_text_file'
set showplan、 set statistics io、 お よ び dbcc traceon(100) か ら の以降の
出力は、 sql_text_file に保存 さ れ ま す。
•
次の例ではデ ィ レ ク ト リ ・ パ ス は指定 し な い の で、
$SYBASE/sql_text_file 内に ト レ ー ス ・ フ ァ イ ルが保存 さ れ ま す。
set tracefile 'sql_text_file' for 11
spid 11 で実行 さ れ る SQL は、 こ の ト レ ー ス ・ フ ァ イ ル に保存 さ れ
ま す。
•
次の例は、 spid 86 の SQL テキ ス ト を保存 し ま す。
set tracefile
'/var/sybase/REL1502/text_dir/sql_text_file' for 86
134
Adaptive Server Enterprise
第4章
•
長時間実行されているクエリの検出
次の例は、 set tracefile を 無効に し ま す。
set tracefile off
set tracefile に は制限が い く つ か あ り ま す。
•
シ ス テ ム ・ タ ス ク ( ハ ウ ス キー ピ ン グやポー ト ・ マ ネ ー ジ ャ な ど )
の SQL テキ ス ト を 保存す る こ と はで き な い。
•
ト レ ー ス を 有効ま た は無効に す る に は、 sa ま た は sso の役割が あ
る か、 set tracing パー ミ ッ シ ョ ン が付与 さ れて い る 必要が あ る 。
•
set tracefile を 使用 し て、 既存の フ ァ イ ル を ト レ ー ス ・ フ ァ イ ル と
し て開 く こ と はで き な い。
•
SA ま た は SSO セ ッ シ ョ ン中に、 特定の spid に対 し て set tracfile
を 有効に し た場合、 そ の後に実行 し たすべて の ト レ ー ス ・ コ マ ン
ド は、 SA ま た は SSO の spid では な く 、 こ の spid に対 し て有効に
な る。
•
ト レ ー ス ・ フ ァ イ ルへ の書き込み中に、 Adaptive Server に フ ァ イ
ルの領域がな く な っ た場合は、 フ ァ イ ルが閉 じ ら れ、 ト レ ー ス が
無効に な る 。
•
isql セ ッ シ ョ ン で spid の ト レ ー ス を 開始 し た後、 こ の ト レ ー ス を
無効に し な い ま ま isql セ ッ シ ョ ン が終了 し た場合は、 別の isql
セ ッ シ ョ ン で こ の spid の ト レ ー ス を 開始で き る 。
•
ト レ ー ス は、 こ の ト レ ー ス を 有効に し た セ ッ シ ョ ン では な く 、
ト レ ー ス が有効に な っ て い る セ ッ シ ョ ン に対 し て の み行われ る 。
•
単一の sa ま た は sso セ ッ シ ョ ン で一度に複数の セ ッ シ ョ ン を ト
レ ー ス す る こ と はで き な い。 ト レ ー ス ・ フ ァ イ ルがすで に開い て
い る セ ッ シ ョ ン に対 し て ト レ ー ス ・ フ ァ イ ル を 開 こ う と す る と 、
次の エ ラ ー ・ メ ッ セ ー ジ が表示 さ れ る 。 tracefile is already
open for this session.
•
複数の sa ま た は sso セ ッ シ ョ ン か ら 1 つ の セ ッ シ ョ ン を ト レ ー ス
す る こ と はで き な い。
•
ト レ ー ス出力 を 保存 し て い る フ ァ イ ルは、 ト レ ー ス し て い る
セ ッ シ ョ ン が終了す る か、 ト レ ー ス が無効に な っ た と き に閉 じ
ら れる。
•
ト レ ー ス用の リ ソ ー ス を 割 り 当て る 場合、 各 ト レ ー ス に は 1 つ の
エ ン ジ ン ご と に 1 つ の フ ァ イ ル記述子が必要で あ る こ と を 注意 し
てお く こ と 。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
135
トレース・ファイルへの診断の保存
トレース・ファイルに診断情報を保存するオプションの設定
set tracefile は、 診断情報 を 提供す る 他の set コ マ ン ド やオプ シ ョ ン と 併
用す る こ と で、 長時間実行 さ れて い る ク エ リ に関す る 理解 を 深め る こ
と がで き ま す。 診断情報 を フ ァ イ ル に保存す る set コ マ ン ド と オプ
シ ョ ン は次の と お り です。
•
set show_sqltext [on | off]
•
set showplan [on | off]
•
set statistics io [on | off]
•
set statistics time [on | off]
•
set statistics plancost [on | off]
set オプ シ ョ ン は次の と お り です。
136
•
set option show [normal | brief | long | on | off]
•
set option show_lop [normal | brief | long | on | off]
•
set option show_parallel [normal | brief | long | on | off]
•
set option show_search_engine [normal | brief | long | on | off]
•
set option show_counters [normal | brief | long | on | off]
•
set option show_managers [normal | brief | long | on | off]
•
set option show_histograms [normal | brief | long | on | off]
•
set option show_abstract_plan [normal | brief | long | on | off]
•
set option show_best_plan [normal | brief | long | on | off]
•
set option show_code_gen [normal | brief | long | on | off]
•
set option show_pio_costing [normal | brief | long | on | off]
•
set option show_lio_costing [normal | brief | long | on | off]
•
set option show_log_props [normal | brief | long | on | off]
•
set option show_elimination [normal | brief | long | on | off]
Adaptive Server Enterprise
第4章
長時間実行されているクエリの検出
トレースしているセッションの確認
sp_helpapptrace を 使用す る と 、 Adaptive Server が ど の セ ッ シ ョ ン を ト
レ ー ス し て い る か を 判断で き ま す。 sp_helpapptrace は、 Adaptive Server
が ト レ ー ス し て い る すべて の セ ッ シ ョ ン のサーバ ・ プ ロ セ ス ID (spid)、
spid が ト レ ー ス し て い る セ ッ シ ョ ン の spid、 ト レ ー ス ・ フ ァ イ ル の名
前 を 返 し ま す。
sp_helpapptrace の構文は次の と お り です。
sp_helpapptrace
sp_helpapptrace は次の カ ラ ム を 返 し ま す。
•
traced_spid - ユーザが ト レ ー ス し て い る セ ッ シ ョ ン の spid。
•
tracer_spid - traced_spid が ト レ ー ス し て い る セ ッ シ ョ ン の spid。
tracer_spid セ ッ シ ョ ン が終了 し て い る 場合は、 “exited” と 出力 さ
れる。
•
trace_file - ト レ ー ス ・ フ ァ イ ルの フ ル ・ パ ス。
次に例 を 示 し ま す。
sp_helpapptrace
traced_spid
tracer_spid
-------------------------11
exited
13
14
trace_file
---------/tmp/myfile1
/tpcc/sybase.15_0/myfile2
トレースの再バインド
あ る セ ッ シ ョ ン が別の セ ッ シ ョ ン を ト レ ー ス し て い る と き に、 そ の ト
レ ー ス を 無効に し な い で セ ッ シ ョ ン が終了 し た場合は、 新 し い セ ッ
シ ョ ン を 以前の ト レ ー ス と 再バ イ ン ド で き ま す。 つ ま り 、 sa ま た は
sso は開始 し た ト レ ー ス を すべて完了す る 必要がな く 、 1 つ の ト レ ー
ス ・ セ ッ シ ョ ン を 開始、 終了 し た後で、 そ の ト レ ー ス ・ セ ッ シ ョ ン に
再バ イ ン ド で き ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
137
SQL テキストの表示
SQL テキストの表示
set show_sqltext を 使用す る と 、 ア ド ホ ッ ク ・ ク エ リ 、 ス ト ア ド ・ プ ロ
シ ー ジ ャ 、 カ ー ソ ル、 動的 prepared 文の SQL テキ ス ト を 出力で き ま
す。 set showplan on な ど の コ マ ン ド で行 う よ う に、 ク エ リ を 実行 し て
SQL セ ッ シ ョ ン の診断情報 を 収集す る 前に、 set show_sqltext を 有効に
す る 必要は あ り ま せん。 そ の代わ り に、 各 コ マ ン ド の実行中に こ の コ
マ ン ド を 有効に し て、 ど の ク エ リ が適切に実行 さ れて い な い か を 判断
し 、 そ の問題 を 診断で き ま す。
show_sqltext を 有効に す る 前に dbcc traceon を 有効に し て、 次の よ う に
標準出力へ の出力 を 表示 し て く だ さ い。
dbcc traceon(3604)
set show_sqltext の構文は次の と お り です。
set show_sqltext {on | off}
た と えば、 次の例は show_sqltext を 有効に し ま す。
set show_sqltext on
set show_sqltext が有効に な る と 、 入力 し た各 コ マ ン ド や シ ス テ ム ・ プ
ロ シ ー ジ ャ に対す る すべて の SQL テキ ス ト が標準出力に出力 さ れ ま
す。 実行す る コ マ ン ド ま た は シ ス テ ム ・ プ ロ シ ー ジ ャ に応 じ て、 こ の
出力は長 く な る 場合が あ り ま す。
た と えば、 sp_who を 実行 し た場合は、 こ の シ ス テ ム ・ プ ロ シ ー ジ ャ に
関連づけ ら れて い る SQL テキ ス ト がすべて出力 さ れ ま す ( 出力は ス
ペー ス の関係で省略 さ れて い ま す )。
sp_who
2007/02/23 02:18:25.77
SQL Text: sp_who
Sproc: sp_who, Line:
Sproc: sp_who, Line:
Sproc: sp_who, Line:
Sproc: sp_who, Line:
Sproc: sp_who, Line:
Sproc: sp_who, Line:
Sproc: sp_who, Line:
Sproc: sp_who, Line:
Sproc: sp_autoformat,
Sproc: sp_autoformat,
Sproc: sp_autoformat,
Sproc: sp_autoformat,
Sproc: sp_autoformat,
. . .
138
0
20
22
25
27
30
55
64
Line:
Line:
Line:
Line:
Line:
0
165
167
177
188
Adaptive Server Enterprise
第4章
長時間実行されているクエリの検出
Sproc: sp_autoformat, Line: 326
Sproc: sp_autoformat, Line: 332
SQL Text: INSERT
#colinfo_af(colid,colname,usertype,type,typename,collength,maxlength,autoform
at,selected,selectorder,asname,mbyte) SELECT
c.colid,c.name,t.usertype,t.type,t.name,case when c.length < 80 then 80 else
c.length end,0,0,0,0,c.name,0 FROM tempdb.dbo.syscolumns c,tempdb.dbo.systypes
t WHERE c.id=1949946031 AND c.usertype=t.usertype
Sproc: sp_autoformat, Line: 333
Sproc: sp_autoformat, Line: 334
. . .
Sproc: sp_autoformat, Line: 535
Sproc: sp_autoformat, Line: 0
Sproc: sp_autoformat, Line: 393
Sproc: sp_autoformat, Line: 395
. . .
Sproc: sp_autoformat, Line: 686
Sproc: sp_autoformat, Line: 688
SQL Text: UPDATE #colinfo_af SET maxlength=(SELECT
isnull(max(isnull(char_length(convert(varchar(80),fid)),4)),1) FROM
#who1result ), autoformat = 1, mbyte=case when usertype in (24, 25, 34, 35) then
1 else 0 end WHERE colname='fid'
Sproc: sp_autoformat, Line: 689
Sproc: sp_autoformat, Line: 690
. . .
Sproc: sp_autoformat, Line: 815
Sproc: sp_autoformat, Line: 818
SQL Text: SELECT
fid=right(space(80)+isnull(convert(varchar(80),fid),'NULL'),3),
spid=right(space(80)+isnull(convert(varchar(80),spid),'NULL'),4),
status=SUBSTRING(convert(varchar(80),status),1,8),
loginame=SUBSTRING(convert(varchar(80),loginame),1,8),
origname=SUBSTRING(convert(varchar(80),origname),1,8),
hostname=SUBSTRING(convert(varchar(80),hostname),1,8),
blk_spid=right(space(80)+isnull(convert(varchar(80),blk_spid),'NULL'),8),
dbname=SUBSTRING(convert(varchar(80),dbname),1,6),
tempdbname=SUBSTRING(convert(varchar(80),tempdbname),1,10),
cmd=SUBSTRING(convert(varchar(80),cmd),1,17),
block_xloid=right(space(80)+isnull(convert(varchar(80),block_xloid),'NULL'),1
1) FROM #who1result order by fid, spid, dbname
Sproc:
Sproc:
Sproc:
sp_autoformat, Line:
sp_autoformat, Line:
sp_autoformat, Line:
819
820
826
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
139
SQL テキストの表示
Sproc: sp_who, Line: 68
Sproc: sp_who, Line: 70
fid spid status
loginame
tempdbnamecmd
block_xloid
--- ---- -------- ----------------------------0
2
sleeping NULL
DEADLOCK TUNE
0
0
3
sleeping NULL
ASTC HANDLER
0
0
4
sleeping NULL
CHECKPOINT SLEEP
0
0
5
sleeping NULL
HK WASH
0
0
6
sleeping NULL
HK GC
0
0
7
sleeping NULL
HK CHORES
0
0
8
sleeping NULL
PORT MANAGER
0
0
9
sleeping NULL
NETWORK HANDLER
0
0
10
sleeping NULL
LICENSE HEARTBEAT 0
0
1
running
sa
INSERT
0
origname
hostname
blk_spid
--------
dbname
--------
--------
-------------
NULL
NULL
0
master tempdb
NULL
NULL
0
master tempdb
NULL
NULL
0
master tempdb
NULL
NULL
0
master tempdb
NULL
NULL
0
master tempdb
NULL
NULL
0
master tempdb
NULL
NULL
0
master tempdb
NULL
NULL
0
master tempdb
NULL
NULL
0
master tempdb
sa
echo
0
master tempdb
(10 rows affected)
(return status = 0)
show_sqltext を 無効に す る に は、 次の よ う に入力 し ま す。
set show_sqltext off
show_sqltext の制限
•
show_sqltext を 実行す る に は、 sa ま た は sso の役割が必要です。
•
show_sqltext を 使用 し て ト リ ガの SQL テキ ス ト を出力す る こ と は
で き ま せん。
•
show_sqltext を 使用 し て、 バ イ ン ド 変数 ま た は表示名 を 示す こ と は
で き ま せん。
140
Adaptive Server Enterprise
第4章
長時間実行されているクエリの検出
セッション設定の保持
Adaptive Server は、 ト リ ガ ま た は シ ス テ ム ・ プ ロ シ ー ジ ャ の実行が完
了 し た後、 こ れ ら に よ っ て設定 さ れた set パ ラ メ ー タ の変更 を デ フ ォ
ル ト 動作に よ り リ セ ッ ト し ま す。 set export_options を 有効に す る と 、 シ
ス テ ム ・ プ ロ シ ー ジ ャ ま た は ト リ ガ に よ っ て設定 さ れた セ ッ シ ョ ン設
定 を そ の セ ッ シ ョ ン中保持で き ま す。 set export_options の構文は次の と
お り です。
set export_options [on | off]
た と えば、 次の例は set export_options を 有効に し ま す。
set export_options on
次の例は、 set export_options を 無効に し て Adaptive Server を デ フ ォ ル ト
動作に戻 し ま す。
set export_options off
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
141
セッション設定の保持
142
Adaptive Server Enterprise
第
5
章
並列クエリ処理
こ の章では、 並列 ク エ リ 処理に つ い て詳 し く 説明 し ま す。
トピック
垂直方向、 水平方向、 お よ びパ イ プ ラ イ ン並列処理
並列処理が役立つ ク エ リ
並列処理の有効化
セ ッ シ ョ ン ・ レ ベルで の並行処理の制御
ク エ リ の並列処理の制御
並列処理の選択的な使用
多数の パーテ ィ シ ョ ン で の並列処理の使用
並列 ク エ リ の結果が異な る 場合
並列 ク エ リ ・ プ ラ ン の理解
Adaptive Server の並列 ク エ リ 実行モデル
ページ
143
144
145
149
151
152
154
156
157
159
垂直方向、水平方向、およびパイプライン並列処理
Adaptive Server では、 ク エ リ 実行に対 し て水平お よ び垂直並列処
理 を サポー ト し て い ま す。 垂直方向の並列処理は、 CPU やデ ィ ス
ク な ど の異な る シ ス テ ム ・ リ ソ ー ス を 利用 し て、 複数の演算子 を
同時に実行す る 機能です。 水平並列処理は、 1 つ の演算子の複数
の イ ン ス タ ン ス を デー タ の指定部分で実行す る 機能です。
デー タ の分割方式は、 水平並列処理に大き く 影響 し ま す。 デー タ
の論理分割は、 大量のデー タ が処理 さ れ る 運用意思決定支援シ ス
テ ム (DSS) ク エ リ に役立 ち ま す。
Adaptive Server での分割の詳細に つ い ては、 『Transact-SQL ユー
ザーズ ・ ガ イ ド 』 の 「第 20 章 意思決定支援シ ス テム」、 お よ び
『パ フ ォ ーマ ン ス & チ ュ ーニ ン グ ・ シ リ ーズ : 物理デー タ ベー
ス ・ チ ュ ーニ ン グ』 ガ イ ド の 「パ フ ォ ー マ ン ス の た め に テーブ
ル を 分割す る 」 (13 ペー ジ ) を参照し て く だ さ い。 こ の章を理解
す る た め に は、 各種分割に つ い て理解し てお く 必要があ り ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
143
並列処理が役立つクエリ
Adaptive Server は、 パ イ プ ラ イ ン 並列処理 も サポー ト し て い ま す。 パ イ
プ ラ イ ン は、 垂直方向の並列処理の一種で、 中間結果は ク エ リ ・ ツ リ ー
内の上位の演算子 に パ イ プ処理で取 り 込 ま れ ま す。 1 つ の演算子の出
力が別の演算子の入力 と し て使用 さ れ ま す。 入力 と し て使用 さ れ る 演
算子は、 デー タ を 提供す る 演算子 と 同時に実行で き ま す。 こ れはパ イ
プ ラ イ ン 並列処理で は 不可欠 の 要素 で す。 並列処理は、 デ ィ ス ク や
CPU な ど の 複数 の リ ソ ー ス が使用可能な場合 に の み使用 し て く だ さ
い。 シ ス テ ム が並行 し て機能す る リ ソ ー ス用 に設定 さ れて い な い場合
に 並列処理 を 使用す る と 、 悪影響が も た ら さ れ る 可能性が あ り ま す。
さ ら に、 デー タ の論理分割が並列デバ イ ス上の物理分割 と 密に関連づ
け ら れ る よ う に デ ィ ス ク ・ リ ソ ー ス全体に デー タ が分散 さ れて い る 必
要が あ り ま す。 並列シ ス テ ム の最大の課題は、 並列処理の適切な細分
性 を 制御す る こ と です。 並列処理の細分性が高すぎ る と 、 通信お よ び
同期の オ ーバー ヘ ッ ド に よ り 、 並列演算に よ る 利点がオ フ セ ッ ト さ れ
る 可能性が あ り ま す。 並列処理が粗すぎ る と 、 正 し い ス ケ ー リ ン グが
行われ ま せん。
並列処理が役立つクエリ
Adaptive Server が並列 ク エ リ 処理用に設定 さ れて い る 場合、 ク エ リ ・ オ
プテ ィ マ イ ザはそれぞれ の ク エ リ を 評価 し て、 それが並列実行に適 し
て い る か ど う か を 判断 し ま す。 並列処理に適 し て お り 、 並列 ク エ リ ・ プ
ラ ン の方が逐次プ ラ ン よ り も 高速に な る と オプテ ィ マ イ ザが判断 し た
場合、 ク エ リ はプ ラ ン ・ フ ラ グ メ ン ト に分割 さ れ、 同時に処理 さ れ ま
す。 結果は結合 し て か ら ク ラ イ ア ン ト に渡 さ れ、 そ の ク エ リ を 1 つ の
フ ラ グ メ ン ト と し て逐次処理 し た場合よ り も 短時間で完了 し ま す。
並列 ク エ リ 処理は、 以下の パ フ ォ ー マ ン ス が向上 し ま す。
•
グループ化 さ れた集約処理ま た はグループ化 さ れて い な い集約処
理の場合の、 テーブル ・ ス キ ャ ン ま た は ク ラ ス タ ー ド ・ イ ン デ ッ
ク ス ・ ス キ ャ ン の よ う に、 多 く の ペー ジ を ス キ ャ ン す る が、 比較
的少な い ロ ー を 返す select 文。
•
多数の ペー ジ を ス キ ャ ン す る が、 where 句に よ っ て ロ ー の ご く 一
部だけ を 返すテーブル ・ ス キ ャ ン ま た は ク ラ ス タ ー ド ・ イ ン デ ッ
ク ス ・ ス キ ャ ン。
•
union、 order by、 ま た は distinct が含ま れ る select 文。 こ れ ら の ク エ
リ 演算の場合、 並列 ソ ー ト ま た は並列ハ ッ シ ュ を 利用で き る 。
144
Adaptive Server Enterprise
第5章
•
並列クエリ処理
オプテ ィ マ イ ザに よ っ て再 フ ォ ー マ ッ ト 方式が選択 さ れ る 場合の
select 文。 こ れ ら は、 ワ ー ク ・ テーブル を 並列で移植で き、 並列
ソ ー ト を 利用で き る 。
•
ジ ョ イン ・ クエ リ。
ソ ー ト さ れて い な い大き な結果セ ッ ト を 返す コ マ ン ド の場合は、 ネ ッ
ト ワ ー ク の制約の た め、 並列処理の メ リ ッ ト を 最大限に利用で き ま せ
ん。 ほ と ん ど の場合、 結果は、 マ ー ジ さ れて ネ ッ ト ワ ー ク 経由で ク ラ
イ ア ン ト に返 さ れ る と き よ り も 、 デー タ ベー ス か ら 返 さ れ る と き の方
が高速に な り ま す。
insert、 delete、 お よ び update な ど の並列 DML はサポー ト さ れて い な い
た め、 並列処理に よ る メ リ ッ ト は あ り ま せん。
並列処理の有効化
Adaptive Server で並列処理 を 設定す る に は、 number of worker processes
パ ラ メ ー タ と max parallel degree パ ラ メ ー タ を 有効に し ま す。
最適な パ フ ォ ー マ ン ス を 実現す る に は、 Adaptive Server で策定 さ
れた プ ラ ン の品質に影響す る そ の他の設定パ ラ メ ー タ に注意 し て く
だ さ い。
number of worker processes
並行処理 を 有効に す る 前に、 設定パ ラ メ ー タ number of worker processes
を 設定す る こ と に よ り 、 Adaptive Server で使用で き る ワ ー カ ー ・
プ ロ セ ス ( ス レ ッ ド と も 呼ばれ る ) の数 を 設定 し ま す。 number of worker
processes の値に は、 ピ ー ク 時の負荷に必要な合計数の 1.5 倍の値 を 設
定す る こ と を おすすめ し ま す。 ク エ リ に使用で き る ワ ー カ ー ・ プ ロ セ
ス の合計数 を 示す max parallel degree 設定パ ラ メ ー タ を 使用す る と 概数
を 計算で き ま す。 Adaptive Server へ の接続数、 お よ び同時に実行 さ れ
て い る ク エ リ の概数に よ り 、 次のルール を 使用 し て、 任意の時点で必
要 と な る ワ ー カ ー ・ プ ロ セ ス の数の値 を 概算で き ま す。
[number of worker processes] = [max parallel degree] × [ 並列で ク エ リ を 実
行す る 同時接続数 ] × [1.5]
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
145
並列処理の有効化
た と えば、 ワ ー カ ー ・ プ ロ セ ス数 を 40 に設定す る に は、 次の コ マ ン
ド を 使用 し ま す。
sp_configure "number of worker processes", 40
ス レ ッ ド 数の実行時調整は、 ク エ リ の パ フ ォ ー マ ン ス に悪影響 を 及ぼ
す場合が あ り ま す。 Adaptive Server では、 常に ス レ ッ ド の使用の最適
化 を 試み ま すが、 リ ソ ー ス の増大 を 必要 と す る プ ラ ン に既に コ ミ ッ ト
し て い る 場合 も あ り 、 そ の た め、 少な い ス レ ッ ド で実行す る 際は直線
的な ス ケ ールダ ウ ン は保証 さ れ ま せん。
ク エ リ ・ プ ロ セ ッ サ に あ る ワ ー カ ー ・ プ ロ セ ス の数が不十分な場合、
プ ロ セ ッ サは実行時に ク エ リ ・ プ ラ ン の調整 を 試み ま す。 必要最低限
の数の ワ ー カ ー ・ プ ロ セ ス がな い場合、 次の エ ラ ー ・ メ ッ セ ー ジ が表
示 さ れ、 ク エ リ が ア ボー ト さ れ ま す。
Insufficient number of worker processes to execute the
parallel query. Increase the value of the configuration
parameter ‘number of worker processes’
max parallel degree
max parallel degree 設定パ ラ メ ー タ を 使用 し て、 ク エ リ の並行処理の最
大値を 設定し ま す。 こ の パラ メ ー タ に よ り 、 任意の ク エリ を 処理する
際に Adaptive Server で使用する ス レ ッ ド の 最大数が決定さ れま す。 た
と え ば、 max parallel degree を 10 に 設定する に は、 次の よ う に 入力し
ま す。
sp_configure "max parallel degree", 10
Adaptive Server の 15.0 以前の バー ジ ョ ン と は異な り 、 こ の パ ラ メ ー
タ の値は ク エ リ ・ オプテ ィ マ イ ザに よ っ て完全に は強制 さ れ ま せん。
完全な強制プ ロ セ ス の場合、 最適化に長時間 を 費や さ な ければな り ま
せん。 Adaptive Server では、 理想の max parallel degree に近い設定に な
り 、 セ マ ン テ ィ ッ ク な理由に よ っ て の み こ の設定 を 超え ま す。
146
Adaptive Server Enterprise
第5章
並列クエリ処理
max resource granularity
max resource granularity の値に よ り 、 ク エ リ で使用で き る シ ス テ ム ・
リ ソ ー ス の最大パー セ ン テー ジ が設定 さ れ ま す。 Adaptive Server バー
ジ ョ ン 15.0 以降では、 max resource granularity はプ ロ シ ー ジ ャ ・ キ ャ ッ
シ ュ の み に影響 し ま す。 デ フ ォ ル ト では、 max resource granularity は
10% です。 ただ し 、 こ の値は ク エ リ ・ オプテ ィ マ イ ザの た め の目安に
すぎず、 実行時に は強制 さ ま せん。 max resource granularity を 低い値に
設定す る と 、 ク エ リ ・ エ ン ジ ン は、 ハ ッ シ ュ ベ ー ス の ア ルゴ リ ズ ム な
ど の メ モ リ 集約的な方式 を 避け る こ と がで き ま す。
max resource granularity を 5% に設定す る に は、 次の よ う に入力 し ま す。
sp_configure "max resource granularity", 5
max repartition degree
Adaptive Server は中間デー タ を 動的に再分割 し て、 別の オ ペ ラ ン ド の
分割ス キー ム に合わせ る か、 効率的な パーテ ィ シ ョ ン排除 を 実行す る
必要が あ り ま す。 max repartition degree は、 Adaptive Server で実行で き る
動的再分割の量 を 制御 し ま す。 max repartition degree の値が大き すぎ る
と 、 中間パーテ ィ シ ョ ン の数が多 く な り すぎ、 シ ス テ ム は、 リ ソ ー ス
を 取 り 合 う ワ ー ク ・ プ ロ セ ス で あ ふれて し ま う た め、 最終的に パ
フ ォ ー マ ン ス が低下す る 結果 と な り ま す。 max repartition degree の値は、
中間デー タ に対 し て作成 さ れた パーテ ィ シ ョ ン の最大数 を 強制 し ま
す。 再分割は CPU 集約の操作です。 max repartition degree の値は、
Adaptive Server エ ン ジ ン の合計数 を 超え る こ と はで き ま せん。
すべて の テーブルお よ び イ ン デ ッ ク ス が非分割で あ る 場合、 Adaptive
Server では max repartition degree の値 を 使用 し て、 デー タ の再分割の結
果作成 さ れ る パーテ ィ シ ョ ン の数 を 指定 し ま す。 値がデ フ ォ ル ト の 1
に設定 さ れて い る 場合、 max repartition degree の値はオ ン ラ イ ン ・ エ ン
ジ ン の数に設定 さ れ ま す。
max repartition degree は force オプ シ ョ ン を 使用 し てテーブル ま た は イ ン
デ ッ ク ス の並列ス キ ャ ン を 実行す る 場合に使用 し ま す。
select * from customers (parallel)
た と えば、 customers テーブルが非分割の場合に force オプ シ ョ ン を 使
用す る と 、 Adaptive Server ではそ の テーブル ま た は イ ン デ ッ ク ス固有
の分割度 を 探 し ま す。 こ の場合それは 1 です。 さ ら に、 サーバ に対 し
て設定 さ れた エ ン ジ ン の数、 ま た はテーブル ま た は イ ン デ ッ ク ス の
ペー ジ数に基づ き最 も 効果的な分割度で、 max repartition degree を 超え
な い値 を 使用 し ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
147
並列処理の有効化
max repartition degree を 5 に設定す る に は、 次の よ う に入力 し ま す。
sp_configure "max repartition degree", 5
max scan parallel degree
max scan parallel degree 設定パ ラ メ ー タ は、 分割 さ れた テーブル ま た は
イ ン デ ッ ク ス のデー タ に大き な偏 り が あ る 場合に、 下位互換性の た め
に の み使用 し ま す。 こ の パ ラ メ ー タ の値が 1 よ り も 大き い場合は、
Adaptive Server では こ の値 を 使用 し て ハ ッ シ ュ ベー ス ・ ス キ ャ ン を 実
行 し ま す。 max scan parallel degree の値は max parallel degree の値 を 超え
る こ と はで き ま せん。
prod-consumer overlap factor
prod-consumer overlap factor は、 ク エ リ ・ プ ラ ン で作成で き る パ イ プ ラ
イ ン並列処理の量に影響 し ま す。 デ フ ォ ル ト 値は 20% です。 こ れは、
親子関係の 2 つ の演算子が別々の ワ ー カ ー ・ プ ロ セ ス に よ っ て実行 さ
れた場合、 20% の重複が生 じ る こ と を 意味 し ま す。 残 り の 80% の演算
は逐次実行 さ れ ま す。 こ れは Adaptive Server が 2 つ の プ ラ ン ・ フ ラ グ
メ ン ト の コ ス ト 計算 を 行 う 方法に影響 し ま す。 グループ化演算に含 ま
れ る ス キ ャ ン演算子の例 を 考え ま し ょ う 。 こ の場合、 ス キ ャ ン 演算子
が N1 秒、 グループ化演算が N2 秒か か る と す る と 、 こ れ ら 2 つ の演算
子の応答時間は次の よ う に な り ま す。
0.2 * max (N1, N2) + 0.8 * (N1 + N2)
こ の パ ラ メ ー タ の設定では、 Adaptive Server が実行 さ れて い る オ ン ラ
イ ン ・ エ ン ジ ン の数、 お よ び実行す る ク エ リ の複雑性 を 考慮 し て く だ
さ い。 一般に は、 ス レ ッ ド ・ リ ソ ー ス を 使用 し て複数の パーテ ィ シ ョ
ン を 最初に ス キ ャ ン し ま す。 続い て、 未使用の ス レ ッ ド ・ リ ソ ー ス が
あ る 場合は、 それ ら を 使用 し て垂直方向の パ イ プ ラ イ ン並列処理 を 加
速 し ま す。 値が 50 を 超え な い よ う に し て く だ さ い。
148
Adaptive Server Enterprise
第5章
並列クエリ処理
min pages for parallel scan
max pages for parallel scan は、 並列で ア ク セ ス で き る テーブルお よ び イ
ン デ ッ ク ス を 制御 し ま す。 テーブル の ペ ー ジ数が こ の値未満の場合、
テーブルは逐次ア ク セ ス さ れ ま す。 デ フ ォ ル ト 値は 200 ペー ジ です。
ペー ジ ・ サ イ ズ に は関係あ り ま せん。 テーブルお よ びテーブルの イ ン
デ ッ ク ス は逐次ア ク セ ス さ れ ま すが、 Adaptive Server は必要に応 じ て
デー タ の再分割、 お よ び ス キ ャ ン の上の並列処理の使用 を 試み ま す。
max query parallel degree
max query parallel degree は、 特定の ク エ リ で使用す る ワ ー カ ー ・ プ ロ セ
ス の数 を 定義 し ま す。 こ の パ ラ メ ー タ は、 並列処理 を グ ロ ーバル に有
効に し な い場合に の み使用 し ま す。 ワ ー カ ー ・ プ ロ セ ス の数はゼ ロ よ
り 大き い値に設定す る 必要が あ り ま すが、 max query parallel degree は 1
に設定す る 必要が あ り ま す。
max query parallel degree を 1 よ り 大き い値に設定す る と 、 ク エ リ は並列
処理 を 使用す る よ う に コ ン パ イ ル さ れ ま せん。 代わ り に、 並行 ヒ ン ト
を 指定す る と 、 抽象プ ラ ン を 使用 し て、 並行処理 を 使用す る 1 つ以上
の ク エ リ を コ ン パ イ ルで き ま す。
use parallel N は、 特定の ク エ リ に使用す る 並行処理の量 を 定義す る た
め に使用で き ま す。 代わ り に、 create plan を 使用す る と 、 ク エ リ 、 お よ
びそ の た め に使用す る ワ ー カ ー ・ プ ロ セ ス の数 を 指定で き ま す。
セッション・レベルでの並行処理の制御
set オプ シ ョ ン を 使用す る と 、 ス ト ア ド ・ プ ロ シ ー ジ ャ ま た は ト リ ガ
でセ ッ シ ョ ン ご と に並列度 を 制約で き ま す。 こ れ ら の オプ シ ョ ン は、
並列 ク エ リ でチ ュ ーニ ン グ の テ ス ト を す る と き に使用す る と 便利
です。 ま た、 重要で な い ク エ リ を 逐次処理で動作す る よ う 制限 し 、
ワ ー カ ー ・ プ ロ セ ス を 他の タ ス ク で使え る よ う に す る と き に も 使用
で き ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
149
セッション・レベルでの並行処理の制御
表 5-1: セッションレベルの並列処理制御パラメータ
パラメータ
parallel_degree
scan_parallel_degree
resource_granularity
repartition_degree
機能
セ ッ シ ョ ン の ク エ リ 、 ス ト ア ド ・ プロ シージ ャ、
ま たは ト リ ガ に対 し て、 ワ ー カ ー ・ プ ロ セ ス の最大
数を設定す る 。 max parallel degree 設定パ ラ メ ー タ を
上書き す る が、 max parallel degree の値以下で あ る 必
要が あ る 。
特定の セ ッ シ ョ ン、 ス ト ア ド ・ プ ロ シ ー ジ ャ 、 ま た
は ト リ ガの実行中の ハ ッ シ ュ ベー ス ・ ス キ ャ ン に対
し て、 ワ ー カ ー ・ プ ロ セ ス の最大数を設定す る 。 max
scan parallel degree 設定パ ラ メ ー タ を 上書き し 、 max
scan parallel degree の値以下で あ る 必要が あ る 。
max resource granularity を上書き し 、 セ ッ シ ョ ン固有
の値に設定す る 。 こ の値は、 Adaptive Server で メ モ
リ 集約型の操作を使用す る か ど う か に影響す る 。
セ ッ シ ョ ン の max repartition degree の値を設定す る 。
セ マ ン テ ィ ッ ク 上の目的で中間デー タ ・ ス ト リ ー ム
を再分割す る 最大の度合い。
set オプ シ ョ ン の いずれ に対 し て も 大き すぎ る 値 を 指定す る と 、 対応
す る 設定パ ラ メ ー タ の値が使用 さ れ、 有効な値が メ ッ セ ー ジ で報告 さ
れ ま す。 セ ッ シ ョ ン中は set parallel_degree、 set scan_parallel_degree、 set
repartition_degree、 ま た は set resource_granularity が有効ですが、 実行す
る ス ト ア ド ・ プ ロ シ ー ジ ャ の プ ラ ン は、 プ ロ シ ー ジ ャ ・ キ ャ ッ シ ュ に
は配置 さ れ ま せん。 こ れ ら の set オプ シ ョ ン を 有効に し て実行 し たプ
ロ シ ー ジ ャ が生成す る プ ラ ン は、 最適 と は言え ま せん。
set コマンドの例
こ の例では、 現在の セ ッ シ ョ ン で開始 さ れたすべて の ク エ リ を 5 つ の
ワ ー カ ー ・ プ ロ セ ス に制約 し ま す。
set parallel_degree 5
こ の コ マ ン ド が有効な間、 5 よ り 多 く の数に分割 さ れ る テーブルの ク
エ リ は、 パーテ ィ シ ョ ン ベー ス ・ ス キ ャ ン を 使用で き な く な り ま す。
セ ッ シ ョ ン の制約 を 削除す る に は、 次の コ マ ン ド を 使用 し ま す。
set parallel_degree 0
ま たは
set scan_parallel_degree 0
150
Adaptive Server Enterprise
第5章
並列クエリ処理
それ以降の ク エ リ を 逐次モ ー ド で実行す る と き は、 次の コ マ ン ド を 使
用 し ま す。
set parallel_degree 1
ま たは
set scan_parallel_degree 1
リ ソ ー ス の細分性 を 、 シ ス テ ム で使用可能な全 リ ソ ー ス の 25% に設
定す る に は、 次の コ マ ン ド を 使用 し ま す。
set resource_granularity 25
repartition degree に つ い て も 同様です。 値は 5 に設定で き ま すが、 max
parallel degree を 超え る 値に設定す る こ と はで き ま せん。
set repartition_degree 5
クエリの並列処理の制御
select コ マ ン ド の from 句に parallel 拡張機能 を 指定す る こ と に よ り 、
select 文で使用 さ れ る ワ ー カ ー ・ プ ロ セ ス の数 を 指定で き ま す。 並列度
に は、 sp_configure で設定 し た値、 ま た は set コ マ ン ド で制御す る セ ッ
シ ョ ン で の制限値 よ り 大き い値 を 指定で き ま せん。 大き い値 を 指定 し
た場合、 そ の指定は無視 さ れ、 set ま た は sp_configure の制限値が使用
さ れ ま す。
select 文の構文は次の と お り です。
select ...
from tablename [( [index index_name]
[parallel [degree_of_parallelism | 1 ]]
[prefetch size] [lru|mru] ) ] ,
tablename [( [index index_name]
[parallel [degree_of_parallelism | 1]
[prefetch size] [lru|mru] ) ] ...
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
151
並列処理の選択的な使用
クエリレベルの並列句の例
1 つ の ク エ リ に並列度 を 指定す る に は、 テーブル名の次に parallel
を 指定 し ま す。 次の例は、 逐次処理で実行 さ れ ま す。
select * from huge_table (parallel 1)
次の例は、 ク エ リ で使用す る イ ン デ ッ ク ス を 指定 し 、 並列度 を 2 に設
定 し ま す。
select * from huge_table (index ncix parallel 2)
並列処理の選択的な使用
並列処理に よ る メ リ ッ ト は、 すべて の ク エ リ に あ る わ けでは あ り ま
せん。 通常、 並行処理に よ る メ リ ッ ト の な い ク エ リ はオプテ ィ マ イ ザ
に よ っ て判断 さ れ、 それ ら が逐次実行 さ れ ま す。 そ の よ う な場合に ク
エ リ ・ プ ロ セ ッ サで発生す る エ ラ ーは、 通常、 不完全な モデ リ ン グ に
よ る 不整合な統計ま た は間違 っ た コ ス ト 計算が原因 と な っ て い ま す。
ク エ リ の パ フ ォ ー マ ン ス が向上 し て い る か、 低下 し て い る かは経験か
ら わ か り ま す。 それ に よ っ て parallel を オ ン に し て お く か オ フ に し て
お く か を 決定で き ま す。
parallel を オ ン に し 、 逐次モ ー ド で実行す る ク エ リ を 特定 し た ら 、 次の
よ う に し て抽象プ ラ ン の ヒ ン ト を 付加で き ま す。
select count(*) from sysobjects
plan “(use parallel 1)”
次の よ う に ク エ リ ・ プ ラ ン を 作成 し て も 同 じ 効果が あ り ま す。
create plan “select count(*) from sysobjects”
“use parallel 1”
152
Adaptive Server Enterprise
第5章
並列クエリ処理
ただ し 、 こ の並行処理が リ ソ ー ス集約で あ っ た り 、 パ フ ォ ー マ ン ス の
良い ク エ リ ・ プ ラ ン を 生成 し な か っ た り す る 場合は、 選択的に使用 し
て く だ さ い。 選択 し た複雑な ク エ リ に対 し て並列処理 を 有効に す る
に は、 次の手順に従い ま す。
1
「number of worker processes」 (145 ペー ジ ) のガ イ ド ラ イ ン に従 っ
て、 ワ ー カ ー ・ プ ロ セ ス の数 を ゼ ロ よ り も 大き い数値に設定 し ま
す。 た と えば 10 個の ワ ー カ ー ・ プ ロ セ ス を 設定す る に は、 次の コ
マ ン ド を 実行 し ま す。
sp_configure “number of worker processes”, 10
2
max query parallel degree を 1 よ り 大き い値に設定 し ま す。 開始点 と
し て、 max parallel degree に使用す る 値に設定 し ま す。
sp_configure “max query parallel degree”, 10
3
ク エ リ が並列プ ラ ン を 使用す る よ う に強制す る た め に優先 さ れ る
方法では、 次の抽象プ ラ ン構文 を 使用 し ま す。
use parallel N
N は max query parallel degree の値よ り も 少な い値です。
最大 5 つ の ス レ ッ ド を 使用す る ク エ リ を 記述す る に は、 次の コ マ
ン ド を 使用 し ま す。
select count (*), S1.id from sysobjects S1, sysindexes S2
where S1.id = S2.id
group by S1.id
plan
“(use parallel 5)”
こ の ク エ リ は、 で き れば 5 つ の ワ ー カ ー ・ プ ロ セ ス を 使用す る よ
う に オプテ ィ マ イ ザに告げま す。 こ の ア プ ロ ーチ の唯一の難点
は、 ア プ リ ケ ー シ ョ ン で実際の ク エ リ を 変更 し な ければな ら な い
こ と です。 こ れ を 回避す る に は、 次の よ う に create plan を 使用 し
ま す。
create plan
“select count(*), S1.id from sysobjects S1, sysindexes S2
where S1.id = S2.id
group by S1.id”
“(use parallel 5)”
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
153
多数のパーティションでの並列処理の使用
抽象プ ラ ン ・ ロ ー ド ・ オプ シ ョ ン を オ ン に グ ロ ーバル設定す る
に は、 次の よ う に入力 し ま す。
sp_configure “abstract plan load”, 1
抽象プ ラ ン の使用の詳細に つ い ては、 「抽象プ ラ ン の作成 と 使用」
(341 ペー ジ ) を 参照 し て く だ さ い。
多数のパーティションでの並列処理の使用
こ の セ ク シ ョ ン の情報は、 管理性の た め に パーテ ィ シ ョ ン を 設定す る
場合、 お よ び並列性 を ほ と ん ど ま た は ま っ た く 持た な い物理ま た は論
理デバ イ ス上に パーテ ィ シ ョ ン を 作成す る 場合に も 適用 し ま す。
こ の説明の目的で、 1 年の各週 を 示す範囲分割 を 使用 し てテーブル を
分割す る と し ま す。 こ こ で の問題は、 ク エ リ ・ オプテ ィ マ イ ザでは基
本 と な る デ ィ ス ク ・ シ ス テ ム が 52 通 り の並列ス キ ャ ン に ど の よ う に
応 じ る か を 認識 し て い な い こ と です。 オプテ ィ マ イ ザは、 テーブルの
最 も 効果的な ス キ ャ ン方法 を 決定す る 必要が あ り ま す。 十分な数の
ワ ー カ ー ・ プ ロ セ ス が設定 さ れて い る 場合は、 オプテ ィ マ イ ザは 52
の ス レ ッ ド を 使用 し てテーブル を ス キ ャ ン し ま す。 こ れは、 深刻な パ
フ ォ ー マ ン ス問題の発生に つ なが る だけ では な く 、 逐次ス キ ャ ン よ り
も 時間がか か る 可能性が あ り ま す。
こ れ を防ぐ た め に は、 まずサポー ト さ れ る 並列処理の正確な量 を調べ
ま す。 こ の テーブル に使用 さ れて い る デバ イ ス がわ か っ て い る 場合
は、 UNIX シ ス テ ム で次の コ マ ン ド を 使用で き ま す。 こ の場合、
基本のデバ イ ス は /dev/xx です。
time dd if=/dev/xx of=/dev/null bs=2k skip=8 count = 102400 &
時刻が x と し て記録 さ れ る と し ま す。
次に同 じ 2 つ の コ マ ン ド を 同時に実行 し ま す。
time dd if=/dev/xx of=/dev/null bs=2k skip=8 count = 102400 &
time dd if=/dev/xx of=/dev/null bs=2k skip=8 count = 102400 &
154
Adaptive Server Enterprise
第5章
並列クエリ処理
今度は、 時刻が y だ と し ま す。 直線的な ス ケ ール ア ッ プでは、 x は y と
同 じ ですが、 こ れはおそ ら く 実現不可能です。 次の恒等式で十分で
し ょ う。
x <= y <= (N*x)/k
こ こ では N は開始 さ れた同時実行セ ッ シ ョ ン数で、 k は適切な向上 レ
ベル を 示す定数です。 k の近似値は 1.4 で、 こ れは逐次ス キ ャ ン よ り も
40% 上の測定基準 を 実現す る 限 り 並列ス キ ャ ン を 使用で き る こ と を 意
味 し ま す。
表 5-2: 並列スキャン測定基準
スレッド数
1
2
4
5
パフォーマンス
測定基準
200 台
245 台
560 台
725 台
k=1.4 の場合の測定基準を満たす値
245 <= (200*2)/1.4。 例 : 245<=285.71
560 <= (200*4)/1.4。 例 : 560<=571.42
725 <= (200*5)/1.4。 例 : 725<=714.28
表 5-2 は、 4 つ の同時ア ク セ ス が あ っ た後、 デ ィ ス ク ・ サブ シ ス テ ム
の パ フ ォ ー マ ン ス が低下 し た こ と を 示 し て い ま す。 パ フ ォ ー マ ン ス の
数値は k に よ っ て確立 さ れた許容範囲 を 下回 り ま し た。 通常、 偏 っ た
測定値 を 考慮に入れて、 十分な数のデー タ ブ ロ ッ ク を 読み込み ま す。
4 つ の ス レ ッ ド が最適で あ る こ と が立証 さ れた ら 、 次の よ う に
sp_chgattribute を 使用 し て オブ ジ ェ ク ト に バ イ ン ド す る こ と に よ り 、
こ の ヒ ン ト を 提供 し ま す。
sp_chgattribute < テーブル名 >, “plldegree”, 4
こ れ に よ り 、 最大 4 つ の ス レ ッ ド を 使用す る よ う に ク エ リ ・ オプテ ィ
マ イ ザに指示 し ま す。 十分な リ ソ ー ス が検出 さ れな い場合は、 4 つ よ
り 少な い数の ス レ ッ ド が選択 さ れ る こ と も あ り ま す。 さ ら に、 こ れ と
同 じ メ カ ニズ ム を イ ン デ ッ ク ス に適用す る こ と がで き ま す。 た と え
ば、 auth_ind と い う イ ン デ ッ ク ス が authors に存在 し 、 2 つ の ス レ ッ ド
を 使用 し てそれ に ア ク セ ス す る 場合は、 次の コ マ ン ド を 使用 し ま す。
sp_chgattribute “authors.auth_ind”, “plldegree”, 4
sp_chgatttribute は現在のデー タ ベ ー ス か ら 実行す る 必要が あ り ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
155
並列クエリの結果が異なる場合
並列クエリの結果が異なる場合
ク エ リ に ス カ ラ 集約が含 ま れて い な い場合、 ま た は最終 ソ ー ト 手順が
必要な場合、 並列 ク エ リ で返 さ れ る 結果の順序が、 同 じ ク エ リ を 逐次
処理で実行 し た と き と は異な る 順序に な る こ と が あ り ま す。 それ以降、
同 じ ク エ リ を 並列 で 実行す る と 、 結果 が異 な る 順序 で 返 さ れ ま す。
ワ ー カ ー ・ プ ロ セ ス が異な る と 速度 も 異な る た め、 結果セ ッ ト の順序
に違い が出ま す。 ま た、 すで に キ ャ ッ シ ュ に入 っ て い る ペ ー ジ や、 ロ ッ
ク の競合な ど に よ っ て も 、 それぞれ の並列ス キ ャ ン は違 う 動作に な り
ま す。 並列 ク エ リ で は、 常 に 同 じ 結果セ ッ ト が返 さ れ ま すが、 順序は
異な り ま す。
注意 結果の順序 を 信頼で き る も の に す る 必要が あ る 場合は、 order by
を 使用す る か、 ク エ リ を 逐次モ ー ド で実行 し ま す。
さ ら に、 デー タ ・ ペー ジ を 読み込む複数の ワ ー カ ー ・ プ ロ セ ス に よ る
調整の影響が あ る た め、 次の 2 種類の ク エ リ は、 集約ま た は最終 ソ ー
ト が実行 さ れな い と き、 同 じ デー タ に ア ク セ ス し て も 異な る 結果 を 返
す こ と が あ り ま す。 以下の項で こ れ ら の設定パ ラ メ ー タ に つ い て説明
し ま す。
•
set rowcount を 使用す る ク エ リ
•
十分に制限的な ク エ リ 句 を 持た な い で、 カ ラ ム を 選択 し て ロ ー カ
ル変数に入れ る ク エ リ
set rowcount を使用するクエリ
set rowcount オプ シ ョ ン を 使用す る と 、 一定数の ロ ーが ク ラ イ ア ン ト に
返 さ れ た後、 処理が停止 し ま す。 逐次処理で は、 ク エ リ ・ プ ラ ン が同
じ で あ る 限 り 反復実行 を 行 っ た結果 に一貫性が あ り ま す。 逐次モ ー ド
の場合、 1 つ の プ ロ セ ス がデー タ ・ ペ ー ジ を 毎回同 じ 順序で読み込む
た め、 任意の rowcount 値 に 対 し て同 じ ロ ー が同 じ 順序で返 さ れ ま す。
一方、 並列 ク エ リ では、 ペ ー ジ へ の ア ク セ ス速度が ワ ー カ ー ・ プ ロ セ
ス ご と に異な る 可能性が あ る た め、 返 さ れ る 結果の順序 と ロ ー の セ ッ
ト が異な る こ と が あ り ま す。 一貫性の あ る 結果 を 得 る た め に は、 最終
ソ ー ト 手順 を 実行す る 句 を 使用す る か、 ク エ リ を 逐次実行 し て く だ
さ い。
156
Adaptive Server Enterprise
第5章
並列クエリ処理
ローカル変数を設定するクエリ
次の ク エ リ は、 select 文で ロ ー カ ル変数の値 を 設定 し ま す。
select @tid = title_id from titles
where type = "business"
where 句は、 titles テーブル の複数の ロ ー と 一致 し ま す。 そ の た め、
こ の ロ ー カ ル変数は常に、 ク エ リ か ら 返 さ れ る ロ ー の う ち 最後に一致
し た ロ ー の値に設定 さ れ ま す。 逐次処理の場合、 値は常に同 じ に な り
ま す。 し か し 、 並列 ク エ リ 処理の場合、 結果は、 ワ ー カ ー ・ プ ロ セ ス
の最後の状態に よ り 変わ り ま す。 一貫性の あ る 結果 を 得 る た め に は、
最終 ソ ー ト 手順 を 実行す る 句 を 使用す る か、 ク エ リ を 逐次モ ー ド で実
行 し て く だ さ い。 ま た、 句 を 追加 し て、 ク エ リ 引数に 1 つ の ロ ーだけ
を 選択 さ せ る 方法 も あ り ま す。
並列クエリ・プランの理解
Adaptive Server で の並列 ク エ リ 処理 を 理解す る 上で重要な の は、 並列
ク エ リ ・ プ ラ ン の基本の ビ ルデ ィ ン グ ・ ブ ロ ッ ク を 理解す る こ と です。
注意 バ ッ チ内ま た は ス ト ア ド ・ プ ロ シ ー ジ ャ 内の SQL 文ご と に テキ
ス ト ベ ー ス の フ ォ ー マ ッ ト で ク エ リ ・ プ ラ ン を 表示す る 方法に つ い て
は、 「第 2 章 showplan の使用」 を 参照 し て く だ さ い。
コ ン パ イ ル さ れた ク エ リ ・ プ ラ ン に は、 ク エ リ の リ レ ー シ ョ ナル ・ セ
マ ン テ ィ ク ス と よ く 似た実行演算子の ツ リ ーが含 ま れて い ま す。 各 ク
エ リ 演算子は、 特定の ア ルゴ リ ズ ム を 使用 し て関係演算 を 実装 し ま す。
た と えば、 nested-loop join と い う ク エ リ 演算子は ジ ョ イ ン関係演算 を 実
装 し ま す。 Adaptive Server で は、 並 列 処 理 の プ ラ イ マ リ 演 算 子 は
exchange 演算子です。 こ の演算子は関係演算 を 実装 し な い制御演算子
です。 exchange 演算子は、 デー タ の フ ラ グ メ ン ト を 処理で き る 新 し い
ワ ー カ ー ・ プ ロ セ ス を 作 成 し ま す。 最 適 化 中、 Adaptive Server は
exchange 演算子 を 戦略的に配置 し 、 並列で実行で き る 演算子ツ リ ー の
フ ラ グ メ ン ト を 作成 し ま す。 exchange 演算子の下 ( 次の exchange 演算
子ま で ) に あ る すべて の演算子は、 演算子ツ リ ー の フ ラ グ メ ン ト の ク
ロ ー ン を 作成す る ワ ー カ ー ・ ス レ ッ ド に よ っ て実行 さ れ、 デー タ が並
列に生成 さ れ ま す。 そ の後 exchange 演算子は、 こ のデー タ を ク エ リ ・
プ ラ ン 内で そ の 上 の 親演算子 に 再分配で き ま す。 exchange 演算子は、
デー タ の パ イ プ ラ イ ン と ルー ト の再指定 を 処理 し ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
157
並列クエリ・プランの理解
次の セ ク シ ョ ン では、 “度 (degree)” と い う 単語が異な る 2 通 り の コ ン
テキ ス ト で使用 さ れて い ま す。 テーブル ま た は イ ン デ ッ ク ス の “N 度
(degree N)” が使用 さ れ る 場合、 それはテーブル ま た は イ ン デ ッ ク ス に
含 ま れ る パ ーテ ィ シ ョ ン の数 を 指 し ま す。 “あ る 操作の度合い (degree
of an operation)” ま た は “あ る 構成パ ラ メ ー タ の度合い (the degree of a
configuration parameter)” が使用 さ れ る 場合、 それは中間デー タ ・ ス ト
リ ー ム で生成 さ れた パーテ ィ シ ョ ン の数 を 指 し ま す。
次の例は、 ク エ リ ・ プ ロ セ ッ サの演算子が pubs2 デー タ ベ ー ス で の次
の ク エ リ 実行で逐次機能す る 様子 を 示 し て い ま す。 テーブル titles は、
カ ラ ム pub_id で 3 通 り の方法でハ ッ シ ュ 分割 さ れて い ま す。
select * from titles
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
1 operator(s) under root
ク エ リ の タ イ プは SELECT です。
ROOT:EMIT Operator
|SCAN Operator
| FROM TABLE
| titles
| テーブル ・ ス キ ャ ン です。
| 前方ス キ ャ ン
| テーブルの最初に位置付け ま す。
| デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て
い ま す。
| デー タ ・ ペー ジ に対す る LRU で のバ ッ フ ァ 置換方式
こ の例が示す よ う に、 titles テーブルは scan 演算子に よ っ て ス キ ャ ン さ
れ、 そ の詳細は showplan 出力に示 さ れ ま す。 emit 演算子は、 scan 演算
子か ら デー タ を 読み込み、 ク ラ イ ア ン ト ・ ア プ リ ケ ー シ ョ ン に送 り ま
す。 特定の ク エ リ は、 そ の よ う な演算子の複雑な ツ リ ー を 任意に作成
で き ま す。
並列処理がオ ン の場合、 Adaptive Server は scan 演算子の上の exchange
演算子 を 使用 し て単純な ス キ ャ ン を 並列で実行で き ま す。 exchange に
よ り 、 3 つ の パーテ ィ シ ョ ン に基づ き 3 つ の ワ ー カ ー ・ プ ロ セ ス が作
成 さ れ ま す。 それぞれの ワ ー カ ー ・ プ ロ セ ス は、 テーブルの 3 つば ら
ば ら の部分 を ス キ ャ ン し て、 出力 を コ ン シ ュ ー マ ・ プ ロ セ ス に送 り ま
す。 ツ リ ー上部の emit 演算子は、 ス キ ャ ン が並列で実行 さ れ る こ と を
認識 し て い ま せん。
158
Adaptive Server Enterprise
第5章
並列クエリ処理
例A:
select * from titles
調整プ ロ セ ス と 3 作業プ ロ セ ス に よ り 並列に実行 さ れ ま し た。
4 operator(s) under root
ク エ リ の タ イ プは SELECT です。
ROOT:EMIT Operator
|EXCHANGE Operator (Merged)
|Executed in parallel by 3 Producer and 1 Consumer processes.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|EXCHANGE:EMIT Operator
|
|
|RESTRICT Operator
|
|
|
|
|SCAN Operator
|
|
| FROM TABLE
|
|
| titles
|
|
| テーブル ・ ス キ ャ ン です。
|
|
| 前方ス キ ャ ン
|
|
| テーブルの最初に位置付け ま す。
|
|
| 3 方向分割ス キ ャ ン に よ り 並列に実行 さ れ ま し た。
|
|
| デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
|
|
| デー タ ・ ペー ジ に対す る LRU で のバ ッ フ ァ 置換方式
EXCHANGE: EMIT と い う 演算子は、 EXCHANGE 演算子の下に配置 さ れ、
デー タ が一箇所に集め ら れ ま す。 詳細に つ い ては、 「EXCHANGE 演
算子」 (160 ペ ー ジ ) を 参照 し て く だ さ い。
Adaptive Server の並列クエリ実行モデル
並列 ク エ リ 実行モデルの主要な コ ン ポー ネ ン ト の 1 つ は、 EXCHANGE
演算子です。 こ の演算子は、 ク エ リ の showplan 出力に見 ら れ ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
159
Adaptive Server の並列クエリ実行モデル
EXCHANGE 演算子
EXCHANGE 演算子は、 プ ロ デ ュ ーサ演算子 と コ ン シ ュ ー マ演算子間の
境界 を マ ー ク し ま す (EXCHANGE 演算子の下の演算子はデー タ を 生成
し 、 そ の上の演算子はデー タ を 消費 し ま す )。 タ イ ト ル ・ テーブルの
ス キ ャ ン (select * from titles) を 示す例 A では、 EXCHANGE: EMIT
お よ び SCAN 演算子がデー タ を 生成 し ま す。 こ れ を 簡単に示す と 次の
よ う に な り ま す。
select * from titles
ク エ リ の タ イ プは SELECT です。
ROOT:EMIT Operator
|EXCHANGE Operator (Merged)
|Executed in parallel by 3 Producer and 1 Consumer
processes.
|
|
|EXCHANGE:EMIT Operator
|
|
|
|
|RESTRICT Operator
|
|
|
|
|
|
|SCAN Operator
|
|
|
| FROM TABLE
|
|
|
| titles
|
|
|
| テーブル ・ ス キ ャ ン です。
こ の例では、 1 つ の コ ン シ ュ ー マ ・ プ ロ セ ス がパ イ プ ( プ ロ セ ス の
境界 を 越え てデー タ を 転送す る メ デ ィ ア と し て使用 さ れ る ) か ら デー
タ を 読み込み、 そ のデー タ を emit 演算子に渡 し ま す。 結果は こ の演算
子に よ っ て ク ラ イ ア ン ト に ルー ト 指定 さ れ ま す。 exchange 演算子は、
プ ロ デ ュ ーサ ・ ス レ ッ ド と 呼ばれ る ワ ー カ ー ・ プ ロ セ ス も 生成 し
ま す。 exchange:emit 演算子は、 exchange 演算子に よ っ て管理 さ れ る
パ イ プ にデー タ を 書き込み ま す。
160
Adaptive Server Enterprise
第5章
並列クエリ処理
図 5-1: クエリ・プランのプラン・フラグメントへのスレッドのバインド
図 5-1 は、 プ ロ デ ュ ーサ ・ プ ロ セ ス と コ ン シ ュ ー マ ・ プ ロ セ ス間の プ
ロ セ ス境界 を 示 し て い ま す。 こ の ク エ リ ・ プ ラ ン に は 2 つ の プ ラ ン ・
フ ラ グ メ ン ト が あ り ま す。 scan 演算子 と exchange:emit 演算子 を 含むプ
ラ ン ・ フ ラ グ メ ン ト の ク ロ ー ン は 3 通 り の方法で作成 さ れ、 3 対 1 の
exchange 演算子に よ っ てそれがパ イ プ に書き込ま れ ま す。 emit 演算子
と exchange 演算子は、 1 つ の プ ロ セ ス に よ っ て実行 さ れ ま す。 こ れ
は、 そ の プ ラ ン ・ フ ラ グ メ ン ト の ク ロ ー ン が 1 つ存在す る こ と を 意味
し ま す。
パイプ管理
exchange 演算子に よ っ て管理 さ れ る 4 つ の タ イ プ の パ イ プは、
デー タ ス ト リ ー ム の分割お よ びマ ー ジ の方法に よ っ て区別 さ れ ま す。
exchange 演算子で管理す る パ イ プ の タ イ プは、 プ ロ デ ュ ーサ と コ ン
シ ュ ー マ の数 を 示す showplan 出力でそ の説明 を 確認す る こ と に よ り 判
断で き ま す。 次に 4 つ の パ イ プ ・ タ イ プ に つ い て説明 し ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
161
Adaptive Server の並列クエリ実行モデル
多対 1
こ の場合、 exchange 演算子は複数の プ ロ デ ュ ーサ ・ ス レ ッ ド を 生成 し
ま すが、 パ イ プか ら デー タ を 読み込む コ ン シ ュ ー マ ・ タ ス ク は 1 つ で
す。 こ の コ ン シ ュ ー マ ・ タ ス ク に、 複数の プ ロ デ ュ ーサ ・ ス レ ッ ド が
書き込み ま す。 前の例の exchange 演算子は多対 1 の交換 を 実装 し ま
す。 多対 1 の exchange 演算子は順序 を 保持で き る た め、 こ の手法は特
に order by 句の並列 ソ ー ト 実行後、 デー タ ・ ス ト リ ー ム を マ ー ジ し て
最終的な順序 を 生成す る 場合に使用 さ れ ま す。 showplan 出力は、 複数
の プ ロ デ ュ ーサ ・ プ ロ セ ス と 1 つ の コ ン シ ュ ー マ ・ プ ロ セ ス を 示 し
ま す。
|EXCHANGE Operator (Merged)
|Executed in parallel by 3 Producer and 1
Consumer processes
1 対多
こ の場合、 1 つ の プ ロ デ ュ ーサ と 複数の コ ン シ ュ ー マ ・ ス レ ッ ド が存
在 し ま す。 プ ロ デ ュ ーサ ・ ス レ ッ ド は、 ク エ リ の最適化時に考案 し た
分割ス キー ム に従い、 複数の パ イ プ に デー タ を 書き込み、 各パ イ プ に
デー タ の ルー ト を 指定 し ま す。 各 コ ン シ ュ ー マ ・ ス レ ッ ド は、 割 り 当
て ら れた パ イ プ の 1 つ か ら デー タ を 読み込み ま す。 こ の種のデー タ 分
割は、 デー タ の順序 を 保持で き ま す。 showplan 出力は、 1 つ の プ ロ
デ ュ ーサ ・ プ ロ セ ス と 複数の コ ン シ ュ ー マ ・ プ ロ セ ス を 示 し ま す。
|EXCHANGE Operator (Repartitioned)
|Executed in parallel by 1 Producer
and 4 Consumer processes
多対多
多対多は、 複数の プ ロ デ ュ ーサ と 複数の コ ン シ ュ ー マが あ る こ と を 意
味 し ま す。 各プ ロ デ ュ ーサは、 複数の パ イ プ に書き込み、 各パ イ プ に
は複数の コ ン シ ュ ー マが あ り ま す。 各ス ト リ ー ム は 1 つ の パ イ プ に書
き込ま れ、 各 コ ン シ ュ ー マ ・ ス レ ッ ド は、 割 り 当て ら れた パ イ プ の 1
つ か ら デー タ を 読み込み ま す。
|EXCHANGE Operator (Repartitioned)
|Executed in parallel by 3 Producer and 4
Consumer processes
複写交換演算子
こ の場合、 プ ロ デ ュ ーサ ・ ス レ ッ ド は exchange 演算子で設定す る 各パ
イ プ に そ のデー タ の すべて を 書き込み ま す。 プ ロ デ ュ ーサ ・ ス レ ッ ド
は、 ソ ー ス ・ デー タ ( ク エ リ ・ オプテ ィ マ イ ザで数 を 指定 ) の コ ピ ー
を exchange 演算子内の パ イ プ の数 と 同 じ 数だけ作成 し ま す。 各 コ ン
シ ュ ー マ ・ ス レ ッ ド は、 割 り 当て ら れた パ イ プ の 1 つ か ら デー タ を 読
み込み ま す。 showplan 出力では、 こ れは次の よ う に示 さ れ ま す。
|EXCHANGE (Replicated)
|Executed in parallel by 3 Producers and 4
Consumer processes
162
Adaptive Server Enterprise
第5章
並列クエリ処理
ワーカー・プロセス・モデル
並列 ク エ リ ・ プ ラ ン は、 異な る 演算子で構成 さ れ ま す。 それ ら の演算
子の少な く と も 1 つ は exchange 演算子です。 並列 ク エ リ ・ プ ラ ン は、
実行時に複数のサーバ ・ プ ロ セ ス の セ ッ ト に バ イ ン ド さ れ、 それ ら に
よ っ て並列に実行 さ れ ま す。
ユーザ接続に関連づけ ら れたサーバ ・ プ ロ セ ス は、 並列実行の開始元
で あ る ソ ー ス ・ プ ロ セ ス で あ る た め、 「ア ル フ ァ ・ プ ロ セ ス」 と 呼ば
れ ま す。 特に、 並列ク エ リ ・ プ ラ ン の実行に関与す る 各ワ ー カ ー ・ プ ロ
セ ス は、 ア ル フ ァ ・ プ ロ セ ス に よ っ て生成 さ れ ま す。
ア ル フ ァ ・ プ ロ セ ス は ワ ー カ ー ・ プ ロ セ ス を 生成す る こ と に加え、 プ
ラ ン の実行に関与す る すべて の ワ ー カ ー ・ プ ロ セ ス を 初期化 し 、 ワ ー
カ ー ・ プ ロ セ ス がデー タ を 交換す る た め に必要な パ イ プ の作成や破棄
も 行い ま す。 ア ル フ ァ ・ プ ロ セ ス は、 事実上、 並列 ク エ リ ・ プ ラ ン実
行の グ ロ ーバル ・ コ ーデ ィ ネ ー タ で あ る と い え ま す。
Adaptive Server は、 実行時に プ ラ ン内の各 exchange 演算子 を ワ ー
カ ー ・ プ ロ セ ス の セ ッ ト と 関連づけ ま す。 ワ ー カ ー ・ プ ロ セ ス は
exchange 演算子の す ぐ下に あ る ク エ リ ・ プ ラ ン ・ フ ラ グ メ ン ト を 実行
し ま す。
「EXCHANGE 演算子」 (160 ペー ジ ) に示 し た例 A の ク エ リ の場合、
exchange 演算子は 3 つ の ワ ー カ ー ・ プ ロ セ ス に関連づけ ら れて い
ま す。 各 ワ ー カ ー ・ プ ロ セ ス は、 exchange:emit 演算子お よ び scan
演算子で構成 さ れた プ ラ ン ・ フ ラ グ メ ン ト を 実行 し ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
163
Adaptive Server の並列クエリ実行モデル
図 5-2: 1 つの exchange 演算子を含むクエリ実行プラン
É^ÉCÉgÉã (3 ÉpÅ[ÉeÉBÉVÉáÉì)
各 exchange 演算子は、 「ベー タ ・ プ ロ セ ス」 と い う サーバ ・ プ ロ セ ス
に も 関連づけ ら れて い ま す。 ベ ー タ ・ プ ロ セ ス は ア ル フ ァ ・ プ ロ セ ス
で あ る 場合 も 、 ワ ー カ ー ・ プ ロ セ ス で あ る 場合 も あ り ま す。 特定の
exchange 演算子に関連づけ ら れた ベ ー タ ・ プ ロ セ ス は、 exchange 演算
子以下の プ ラ ン ・ フ ラ グ メ ン ト を 実行す る ロ ー カ ル ・ コ ーデ ィ ネ ー タ
です。 上の例では、 実行す る プ ラ ン に は 1 つ の レ ベルの exchange 演算
子 し か な い の で、 ベー タ ・ プ ロ セ ス は ア ル フ ァ ・ プ ロ セ ス と 同一の プ
ロ セ ス に な り ま す。
次に、 こ の ク エ リ を 使用 し て、 ク エ リ ・ プ ラ ン に複数の exchange 演算
子が含ま れ る 場合 を 説明 し ま す。
select count(*),pub_id, pub_date
from titles
group by pub_id, pub_date
164
Adaptive Server Enterprise
第5章
並列クエリ処理
図 5-3: 2 つの交換演算子のあるクエリ実行プラン
図 5-3 に は 2 つ の レ ベルの exchange 演算子が あ り 、 それぞれ
EXCHANGE-1 お よ び EXCHANGE-2 と マ ー ク さ れて い ま す。 ワ ー
カ ー ・ プ ロ セ ス T4 は、 exchange 演算子 EXCHANGE-2 に関連づけ
ら れた ベー タ ・ プ ロ セ ス です。
ベー タ ・ プ ロ セ ス は、 exchange 演算子以下の プ ラ ン ・ フ ラ グ メ ン ト の
実行 を ロ ー カ ル に調整 し ま す。 すな わ ち 、 ワ ー カ ー ・ プ ロ セ ス で必要
な ク エ リ ・ プ ラ ン情報 を デ ィ ス パ ッ チ し 、 プ ラ ン ・ フ ラ グ メ ン ト の実
行 を 同期化 し ま す。
並列 ク エ リ ・ プ ラ ン の実行に関与す る プ ロ セ ス で、 ア ル フ ァ ・ プ ロ セ
ス で も な く ベ ー タ ・ プ ロ セ ス で も な い も の を 「ガ ン マ ・ プ ロ セ ス」 と
呼び ま す。
並列 ク エ リ ・ プ ラ ン は、 実行時に ユニー ク な ア ル フ ァ ・ プ ロ セ ス、 1
つ ま た は複数の ベ ー タ ・ プ ロ セ ス、 お よ び少な く と も 1 つ のガ ン マ ・
プ ロ セ ス に バ イ ン ド さ れ ま す。 Adaptive Server の並列プ ラ ン に は、 並
列に実行す る 異な る プ ロ セ ス ( ア ル フ ァ と ガ ン マ ) が少な く と も 2 つ
必要です。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
165
Adaptive Server の並列クエリ実行モデル
exchange 演算子 と ワ ー カ ー ・ プ ロ セ ス間の マ ッ ピ ン グ を 調べ る た め、
お よ び ア ル フ ァ ・ プ ロ セ ス お よ びベー タ ・ プ ロ セ ス はそれぞれ ど れか
を 見つ け る た め に は、 dbcc traceon(516) を 使用 し ま す。
=======Thread to XCHg Map BEGINS=======
ALFA thread spid: 17
XCHG = 2
<- refers
Comp Count = 2 Exec Count = 2
Range Adjustable
Consumer XCHG = 5
Parent thread spid: 34
<- refers
Child thread 0: spid: 37
<- refers
Child thread 1: spid: 38
<- refers
Child thread 2: spid: 36
<- refers
Scheduling level: 0
XCHG = 5
<- refers
Comp Count = 3 Exec Count = 3
Bounds Adjustable
Consumer XCHG -1
Parent thread spid: 17
<- refers
Child thread 0: spid: 34
<- refers
Child thread 1: spid: 35
<- refers
to Xchg-2
to
to
to
to
T4
T1
T2
T3
to Xchg-1
to Alpha
to T4
to T5
Scheduling level: 0
=======Thread to XCHg Map BEGINS=======
SQL 演算での並列処理の使用
テーブル ま た は イ ン デ ッ ク ス は、 ア プ リ ケ ー シ ョ ン の ニーズ を 最 も 効
果的に反映す る 方法で分割 し ま す。 Sybase では、 異な る 物理デ ィ ス ク
を 使用す る セグ メ ン ト に パーテ ィ シ ョ ン を 設定 し て、 十分な数の I/O
並行処理が存在す る よ う に す る こ と を おすすめ し ま す。 た と えば、
テーブルの特定の カ ラ ム の ハ ッ シ ン グ、 特定の範囲、 ま た はパーテ ィ
シ ョ ン に属す る 値の リ ス ト に基づ き、 パーテ ィ シ ョ ン を 明確に定義す
る こ と がで き ま す。 ハ ッ シ ュ 、 範囲、 お よ び リ ス ト ・ パーテ ィ シ ョ ン
は 「セ マ ン テ ィ ッ ク ベー ス」 の パーテ ィ シ ョ ン の カ テゴ リ に属 し 、
ロ ーが指定 さ れ る と 、 それが属す る パーテ ィ シ ョ ン を 判断で き ま す。
166
Adaptive Server Enterprise
第5章
並列クエリ処理
ラ ウ ン ド ロ ビ ン 分割の場合、 パ ーテ ィ シ ョ ン に は セ マ ン テ ィ ク ス は関
連づけ ら れて い ま せ ん。 ロ ー は いずれ の パ ー テ ィ シ ョ ン に含 ま れ る 場
合 も あ り ま す。 分割す る カ ラ ム の選択 と 、 使用す る 分割の タ イ プは、 ア
プ リ ケ ー シ ョ ン の パ フ ォ ー マ ン ス に 大 き く 影響す る 場合が あ り ま す。
パーテ ィ シ ョ ン を 、 低カ ーデ ィ ナ リ テ ィ ・ イ ン デ ッ ク ス と 考え て く だ
さ い。 パーテ ィ シ ョ ン を 定義す る 必要の あ る カ ラ ム は、 ア プ リ ケ ー シ ョ
ン の ク エ リ に基づ き ま す。
ク エ リ 処理エ ン ジ ン お よ びそ の演算子は、 Adaptive Server の分割方式
を 利用 し ま す。 テーブルお よ び イ ン デ ッ ク ス で定義 さ れ る 分割 を 静的
分割 と 呼び ま す。 さ ら に Adaptive Server では、 ジ ョ イ ン、 ベ ク ト ル集
合、 distinct、 union な ど の関係演算の ニーズ に対応 し て、 デー タ を 動
的に再分割 し ま す。 再分割は、 ス ト リ ー ミ ン グ ・ モ ー ド で行われ、 格
納領域は関連づけ ら れ ま せん。 再分割は、 静的再分割 を 行 う alter table
repartition コ マ ン ド の発行 と は異な り ま す。
ク エ リ ・ プ ラ ン は、 ク エ リ 実行演算子で構成 さ れ ま す。 Adaptive Server
では、 演算子は次の 2 つ の カ テゴ リ の いずれか に属 し ま す。
•
属性非反映型演算子に は、 scan、 union all、 お よ び scalar
aggregation が あ り ま す。 基本 と な る パーテ ィ シ ョ ン は、 属性非反
映型演算子に は影響 し ま せん。
•
属性に依存す る 演算子 ( た と えばジ ョ イ ン 、 distinct、 union、 お よ
びベ ク ト ル集合 ) を 使用す る と 、 セ マ ン テ ィ ク ス ベー ス の分割 を
使用 し て、 一定量のデー タ の演算 を 、 小 さ なデー タ ・ フ ラ グ メ ン
ト に対す る 少数の演算に分割で き ま す。 そ の後、 単純な union all 演
算に よ り 最終の結果セ ッ ト が提供 さ れ ま す。 union all は、 多対 1 の
exchange 演算子 を 使用 し て実装 し ま す。
次の セ ク シ ョ ン では、 こ れ ら 2 つ の ク ラ ス の演算子に つ い て説明 し
ま す。 こ れ ら の セ ク シ ョ ン の例では、 並列処理 を ト リ ガす る た め に十
分なデー タ と 共に次の テーブル を 使用 し ま す。
create table RA2(a1 int, a2 int, a3 int)
属性非反映型演算の並列処理
こ の セ ク シ ョ ン では、 属性非反映型演算に つ い て説明 し ま す。 こ れ に
は、 scan ( 逐次 と 並列 )、 scalar aggregation、 お よ び union all が含ま れ
ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
167
Adaptive Server の並列クエリ実行モデル
テーブル・スキャン
水平並列処理の場合、 ク エ リ 内の少な く と も 1 つ の テーブルが分割
さ れて い る か、 設定パ ラ メ ー タ max repartition degree が 1 よ り も 大き い
必要が あ り ま す。 max repartition degree が 1 に設定 さ れて い る 場合、
Adaptive Server は ヒ ン ト と し て い く つ か の オ ン ラ イ ン ・ エ ン ジ ン を 使
用 し ま す。 Adaptive Server が水平並列処理 を 実行す る と 、 1 つ ま た は複
数の演算子の複数バー ジ ョ ン が並列に実行 さ れ ま す。 演算子の各 ク
ロ ー ン は、 対応す る パーテ ィ シ ョ ン に対 し て実行 さ れ ま す。 パーテ ィ
シ ョ ン は静的に作成 さ れ る 場合 も 、 実行時に動的に構築 さ れ る 場合 も
あ り ま す。
逐次テーブル・ス
キャン
次の例は、 ク エ リ の逐次実行 を 示 し て い ま す。 テーブル RA2 は table
scan 演算子 を 使用 し て ス キ ャ ン さ れ ま す。 こ の演算の結果は、 emit
演算子に ルー ト 指定 さ れ、 そ こ か ら ク ラ イ ア ン ト に転送 さ れ ま す。
select * from RA2
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
1 operator(s) under root
ク エ リ の タ イ プは SELECT です。
ROOT:EMIT Operator
|SCAN Operator
| FROM TABLE
| RA2
| テーブル ・ ス キ ャ ン です。
| 前方ス キ ャ ン
| テーブルの最初に位置付け ま す。
| デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し
て い ま す。
| デー タ ・ ペー ジ に対す る LRU で のバ ッ フ ァ 置換方式
15.0 以前の バー ジ ョ ン の Adaptive Server では、 force オプ シ ョ ン を 使用
し な い限 り 、 ハ ッ シ ュ ベ ー ス の ス キ ャ ン を 使用 し た非分割テーブル の
並列ス キ ャ ン は試行 さ れ ま せん で し た。 図 5-4 は、 1 つ の タ ス ク T1 に
よ っ て逐次モ ー ド で実行 さ れた全ペー ジ ・ ロ ッ ク ・ テーブル の ス キ ャ
ン を 示 し て い ま す。 タ ス ク は、 テーブルの ペー ジ ・ チ ェ ー ン に沿 っ て
各ペ ー ジ を 読み込む一方で、 必要な ペ ー ジ がキ ャ ッ シ ュ に な い場合は
物理 I/O を 実行 し ま す。
168
Adaptive Server Enterprise
第5章
並列クエリ処理
図 5-4: 逐次タスクによるデータ・ページのスキャン
1 つのページ・チェーン
7T1
並列テーブル・ス
キャン
Adaptive Server の force オプ シ ョ ン を 使用す る と 、 非分割の テーブル の
並列テーブル ・ ス キ ャ ン を 強制で き ま す。 こ の場合、 Adaptive Server
では ハ ッ シ ュ ベー ス の ス キ ャ ン を 使用 し ま す。
ハッシュベース・
テーブル・スキャン
図 5-5 は、 ハ ッ シ ュ ベ ー ス の テーブル ・ ス キ ャ ン時に、 3 つ の ワ ー
カ ー ・ プ ロ セ ス が、 全ペ ー ジ ロ ッ ク ・ テーブルか ら デー タ ・ ペー ジ に
ア ク セ ス す る 作業 を 分担す る 様子 を 示 し て い ま す。 各 ワ ー カ ー ・ プ ロ
セ ス がすべて の ペ ー ジ に つ い て論理 I/O を 実行 し ま す。 し か し 、 各プ
ロ セ ス は、 下の図の異な る 網か け の部分が示す よ う に ペー ジ に あ る
ロ ー の 1/3 だけ を 検査 し ま す。 ハ ッ シ ュ ベ ー ス ・ テーブル ・ ス キ ャ ン
は、 ユーザが並列度 を 強制す る 場合に の み使用 さ れ ま す。 詳細に つ い
ては、 「分割ス キ ュ ー」 (212 ペ ー ジ ) を 参照 し て く だ さ い。
1 つ の ワ ー カ ー ・ プ ロ セ ス は、 他の ワ ー カ ー ・ プ ロ セ ス が I/O を 待機
し て い る 間に実行す る こ と がで き る の で、 エ ン ジ ン を 1 つ だけ使用 し
て い る 場合で あ っ て も 、 並列ア ク セ ス を 使用す る メ リ ッ ト が あ り ま
す。 複数の エ ン ジ ン が あ る 場合、 一部の ワ ー カ ー ・ プ ロ セ ス が同時に
動作で き ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
169
Adaptive Server の並列クエリ実行モデル
図 5-5: 複数のワーカー・プロセスによる非分割のテーブルのスキャン
WP1
1 つのページ・チェーン
WP2
WP3
複数のワーカー・プロセス
ハ ッ シ ュ ベ ー ス ・ ス キ ャ ン では、 それぞれの ワ ー カ ー ・ プ ロ セ ス が、
それぞれの ペー ジ に ア ク セ ス し て ペー ジ ID でハ ッ シ ュ す る 必要が あ
る た め、 ス キ ャ ン の論理 I/O が増加 し ま す。 デー タ オ ン リ ー ロ ッ ク ・
テーブルの場合は、 ハ ッ シ ュ ベ ー ス ・ ス キ ャ ン がエ ク ス テ ン ト ID ま
た は ア ロ ケ ー シ ョ ン ・ ペ ー ジ ID でハ ッ シ ュ す る た め、 1 つ の ワ ー
カ ー ・ プ ロ セ ス だけが 1 ペー ジ を ス キ ャ ン し 、 論理 I/O は増加 し ま
せん。
パーティションベー
スのテーブル・ス
キャン
こ の テーブル を 次の よ う に分割す る 場合
alter table RA2 partition by range(a1, a2)
(p1 values <= (500,100), p2 values <= (1000, 2000))
次の ク エ リ では、 Adaptive Server はテーブルの並列ス キ ャ ン を 選択
で き ま す。 並列ス キ ャ ン は、 ス キ ャ ン す る 十分な数の ペ ー ジ が あ り 、
パーテ ィ シ ョ ン ・ サ イ ズが同様な た め、 ク エ リ で並列処理の メ リ ッ
ト が あ る 場合に の み選択 さ れ ま す。
select * from RA2
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
調整プ ロ セ ス と 2 作業プ ロ セ ス に よ り 並列に実行 さ れ ま し た。
3 operator(s) under root
ク エ リ の タ イ プは SELECT です。
ROOT:EMIT Operator
|EXCHANGE Operator (Merged)
170
Adaptive Server Enterprise
第5章
並列クエリ処理
|Executed in parallel by 2 Producer and 1 Consumer
processes.
|
|
|EXCHANGE:EMIT Operator
|
|
|
|
|SCAN Operator
|
|
| FROM TABLE
|
|
| RA2
|
|
| テーブル ・ ス キ ャ ン です。
|
|
| 前方ス キ ャ ン
|
|
| テーブルの最初に位置付け ま す。
|
|
| 2 方向分割ス キ ャ ン に よ り 並列に実行 さ れ ま し た。
|
|
| デー タ ・ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト
を使用 し て い ま す。
|
|
| デー タ・ペー ジ に対す る LRU で の バ ッ フ ァ 置換方式
テーブル を 分割す る と 、 showplan 出力に は exchange と exchange:emit の
2 つ の演算子が追加 さ れ ま す。 こ の ク エ リ に は、 2 つ の ワ ー カ ー ・ プ ロ
セ ス が含ま れ ま す。 各 ワ ー カ ー ・ プ ロ セ ス は、 図 5-1 (161 ペ ー ジ ) に
示 し た よ う に、 特定の パーテ ィ シ ョ ン を ス キ ャ ン し て、 デー タ を
exchange:emit 演算子に渡 し ま す。
図 5-6 は、 3 つ の物理デ ィ ス ク 上で 3 つ に分割 さ れて い る テーブル を
ク エ リ が ス キ ャ ン す る 方法 を 示 し ま す。 エ ン ジ ン を 1 つだけ使用す る
場合、 実行で き る ワ ー カ ー ・ プ ロ セ ス は 1 つ だけ で、 他の プ ロ セ ス は
I/O ま た は別の プ ロ セ ス が設定 し た ロ ッ ク が解放 さ れ る の を 待つ た め
ス リ ープす る の で、 ク エ リ は並列ア ク セ ス の メ リ ッ ト を 利用 し ま す。
複数の エ ン ジ ン が使用可能な場合、 複数の ワ ー カ ー ・ プ ロ セ ス が同時
に動作で き ま す。 こ の よ う な設定は非常に効果的です。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
171
Adaptive Server の並列クエリ実行モデル
図 5-6: 複数のワーカー・プロセスによる複数のパーティションへのア
クセス
インデックス・スキャン
イ ン デ ッ ク ス は、 テーブル と 同様、 分割 さ れ る 場合 と さ れな い場合が
あ り ま す。 ロ ー カ ル ・ イ ン デ ッ ク ス は、 テーブル の分割方式 を 継承 し
ま す。 各 ロ ー カ ル ・ イ ン デ ッ ク ス ・ パーテ ィ シ ョ ン は、 1 つ の パー
テ ィ シ ョ ン の み のデー タ を ス キ ャ ン し ま す。 グ ロ ーバル ・ イ ン デ ッ ク
ス では、 ベ ー ス ・ テーブル と は異な る 分割方式が使用 さ れ、 1 つ以上
の パーテ ィ シ ョ ン を 参照 し ま す。
グローバル・ノンク
ラスタード・イン
デックス
Adaptive Server は、 すべて の テーブル分割方式に つ い て、 ノ ン ク ラ ス
タ ー ド お よ び非分割の グ ロ ーバル ・ イ ン デ ッ ク ス を サポー ト し ま す。
グ ロ ーバル ・ イ ン デ ッ ク ス は、 15.0 以前の Adaptive Server バー ジ ョ ン
でサポー ト さ れて お り 、 OLTP 環境で も 有効です。 イ ン デ ッ ク ス と
デー タ ・ パーテ ィ シ ョ ン は同 じ 記憶領域に常駐す る 場合 も 、 異な る 記
憶領域に常駐す る 場合 も あ り ま す。
ハッシュを使用した
グローバル・ノンク
ラスタード・イン
デックスのカバーさ
れていないスキャン
非分割グ ロ ーバル ・ ノ ン ク ラ ス タ ー ド ・ イ ン デ ッ ク ス を 範囲に よ っ て
分割 さ れた テーブル RA2 に作成す る に は、 次の よ う に入力 し ま す。
create index RA2_NC1 on RA2(a3)
こ の ク エ リ に は、 イ ン デ ッ ク ス ・ キー a3 を 使用す る 述部が あ り ま す。
select * from RA2 where a3 > 300
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
. . . . . . . . . . . . . .
ク エ リ の タ イ プは SELECT です。
172
Adaptive Server Enterprise
第5章
並列クエリ処理
ROOT:EMIT Operator
|EXCHANGE Operator (Merged)
|Executed in parallel by 3 Producer and 1
Consumer processes.
|
|
|EXCHANGE:EMIT Operator
|
|
|
|
|SCAN Operator
|
|
| FROM TABLE
|
|
| RA2
|
|
| イ ン デ ッ ク ス : RA2_NC1
|
|
| 前方ス キ ャ ン
|
|
| キー に よ っ て位置付け ま す。
|
|
| Keys are:
|
|
| a3 ASC
|
|
| 3 方向ハ ッ シ ュ ・ ス キ ャ ン に よ り 並列に実行 さ れ
ま し た。
|
|
| イ ン デ ッ ク ス の リ ー フ ・ ペー ジ に対 し て I/O サ
イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
|
|
| イ ン デ ッ ク ス の リ ー フ ・ ペー ジ に対す る LRU で
の バ ッ フ ァ 置換方式
|
|
| デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ
イ ト を使用 し て い ま す。
|
|
| デー タ ・ ペー ジ に対す る LRU で のバ ッ フ ァ 置換
方式
Adaptive Server は、 exchange 演算子 に よ っ て 生成 さ れ た 3 つ の プ ロ
デ ュ ーサ ・ ス レ ッ ド を 使用す る イ ン デ ッ ク ス RA2_NC1 を 使用す る イ ン
デ ッ ク ス ・ ス キ ャ ン を 使用 し ま す。 各プ ロ デ ュ ーサ ・ ス レ ッ ド は、 条
件 を 満たす リ ー フ ・ ペ ー ジ を すべて ス キ ャ ン し 、 条件 を 満たすデー タ
の ロ ー ID でハ ッ シ ュ ・ ア ルゴ リ ズ ム を 使用 し 、 それが属す る デー タ ・
ペ ー ジ に ア ク セ ス し ま す。 こ の場合、 並列処理はデー タ ・ ペ ー ジ ・ レ
ベルで行われ ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
173
Adaptive Server の並列クエリ実行モデル
図 5-7: グローバル・ノンクラスタード・インデックスのハッシュベースの
並列スキャン
174
Adaptive Server Enterprise
第5章
並列クエリ処理
図 5-7 の凡例
ク エ リ がデー タ ・ ペ ー ジ に ア ク セ ス す る 必要がな い場合は、 並列に は
実行 さ れ ま せん。 ただ し 、 ク エ リ に はパーテ ィ シ ョ ン ・ カ ラ ム を 追加
す る 必要が あ る た め、 カ バー さ れな い ス キ ャ ン に な り ま す。
select a3 from RA2 where a3 > 300
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
調整プ ロ セ ス と 2 作業プ ロ セ ス に よ り 並列に実行 さ れ ま し た。
3 operator(s) under root
ク エ リ の タ イ プは SELECT です。
ROOT:EMIT Operator
|EXCHANGE Operator (Merged)
|Executed in parallel by 2 Producer and 1 Consumer
processes.
|
|
|EXCHANGE:EMIT Operator
|
|
|
|
|SCAN Operator
|
|
| FROM TABLE
|
|
| RA2
|
|
| イ ンデ ッ ク ス : RA2_NC1
|
|
| 前方ス キ ャ ン
|
|
| キー に よ っ て位置付け ま す。
|
|
| Keys are:
|
|
|
a3 ASC
|
|
| 2 方向ハ ッ シ ュ ・ス キ ャ ン に よ り 並列に実行 さ れ ま し た。
|
|
| イ ン デ ッ ク ス の リ ー フ ・ ペー ジ に対 し て I/O サ イ ズ
2 キ ロ バ イ ト を使用 し て い ま す。
|
|
| イ ン デ ッ ク ス の リ ー フ ・ペー ジ に対す る LRU で の バ ッ
フ ァ 置換方式
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
175
Adaptive Server の並列クエリ実行モデル
|
|
| デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト
を使用 し て い ま す。
|
|
| デー タ ・ ペー ジ に対す る LRU で のバ ッ フ ァ 置換方式
ノンクラスタード・
グローバル・イン
デックスを使用した
カバード・スキャン
分割対象カ ラ ム を 含む ノ ン ク ラ ス タ ー ド ・ イ ン デ ッ ク ス が あ る 場合、
Adaptive Server がデー タ ・ ペー ジ に ア ク セ ス す る 理由は な く 、 ク エ リ
は逐次実行 さ れ ま す。
create index RA2_NC2 on RA2(a3,a1,a2)
select a3 from RA2 where a3 > 300
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
1 operator(s) under root
ク エ リ の タ イ プは SELECT です。
ROOT:EMIT Operator
| SCAN Operator
| FROM TABLE
| RA2
| イ ンデ ッ ク ス : RA2_NC2
| 前方ス キ ャ ン
| キー に よ っ て位置付け ま す。
| イ ン デ ッ ク ス に は、 必要な カ ラ ム がすべて含ま れて い ま す。
ベー ス ・ テーブルは読み込ま れ ま せん。
| Keys are:
|
a3 ASC
| イ ン デ ッ ク ス の リ ー フ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ
バ イ ト を使用 し て い ま す。
| イ ンデ ッ ク ス の リ ー フ ・ ペー ジ に対す る LRU で のバ ッ フ ァ 置換
方式
クラスタード・イン
デックス・スキャン
全ペ ー ジ ロ ッ ク ・ テーブルの ク ラ ス タ ー ド ・ イ ン デ ッ ク ス では、 ハ ッ
シ ュ ベー ス の ス キ ャ ン方式は使用で き ま せん。 使用で き る 唯一の方式
は分割ス キ ャ ン です。 Adaptive Server では、 必要に応 じ て分割ス キ ャ
ン を 使用 し ま す。 デー タ オ ン リ ー ロ ッ ク ・ テーブルの場合、 通常 ク ラ
ス タ ー ド ・ イ ン デ ッ ク ス は、 ノ ン ク ラ ス タ ー ド ・ イ ン デ ッ ク ス と し て
動作す る 配置 イ ン デ ッ ク ス です。 全ペー ジ ロ ッ ク ・ テーブルの ノ ン ク
ラ ス タ ー ド ・ イ ン デ ッ ク ス に関す る すべて の説明は、 デー タ オ ン リ ー
ロ ッ ク ・ テーブル に も 適用 し ま す。
ローカル・インデッ
クス
Adaptive Server では、 ク ラ ス タ ー ド お よ び ノ ン ク ラ ス タ ー ド ・ ロ ー カ
ル ・ イ ン デ ッ ク ス がサポー ト さ れ ま す。
176
Adaptive Server Enterprise
第5章
分割されたテーブル
のクラスタード・イ
ンデックス
並列クエリ処理
ロ ー カ ル ・ ク ラ ス タ ー ド ・ イ ン デ ッ ク ス では、 複数の ス レ ッ ド が各
デー タ ・ パーテ ィ シ ョ ン を 並列に ス キ ャ ン す る こ と がで き ま す。 こ れ
に よ り 、 パ フ ォ ー マ ン ス が大き く 向上 し ま す。 こ の並列処理 を 利用す
る に は、 分割 ク ラ ス タ ー ド ・ イ ン デ ッ ク ス を 使用 し ま す。 ロ ー カ ル ・
イ ン デ ッ ク ス では、 デー タ は各パーテ ィ シ ョ ン内で別々に ソ ー ト さ れ
ま す。 各デー タ ・ パーテ ィ シ ョ ン の情報は、 パーテ ィ シ ョ ン作成時に
確立 さ れた境界 を 守 る の で、 テーブル全体でユニー ク な イ ン デ ッ ク
ス ・ キー を 強制す る こ と が可能に な り ま す。
ユニー ク な ク ラ ス タ ー ド ・ ロ ー カ ル ・ イ ン デ ッ ク ス に は次の制約が あ
り ま す。
分割されたテーブル
のノンクラスター
ド・インデックス
•
イ ン デ ッ ク ス ・ カ ラ ム に すべて の パーテ ィ シ ョ ン ・ カ ラ ム を 含め
る 必要が あ る 。
•
パーテ ィ シ ョ ン ・ カ ラ ム は、 イ ン デ ッ ク ス定義の パーテ ィ シ ョ
ン ・ キー と 同 じ 順序で あ る 必要が あ る 。
•
ユニー ク な ク ラ ス タ ー ド ・ ロ ー カ ル ・ イ ン デ ッ ク ス は、 複数の
パーテ ィ シ ョ ン の あ る ラ ウ ン ド ロ ビ ン ・ テーブル に含め る こ と は
で き な い。
Adaptive Server では、 分割 さ れた テーブル に お け る ロ ー カ ル ・ ノ ン ク
ラ ス タ ー ド ・ イ ン デ ッ ク ス がサポー ト さ れ ま す。
ただ し 、 ロ ー カ ル ・ イ ン デ ッ ク ス を 使用す る 場合、 わずか な違い が あ
り ま す。 ロ ー カ ル ・ ノ ン ク ラ ス タ ー ド ・ イ ン デ ッ ク ス の カ バー ド ・ イ
ン デ ッ ク ス ・ ス キ ャ ン を 実行す る 場合、 イ ン デ ッ ク ス ・ ペー ジ も 分割
さ れて い る た め、 Adaptive Server は並列ス キ ャ ン を 使用で き ま す。
違い を 示すた め、 次の例では ロ ー カ ル ・ ノ ン ク ラ ス タ ー ド ・ イ ン デ ッ
ク ス を 作成 し ま す。
create index RA2_NC2L on RA2(a3,a1,a2) local index
select a3 from RA2 where a3 > 300
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
調整プ ロ セ ス と 2 作業プ ロ セ ス に よ り 並列に実行 さ れ ま し た。
3 operator(s) under root
ク エ リ の タ イ プは SELECT です。
ROOT:EMIT Operator
|EXCHANGE Operator (Merged)
|Executed in parallel by 2 Producer and 1 Consumer
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
177
Adaptive Server の並列クエリ実行モデル
processes.
|
|
|EXCHANGE:EMIT Operator
|
|
|
|
|SCAN Operator
|
|
| FROM TABLE
|
|
| RA2
|
|
| イ ン デ ッ ク ス : RA2_NC2L
|
|
| 前方ス キ ャ ン
|
|
| キー に よ っ て位置付け ま す。
|
|
| イ ン デ ッ ク ス に は、 必要な カ ラ ム がすべて含ま れて
い ま す。 ベー ス ・ テーブルは読み込ま れ ま せん。
|
|
| Keys are:
|
|
|
a3 ASC
|
|
| 2 方向分割ス キ ャ ン に よ り 並列に実行 さ れ ま し た。
|
|
| イ ン デ ッ ク ス の リ ー フ ・ ペー ジ に対 し て I/O サ イ
ズ 2 キ ロ バ イ ト を使用 し て い ま す。
|
|
| イ ン デ ッ ク ス の リ ー フ ・ ペー ジ に対す る LRU で の
バ ッ フ ァ 置換方式
Adaptive Server では、 ロ ー カ ル ・ イ ン デ ッ ク ス に ハ ッ シ ュ ベ ー ス の ス
キ ャ ン を 使用す る こ と も あ り ま す。 それは、 異な る 並列度が必要な場
合や、 パーテ ィ シ ョ ン内のデー タ に偏 り が あ る た め に ハ ッ シ ュ ベ ー ス
の並列ス キ ャ ン を 優先す る 場合な ど です。
スカラ集合
Transact-SQL ス カ ラ 集合演算は、 逐次ま た は並列の ど ち ら で も 実行で
き ま す。
2 段階のスカラ集合
並列ス カ ラ 集合の場合、 集合演算は 2 つ の ス カ ラ 集合演算子 を 使用 し
て 2 段階で実行 さ れ ま す。 最初の段階では、 下位の ス カ ラ 集合演算子
がデー タ ・ ス ト リ ー ム の集約 を 実行 し ま す。 最初の段階の ス カ ラ 集合
の結果は、 多対 1 の exchange 演算子 を 使用 し て マ ー ジ さ れ、 こ の ス ト
リ ー ム が再度集約 さ れ ま す。
count(*) 集約の場合、 次の段階の集合演算に よ っ て ス カ ラ sum が実行
さ れ ま す。 こ れは、 次の例の showplan 出力で示 し て い ま す。
select count(*) from RA2
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
調整プ ロ セ ス と 2 作業プ ロ セ ス に よ り 並列に実行 さ れ ま し た。
178
Adaptive Server Enterprise
第5章
並列クエリ処理
5 operator(s) under root
ク エ リ の タ イ プは SELECT です。
ROOT:EMIT Operator
|SCALAR AGGREGATE Operator
| グループ化 さ れて い な い SUM OR AVERAGE AGGREGATE を評価
し ま す。
|
|
|EXCHANGE Operator (Merged)
|
|Executed in parallel by 2 Producer and 1
Consumer processes.
|
|
|
|
|EXCHANGE:EMIT Operator
|
|
|
|
|
|
|SCALAR AGGREGATE Operator
|
|
|
| グループ化 さ れて い な い COUNT AGGREGATE を
評価 し ま す。
|
|
|
|
|
|
|
|
|SCAN Operator
|
|
|
|
| FROM TABLE
|
|
|
|
| RA2
|
|
|
|
| テーブル ・ ス キ ャ ン です。
|
|
|
|
| 前方ス キ ャ ン
|
|
|
|
| テーブルの最初に位置付け ま す。
|
|
|
|
| 2 方向分割ス キ ャ ン に よ り 並列に実行 さ れ
ま し た。
|
|
|
|
| デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ
ロ バ イ ト を使用 し て い ま す。
|
|
|
|
| デー タ・ペー ジ に対す る LRU で の バ ッ フ ァ
置換方式
逐次集約処理
Adaptive Server では、 逐次集約処理 を 選択す る こ と も で き ま す。 集約
す る デー タ の量が少な い た め に パ フ ォ ー マ ン ス上の メ リ ッ ト が約束 さ
れな い場合、 手法 と し て逐次集約処理が優先 さ れ る 場合が あ り ま す。
逐次集約処理の場合、 ス キ ャ ン結果は多対 1 の exchange 演算子 を 使用
し て マ ー ジ さ れ ま す。 こ れは下の例で示 し て い ま す。 こ の例では、 ス
カ ラ 集合演算子に流れ る デー タ の量 を 最小限に と ど め る た め に選択的
な述部が追加 さ れて い ま す。 こ の よ う な場合、 並列で の集約処理は あ
ま り 意味が あ り ま せん。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
179
Adaptive Server の並列クエリ実行モデル
select count(*) from RA2 where a2 = 10
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
調整プ ロ セ ス と 2 作業プ ロ セ ス に よ り 並列に実行 さ れ ま し た。
4 operator(s) under root
ク エ リ の タ イ プは SELECT です。
ROOT:EMIT Operator
|SCALAR AGGREGATE Operator
| グループ化 さ れて い な い COUNT AGGREGATE を 評価 し ま す。
|
|
|EXCHANGE Operator (Merged)
|
|Executed in parallel by 2 Producer
and 1 Consumer processes.
|
|
|
|
|EXCHANGE:EMIT Operator
|
|
|
|
|
|
|SCAN Operator
|
|
|
| FROM TABLE
|
|
|
| RA2
|
|
|
| テーブル ・ ス キ ャ ン です。
|
|
|
| 前方ス キ ャ ン
|
|
|
| テーブルの最初に位置付け ま す。
| | | | 2 方向分割ス キ ャ ン に よ り 並列に実行 さ れ ま し た。
|
|
|
| デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ
バ イ ト を使用 し て い ま す。
|
|
|
| デー タ ・ ペー ジ に対す る LRU で の バ ッ フ ァ 置
換方式
union all
union all 演算子は、 同名の物理演算子 を 使用 し て実装 さ れ ま す。 union
all は比較的単純な演算で、 ク エ リ が大量のデー タ を 移動す る 場合は、
並列の みで使用す る 必要が あ り ま す。
並列の union all
並列の union all を 生成す る 唯一の条件は、 使用す る 分割方式に か か わ
ら ず、 各オ ペ ラ ン ド を 同 じ 並列度に す る こ と です。 次の例 ( テーブル
HA2 を 使用 ) は、 union all 演算子の並列処理 を 示 し て い ま す。 exchange
演算子が union all 演算子の上に位置す る こ と は、 それが複数の ス レ ッ
ド に よ っ て処理 さ れ る こ と を 意味 し ま す。
180
Adaptive Server Enterprise
第5章
並列クエリ処理
create table HA2(a1 int, a2 int, a3 int)
partition by hash(a1, a2) (p1, p2)
select * from RA2
union all
select * from HA2
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
調整プ ロ セ ス と 2 作業プ ロ セ ス に よ り 並列に実行 さ れ ま し た。
ク エ リ の タ イ プは SELECT です。
ROOT:EMIT Operator
|EXCHANGE Operator (Merged)
|Executed in parallel by 2 Producer and 1 Consumer
processes.
|
|
|EXCHANGE:EMIT Operator
|
|
|
|
|UNION ALL Operator has 2 children.
|
|
|
|
|
|
|SCAN Operator
|
|
|
| FROM TABLE
|
|
|
| RA2
|
|
|
| テーブル ・ ス キ ャ ン です。
. . . . . . . . . . . . . . . . . . .
| | | | 2 方向分割ス キ ャ ン に よ り 並列に実行 さ れ ま し た。
. . . . . . . . . . . . . . . . . . .
|
|
|
|
|
|
|SCAN Operator
|
|
|
| FROM TABLE
|
|
|
| HA2
|
|
|
| テーブル ・ ス キ ャ ン です。
. . . . . . . . . . . . . . . . . . .
| | | | 2 方向分割ス キ ャ ン に よ り 並列に実行 さ れ ま し た。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
181
Adaptive Server の並列クエリ実行モデル
逐次の union all
次の例では、 union 演算子の両側のデー タ は、 それぞれ ど ち ら か の側
に あ る 選択的な述部に よ っ て制約 さ れ ま す。 union all 演算子 を 介 し て送
信 さ れ る デー タ の量は少な い の で、 Adaptive Server では union を 並列
に実行 し な い こ と を 決定 し ま す。 代わ り に、 テーブル RA2 お よ び HA2
の各ス キ ャ ン は、 2 対 1 の exchange 演算子 を union の両側に配置 し て
編成 さ れ ま す。 結果の オ ペ ラ ン ド は、 union all 演算子に よ っ て並列処理
さ れ ま す。
select * from RA2
where a2 > 2400
union all
select * from HA2
where a3 in (10,20)
調整プ ロ セ ス と 4 作業プ ロ セ ス に よ り 並列に実行 さ れ ま し た。
7 operator(s) under root
ク エ リ の タ イ プは SELECT です。
ROOT:EMIT Operator
|UNION ALL Operator has 2 children.
|
|
|EXCHANGE Operator (Merged)
|
|Executed in parallel by 2 Producer and 1
Consumer processes.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
182
|
|
|
|
|
|
|
| |
|EXCHANGE:EMIT Operator
|
|
|SCAN Operator
|
| FROM TABLE
|
| RA2
|
| テーブル ・ ス キ ャ ン です。
| 2 方向分割ス キ ャ ン に よ り 並列に実行 さ れ ま し た。
|EXCHANGE Operator (Merged)
|Executed in parallel by 2 Producer and 1
Consumer processes.
|
|
|
|
|
|EXCHANGE:EMIT Operator
|
|
|SCAN Operator
|
| FROM TABLE
Adaptive Server Enterprise
第5章
|
|
|
並列クエリ処理
|
|
| HA2
|
|
| テーブル ・ ス キ ャ ン です。
| | | 2 方向分割ス キ ャ ン に よ り 並列に実行 さ れ ま し た。
属性に依存する演算の並列処理
属性に依存す る 演算に は、 ジ ョ イ ン、 ベ ク ト ル集合、 お よ び union が
あ り ま す。
ジョイン
2 つ の テーブルが並列に ジ ョ イ ン さ れて い る 場合、 Adaptive Server は、
結合す る デー タ の量、 お よ び各オ ペ ラ ン ド の分割方式に よ り 、 セ マ ン
テ ィ ク ス ベ ー ス の分割 を 使用 し て ジ ョ イ ン が よ り 効率的に実行 さ れ る
よ う に し ま す。 ジ ョ イ ン す る デー タ の量は少な い が、 各テ ー ブル に つ
い て ス キ ャ ン す る ペ ー ジ数は か な り 多い場合は、 Adaptive Server は両
側か ら の並列ス ト リ ー ム を それぞれ直列化す る の で、 ジ ョ イ ン は逐次
モ ー ド で実行 さ れ ま す。 こ の場合、 ク エ リ ・ オ プテ ィ マ イ ザは、 ジ ョ
イ ン 演算 を 並列 に 実行す る こ と が最適で は な い と 判断 し ま す。 通常、
ジ ョ イ ン 演算子 に使用 さ れ る オ ペ ラ ン ド の 1 つ ま た は両方が、 も う 1
つ の ジ ョ イ ン な ど の任意の中間演算子 ま た はグループ化演算子で あ る
可能性が あ り ま すが、 使用す る 例では ス キ ャ ン の み を オ ペ ラ ン ド と し
て示 し て い ま す。
2 つのテーブルが同
様に有効に分割され
ている場合
ジ ョ イ ン の各オ ペ ラ ン ド の分割は、 ジ ョ イ ン 述部に つ い て の み有効で
す。 2 つ の テーブルが同様に分割 さ れて お り 、 分割対象カ ラ ム が ジ ョ イ
ン 述部 の サ ブ セ ッ ト で あ る 場合、 そ れ ら の テ ー ブ ル は等価パ ー テ ィ
シ ョ ン さ れて い る と 言い ま す。 た と えば、RA2 と 同様に分割 さ れて い る
別の テーブル RB2 を 次の コ マ ン ド を 使用 し て作成す る 場合は、 次の よ
う に な り ま す。
create table RB2(b1 int, b2 int, b3 int)
partition by range(b1,b2)
(p1 values <= (500,100), p2 values <= (1000, 2000))
そ の後 RB2 と RA2 を ジ ョ イ ン し ま す。 ス キ ャ ン と ジ ョ イ ン は、 追加の
再分割な し で、 並列に実行で き ま す。 Adaptive Server は、 RA2 の最初の
パーテ ィ シ ョ ン を RB2 の最初の パーテ ィ シ ョ ン と ジ ョ イ ン し 、 続い て
RA2 の 2 番目 の パ ー テ ィ シ ョ ン を RB2 の 2 番目の パ ー テ ィ シ ョ ン と
ジ ョ イ ン し ま す。 こ れは等価パ ー テ ィ シ ョ ン ・ ジ ョ イ ン と 呼ばれ、 下
に示 し た よ う に 2 つ の テーブルが カ ラ ム a1, b1 と a2, b2 で ジ ョ イ ン す
る 場合に の み可能です。
select * from RA2, RB2
where a1 = b1 and a2 = b2 and a3 < 0
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
183
Adaptive Server の並列クエリ実行モデル
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
調整プ ロ セ ス と 2 作業プ ロ セ ス に よ り 並列に実行 さ れ ま し た。
7 operator(s) under root
ク エ リ の タ イ プは SELECT です。
ROOT:EMIT Operator
|EXCHANGE Operator (Merged)
|Executed in parallel by 2 Producer
and 1 Consumer processes.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
れ ま し た。
|
|
|
|
|
|
|
|
|
|
れ ま し た。
184
|EXCHANGE:EMIT Operator
|
|
|NESTED LOOP JOIN Operator
(Join Type: Inner Join)
|
|
|
|
|RESTRICT Operator
|
|
|
|
|
|
|SCAN Operator
|
|
|
| FROM TABLE
|
|
|
| RB2
|
|
|
| テーブル ・ ス キ ャ ン です。
|
|
|
| 前方ス キ ャ ン
|
|
|
| テーブルの最初に位置付け ま す。
|
|
|
| 2 方向分割ス キ ャ ン に よ り 並列に実行 さ
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|RESTRICT Operator
|
|
|SCAN Operator
|
| FROM TABLE
|
| RA2
|
| テーブル ・ ス キ ャ ン です。
|
| 前方ス キ ャ ン
|
| テーブルの最初に位置付け ま す。
|
| 2 方向分割ス キ ャ ン に よ り 並列に実行 さ
Adaptive Server Enterprise
第5章
並列クエリ処理
exchange 演算子は、 ネ ス ト ルー プ ・ ジ ョ イ ン の上 に示 さ れ ま す。 こ れ
は、 exchange が 2 つ の プ ロ デ ュ ーサ ・ ス レ ッ ド を 生成す る こ と を 意味
し ま す。 最初の ス レ ッ ド は RA2 と RB2 の最初の パ ー テ ィ シ ョ ン を ス
キ ャ ン し て ネ ス ト ループ ・ ジ ョ イ ン を 実行 し 、 2 番目の ス レ ッ ド は RA2
と RB2 の 2 番目の パーテ ィ シ ョ ン を ス キ ャ ン し て ネ ス ト ループ ・ ジ ョ
イ ン を 実行 し ま す。 2 つ の ス レ ッ ド は、 多対 1 ( こ の 場合 2 対 1) の
exchange 演算子 を 使用 し て結果 を マ ー ジ し ま す。
テーブルの 1 つが有
効に分割されている
場合
こ の例では、 テーブル RB2 は、 カ ラ ム b1 で alter table コ マ ン ド を 使用
し て 3 方向ハ ッ シ ュ 分割に再分割 さ れ ま す。
alter table RB2 partition by hash(b1) (p1, p2, p3)
こ こ で、 次の よ う に少 し 変更 し た ジ ョ イ ン ・ ク エ リ を 取 り 上げま す。
select * from RA2, RB2 where a1 = b1
分割 さ れた カ ラ ム が ジ ョ イ ン す る カ ラ ム のサブセ ッ ト では な い た め
( つ ま り 、結合す る 列 a1 の値 を 指定 し て も 、それが属す る パーテ ィ シ ョ
ン を 指定で き な い な い た め )、 テーブル RA2 の分割は実用的では あ り
ま せん。 ただ し 、 RB2 で分割す る と 、 RB2 の ジ ョ イ ン対象カ ラ ム b1 と
一致する の で 、 便利で す。 こ の 場合、 ク エリ ・ オ プティ マ イ ザは、 RB2
の 分割と 一致する よ う テー ブル RA2 を 再分割し ま す。 こ れは、 RA2 の
カ ラ ム a1 (3 方向の マ ー ジ ・ ジ ョ イ ン の 前に あ る ジ ョ イ ン 対象の カ ラ
ム ) で ハ ッ シ ュ 分割 を 使用 し て行い ま す。 RA2 の ス キ ャ ン の上に あ る 多
対多 (2 対 3) の exchange 演算子が こ の動的再分割 を 実行 し ま す。 マ ー
ジ ・ ジ ョ イ ン演算子の上に あ る exchange 演算子は、 多対 1 ( こ の場合
3 対 1) の exchange 演算子 を 使用 し て結果 を マ ー ジ し ま す。 こ の ク エ リ
の showplan 出力 を 次の例に示 し ま す。
select * from RA2, RB2 where a1 = b1
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
調整プ ロ セ ス と 5 作業プ ロ セ ス に よ り 並列に実行 さ れ ま し た。
10 operator(s) under root
ク エ リ の タ イ プは SELECT です。
ROOT:EMIT Operator
|EXCHANGE Operator (Merged)
|Executed in parallel by 3 Producer and 1 Consumer
processes.
|
|
|
|
|EXCHANGE:EMIT Operator
|
|
|MERGE JOIN Operator (Join Type: Inner
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
185
Adaptive Server の並列クエリ実行モデル
|
|
|
|
|
|
|
|
|
|
|
|
Join)
| 内部記憶領域 と し て Worktable3 を使用 し て い ま す。
| Key Count: 1
| Key Ordering: ASC
|
|
|SORT Operator
|
| 内部記憶領域 と し て Worktable1 を使用 し て い ま
|
|
|
|
|
|
|
|
|
す。
|
|
|
|EXCHANGE Operator (Repartitioned)
|Executed in parallel by 2 Producer
and 3 Consumer processes.
|
|
|
|
|
|
|
|
|
|
|EXCHANGE:EMIT Operator
|
|
|
|
|
|
|
|
|
|
|
|
|RESTRICT Operator
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|SCAN Operator
|
|
|
|
|
|
|
| FROM TABLE
|
|
|
|
|
|
|
| RA2
|
|
|
|
|
|
|
| テーブル ・ ス キ ャ ン です。
|
|
|
|
|
|
|
| 前方ス キ ャ ン
|
| |
| |
| |
| テーブルの最初に位置付け ま す。
|
|
|
|
|
|
|
| 2 方向分割ス キ ャ ン に よ り
並列に実行 さ れ ま し た。
|
|
|
|
|
|
|SORT Operator
|
|
|
| 内部記憶領域 と し て Worktable2 を使用 し て い ま
す。
|
|
|
|
|
|
|
|
|SCAN Operator
|
|
|
|
| FROM TABLE
|
|
|
|
| RB2
|
|
|
|
| テーブル ・ ス キ ャ ン です。
|
|
|
|
| 前方ス キ ャ ン
|
|
|
|
| テーブルの最初に位置付け ま す。
|
|
|
|
| 3 方向分割ス キ ャ ン に よ り 並列に実行 さ れ
ま し た。
186
Adaptive Server Enterprise
第5章
両方のテーブルの分
割が無効な場合
並列クエリ処理
次の例では、 両側の テーブルの ネ イ テ ィ ブ な分割が無効で あ る 場合に、
ジ ョ イ ン を 使用 し ま す。 テーブル RA2 の分割は、カ ラ ム (a1,a2) で行い、
テーブル RB2 の分割は、 カ ラ ム (b1) で行い ま す。 ジ ョ イ ン述部は、 異
な る カ ラ ム ・ セ ッ ト に あ り 、 両方の テーブル の分割は役に立 ち ま せん。
1 つ の オプ シ ョ ン と し て、 ジ ョ イ ン の両側 を 動的 に再分割す る こ と が
あ り ま す。 M 対 N (2 対 3) の exchange 演算子 を 使用 し てテーブル RA2
を 再分割す る こ と に よ り 、 Adaptive Server はテーブル RA2 の カ ラ ム a3
を 選択 し ま す。 こ れは、 こ の カ ラ ム がテーブル RB2 の ジ ョ イ ン に か か
わ っ て い る た め です。 ま っ た く 同 じ 理由で、 テーブル RB2 も カ ラ ム b3
で 3 方向に再分割 さ れ ま す。 ジ ョ イ ン の再分割 し た オペ ラ ン ド は、ジ ョ
イ ン 述部に関 し て等価パー テ ィ シ ョ ン さ れ ま す。 こ れは、 両側の対応
す る パ ー テ ィ シ ョ ン も ジ ョ イ ン す る こ と を 意味 し ま す。 通常、 ジ ョ イ
ン演算子の両側で再分割 を 実行す る 必要が あ る 場合、Adaptive Server は
ハ ッ シ ュ ベ ー ス の分割ス キー ム を 使用 し ま す。
select * from RA2, RB2 where a3 = b3
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
調整プ ロ セ ス と 8 作業プ ロ セ ス に よ り 並列に実行 さ れ ま し た。
12 operator(s) under root
ク エ リ の タ イ プは SELECT です。
ROOT:EMIT Operator
|EXCHANGE Operator (Merged)
|Executed in parallel by 3 Producer and 1 Consumer
processes.
|
|
|
|
|
|
|
|
|
|
ま す。
|
|EXCHANGE:EMIT Operator
|
|
|MERGE JOIN Operator
(Join Type: Inner Join)
|
| 内部記憶領域 と し て Worktable3 を使用 し て い ま す。
|
| Key Count: 1
|
| Key Ordering: ASC
|
|
|
|
|SORT Operator
|
|
| 内部記憶領域 と し て Worktable1 を使用 し て い
|
|
|
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
187
Adaptive Server の並列クエリ実行モデル
|
|
|
|
|
|
|
|
|EXCHANGE Operator (Repartitioned)
|Executed in parallel by 2
Producer and 3 Consumer
processes.
|
|
|
|
|
|
|
|
|
|
|EXCHANGE:EMIT Operator
|
|
|
|
|
|
|
|
|
|
|
|
|RESTRICT Operator
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|SCAN Operator
|
|
|
|
|
|
|
| FROM TABLE
|
|
|
|
|
|
|
| RA2
|
|
|
|
|
|
|
| テーブル ・ ス キ ャ ン です。
|
|
|
|
|
|
|
| 前方ス キ ャ ン
| | | | | | | | テーブルの最初に位置付け ま す。
|
|
|
|
|
|
|
| 2 方向分割ス キ ャ ン に よ
り 並列に実行 さ れ ま し た。
|
|
|
|
|
|
|SORT Operator
|
|
|
| 内部記憶領域 と し て Worktable2 を使用 し て い
ま す。
|
|
|
|
|
|
|
|
|EXCHANGE Operator (Repartitioned)
|
|
|
|
|Executed in parallel by 3
Producer and 3 Consumer
processes.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
に実行 さ れ ま し た。
|
|
|
|
|
|
|
|
|
|
|EXCHANGE:EMIT Operator
|
|
|SCAN Operator
|
| FROM TABLE
|
| RB2
|
| テーブル ・ ス キ ャ ン です。
|
| 前方ス キ ャ ン
|
| テーブルの最初に位置付け ま す。
|
| 3 方向分割ス キ ャ ン に よ り 並列
通常、 ネ ス ト ループ、 マ ー ジ、 お よ びハ ッ シ ュ ・ ジ ョ イ ン を 含むすべ
て の ジ ョ イ ン は、 同様に動作 し ま す。 ネ ス ト ループ ・ ジ ョ イ ン は、 ネ ス
ト ループ ・ ジ ョ イ ン の内側は再分割で き な い と い う 例外を 表示 し ま す。
こ の制限が発生す る の は、 ネ ス ト ループ ・ ジ ョ イ ン の場合に、 ジ ョ イ
ン対象の述部の カ ラ ム値が、 外側か ら 内側に プ ッ シ ュ さ れ る た めです。
188
Adaptive Server Enterprise
第5章
複写ジョイン
並列クエリ処理
複写ジ ョ イ ン は、 イ ン デ ッ ク ス ・ ネ ス ト ループ ・ ジ ョ イ ン を 使用す る
必要が あ る 場合 に役立 ち ま す。 大き な テ ーブルで、 ジ ョ イ ン 対象の カ
ラ ム に 有効な イ ン デ ッ ク ス が設定 さ れ て い る が、 分割は無効で あ り 、
分割 ま た は非分割の小 さ い テーブル に ジ ョ イ ン す る 場合 を 考え ま し ょ
う 。 小 さ い テーブルは、 内部テーブルの小 さ い テーブル に N 通 り の方
法で複写で き ま す。 こ の場合、 N は大き い テーブル の パー テ ィ シ ョ ン
の数です。 大き い テ ーブル の各パー テ ィ シ ョ ン は、 小 さ い テ ーブル と
ジ ョ イ ン さ れ ま す。 そ し て、 ジ ョ イ ン の内側では exchange 演算子が必
要な い た め、 イ ン デ ッ ク ス ・ ネ ス ト ループ ・ ジ ョ イ ン を 使用で き ま す。
create table big_table(b1 int, b2 int, b3 int)
partition by hash(b3) (p1, p2)
create index big_table_nc1 on big_table(b1)
create table small_table(s1 int, a2 int, s3 int)
select * from small_table, big_table
where small_table.s1 = big_table.b1
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
調整プ ロ セ ス と 3 作業プ ロ セ ス に よ り 並列に実行 さ れ ま し た。
7 operator(s) under root
ク エ リ の タ イ プは SELECT です。
ROOT:EMIT Operator
|EXCHANGE Operator (Merged)
|Executed in parallel by 2 Producer and 1
Consumer processes.
|
|
|
|
|
|
|
|
|
|
|
|EXCHANGE:EMIT Operator
|
|
|NESTED LOOP JOIN Operator (Join Type:
Inner Join)
|
|
|
|
|EXCHANGE Operator (Replicated)
|
|
|Executed in parallel by 1 Producer
and 2 Consumer processes.
|
|
|
|
|
|
|
|
|
|
|
|
|EXCHANGE:EMIT Operator
|
|
|SCAN Operator
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
189
Adaptive Server の並列クエリ実行モデル
|
|
|
|
|
|
|
|
|
|
|
|
|
ま し た。
並列再フォーマット
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
FROM TABLE
small_table
テーブル ・ ス キ ャ ン です。
|SCAN Operator
| FROM TABLE
| big_table
| イ ン デ ッ ク ス : big_table_nc1
| 前方ス キ ャ ン
| キー に よ っ て位置付け ま す。
| Keys are:
|
b1 ASC
| 2 方向ハ ッ シ ュ ・ ス キ ャ ン に よ り 並列に実行 さ れ
並列再 フ ォ ー マ ッ ト は、 特に ネ ス ト ループ ・ ジ ョ イ ン で作業 し て い る
場合 に 役立 ち ま す。 通常、 再 フ ォ ー マ ッ ト と は ネ ス ト し た ジ ョ イ ン の
内側 を ワ ー ク ・テーブル に実体化 し て、 ジ ョ イ ン 対象の述部に イ ン デ ッ
ク ス を 作成す る こ と を 指 し ま す。 並列 ク エ リ お よ び ネ ス ト ル ー プ ・
ジ ョ イ ン では、 ジ ョ イ ン 対象の カ ラ ム に有効な イ ン デ ッ ク ス がな い場
合や、 サーバ/セ ッ シ ョ ン/ ク エ リ ・ レ ベルの設定の た め に ネ ス ト ルー
プ ・ ジ ョ イ ン が ク エ リ の 唯一 の 有効 な オ プ シ ョ ン で あ る 場合 に も 再
フ ォ ー マ ッ ト が役立 ち ま す。 こ れは Adaptive Server の重要な オプ シ ョ
ン です。 外側 に は有効な パ ー テ ィ シ ョ ン が あ る 可能性が あ り 、 な い場
合は再分割 し 有効な パ ー テ ィ シ ョ ン を 作成で き ま す。 し か し 、 ネ ス ト
ループ ・ ジ ョ イ ン の内側に つ い て は、 再分割は、 新 し い分割方式 を 使
用す る ワ ー ク ・ テ ーブル に テ ーブル を 再 フ ォ ー マ ッ ト す る 必要が あ る
こ と を 意味 し ま す。 ネ ス ト ループ ・ ジ ョ イ ン の内部ス キ ャ ン は、 そ の
後 ワ ー ク ・ テーブル に ア ク セ ス す る 必要が あ り ま す。
次の例では、 テーブル RA2 と RB2 の分割は、 それぞれ カ ラ ム (a1, a2)
と (b1, b2) で行われ ま す。 ク エ リ は、 そ の セ ッ シ ョ ン に つ き マ ー ジ お よ
びハ ッ シ ュ ・ ジ ョ イ ン を オ フ に し て実行 し ま す。
select * from RA2, RB2 where a1 = b1 and a2 = b3
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
調整プ ロ セ ス と 12 作業プ ロ セ ス に よ り 並列に実行 さ れ ま し た。
17 operator(s) under root
ク エ リ の タ イ プは SELECT です。
ROOT:EMIT Operator
|SEQUENCER Operator has 2 children.
|
190
Adaptive Server Enterprise
第5章
並列クエリ処理
|
|EXCHANGE Operator (Merged)
|
|4 プ ロ デ ュ ーサ ・ プ ロ セ ス と 1 コ ン シ ュ ー マ ・ プ ロ セ ス に
よ り 並列に実行 さ れ ま し た。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|EXCHANGE:EMIT Operator
|
|
|STORE Operator
|
| Worktable1 created, in allpages
locking mode, for REFORMATTING.
|
|
|
| ク ラ ス タ ー ド ・ イ ン デ ッ ク ス を使用 し て い ま す。
|
|
|
|
|
|
|
|
|INSERT Operator
|
|
|
|
| 直接更新モ ー ド です。
|
|
|
|
|
|
|
|
|
|
|EXCHANGE Operator
(Repartitioned)
|
|
|
|
|
|Executed in parallel by
2 Producer and 4
Consumer processes.
|
|
|
|
|
|
|
|
|
|
|
|
|EXCHANGE:EMIT Operator
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|RESTRICT Operator
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|SCAN Operator
|
|
|
|
|
|
|
|
| FROM TABLE
|
|
|
|
|
|
|
|
| RB2
|
|
|
|
|
|
|
|
| テーブル・ス キ ャ ン です。
|
|
|
|
|
|
|
|
| 2 方向分割ス キ ャ ン
に よ り 並列に実行 さ れ ま し た。
|
|
|
|
|
|
|
|
|
| TO TABLE
|
|
|
|
| ワ ー ク ・ テーブル 1
|
|
|EXCHANGE Operator (Merged)
|
|4 プ ロ デ ュ ーサ ・ プ ロ セ ス と 1 コ ン シ ュ ー マ ・ プ ロ セ ス に
よ り 並列に実行 さ れ ま し た。
|EXCHANGE:EMIT Operator
|
|
|NESTED LOOP JOIN Operator
(Join Type: Inner Join)
|
|
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
191
Adaptive Server の並列クエリ実行モデル
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
り 並列に実行 さ れ ま し た。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ま す。
|
|
|
|
|
|
|
|
|EXCHANGE Operator (Repartitioned)
|Executed in parallel by 2
Producer and 4 Consumer
processes.
|
|
|EXCHANGE:EMIT Operator
|
|
|
|
|RESTRICT Operator
|
|
|
|
|
|
|SCAN Operator
|
|
|
| FROM TABLE
|
|
|
| RA2
|
|
|
| テーブル ・ ス キ ャ ン です。
|
|
|
| 2 方向分割ス キ ャ ン に よ
|SCAN Operator
| FROM TABLE
| ワ ー ク ・ テーブル 1
| ク ラ ス タ ー ド ・ イ ン デ ッ ク ス を使用 し て い
|
|
前方ス キ ャ ン
キー に よ っ て位置付け ま す。
逐次演算子は、 最後の子演算子 を 除 く すべて の子演算子 を 先に実行 し
ま す。 こ の場合、 逐次演算子は最初の子演算子 を 実行 し ま す。 こ れ に
よ り 、 カ ラ ム b1 と b3 で 4 方向ハ ッ シ ュ 分割 を 使用 し てテーブル RB2
が ワ ー ク ・ テーブル に再 フ ォ ー マ ッ ト さ れ ま す。 さ ら に、 テーブル RA2
は、 保存 さ れた ワ ー ク ・ テーブルの分割 と 一致す る よ う に 4 方向に再
分割 さ れ ま す。
逐次ジョイン
ジ ョ イ ン が必要なデー タ の量に よ っ ては、 ジ ョ イ ン を 並列で実行す る
の は不合理で あ る こ と も あ り ま す。 前の ジ ョ イ ン ・ ク エ リ と 似た ク エ
リ を 実行す る が、 各テーブル (RA2 と RB2) に述部が あ り 、 ジ ョ イ ン す
る デー タ の量が十分では な い場合、 ジ ョ イ ン は逐次モ ー ド で実行 さ れ
る こ と が あ り ま す。 こ の よ う な場合は、 テーブル の分割方法は問題に
な り ま せん。 ク エ リ は、 テーブルの並列の ス キ ャ ン の メ リ ッ ト を 利用
で き ま す。
select * from RA2, RB2 where a1=b1 and a2 = b2
and a3 = 0 and b2 = 20
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
調整プ ロ セ ス と 4 作業プ ロ セ ス に よ り 並列に実行 さ れ ま し た。
11 operator(s) under root
192
Adaptive Server Enterprise
第5章
並列クエリ処理
ク エ リ の タ イ プは SELECT です。
ROOT:EMIT Operator
|MERGE JOIN Operator (Join Type: Inner Join)
| 内部記憶領域 と し て Worktable3 を 使用 し て い ま す。
| Key Count: 1
| Key Ordering: ASC
|
|
|SORT Operator
|
| 内部記憶領域 と し て Worktable1 を使用 し て い ま す。
|
|
|
|
|EXCHANGE Operator (Merged)
|
|
|Executed in parallel by 2 Producer and
1 Consumer processes.
|
|
|
|
|
|
|EXCHANGE:EMIT Operator
|
|
|
|
|
|
|
|
|RESTRICT Operator
|
|
|
|
|
|
|
|
|
|
|SCAN Operator
|
|
|
|
|
| FROM TABLE
|
|
|
|
|
| RA2
|
|
|
|
|
| テーブル ・ ス キ ャ ン です。
|
|
|
|
|
| 2 方向分割ス キ ャ ン に よ り 並列に実
行 さ れ ま し た。
|
|SORT Operator
|
| 内部記憶領域 と し て Worktable2 を使用 し て い ま す。
|
|
|
|
|EXCHANGE Operator (Merged)
|
|
|Executed in parallel by 2 Producer and
1 Consumer processes.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
行 さ れ ま し た。
|
|
|
|
|
|
|
|
|
|
|EXCHANGE:EMIT Operator
|
|
|RESTRICT Operator
|
|
|
|
|SCAN Operator
|
|
| FROM TABLE
|
|
| RB2
|
|
| テーブル ・ ス キ ャ ン です。
|
|
| 2 方向分割ス キ ャ ン に よ り 並列に実
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
193
Adaptive Server の並列クエリ実行モデル
セミジョイン
in/exist サブ ク エ リ の フ ラ ッ ト 化に よ っ て生成 さ れ る セ ミ ジ ョ イ ン は、
通常の内部ジ ョ イ ン と 同様に動作 し ま す。 ただ し 、 そ の よ う な状況で
は、 外部 ロ ーが複数回一致す る 場合が あ る の で、 セ ミ ジ ョ イ ン に は複
写ジ ョ イ ン を 使用 し ま せん。
外部ジョイン
外部ジ ョ イ ン の並列処理では、 複写ジ ョ イ ン は考慮外です。 そ の他す
べては通常の内部ジ ョ イ ン と 同様に動作 し ま す。 も う 1 つ の相違点は、
外部グループ に属す る 外部ジ ョ イ ン の テーブルでは、 パーテ ィ シ ョ ン
排除は行われな い こ と です。
ベクトル集合
ベ ク ト ル集合は、 group-by を 使用 し た ク エ リ の こ と です。 Adaptive
Server でベ ク ト ル集合 を 実行す る 方法は複数あ り ま す。 実際の ア ルゴ
リ ズ ム は こ こ では説明せず、 次の項で並列評価の手法に つ い て の み示
し ま す。
内分割ベクトル集合
基本ま た は中間の関係は、 グループ化 を 必要 と し 、 サブセ ッ ト 、 ま た
は group by 句の カ ラ ム と 同 じ カ ラ ム で分割 さ れ、 グループ化演算は各
パーテ ィ シ ョ ン で並列に実行で き、 そ の結果グループ化 さ れた ス ト
リ ー ム は、 単純な N 対 1 の交換 を 使用 し て マ ー ジ さ れ ま す。 こ れは、
グループは複数の ス ト リ ー ム に含め る こ と がで き な い た め です。 グ
ループ化カ ラ ム ま た はそれ ら の サブセ ッ ト に セ マ ン テ ィ ク ス ベー ス の
分割 を 使用す る 限 り 、 こ れ と 同 じ 制約が SQL ク エ リ の グループ化に
も 適用 さ れ ま す。 こ の並列ベ ク ト ル集合の方法は、 内分割集約処理 と
呼ばれ ま す。
次の ク エ リ では、 範囲分割が カ ラ ム a1 お よ び a2 で定義 さ れて い る た
め、 内分割ベ ク ト ル集合 を 使用 し て い ま す。 こ こ では、 こ れ ら の カ ラ
ム は、 集約処理 も 必要 と し て い ま す。
select count(*), a1, a2 from RA2 group by a1,a2
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
調整プ ロ セ ス と 2 作業プ ロ セ ス に よ り 並列に実行 さ れ ま し た。
4 operator(s) under root
ク エ リ の タ イ プは SELECT です。
ROOT:EMIT Operator
|EXCHANGE Operator (Merged)
|Executed in parallel by 2 Producer and
1 Consumer processes.
194
Adaptive Server Enterprise
第5章
並列クエリ処理
|
|
|EXCHANGE:EMIT Operator
|
|
|
|
|HASH VECTOR AGGREGATE Operator
|
|
| GROUP BY
|
|
| グループ化 さ れた COUNT AGGREGATE を評価 し ま す。
|
|
| 内部記憶領域 と し て Worktable1 を使用 し て い ま す。
|
|
|
|
|
|
|SCAN Operator
|
|
|
| FROM TABLE
|
|
|
| RA2
|
|
|
| テーブル ・ ス キ ャ ン です。
|
|
|
| 前方ス キ ャ ン
|
|
|
| テーブルの最初に位置付け ま す。
| | | | 2 方向分割ス キ ャ ン に よ り 並列に実行 さ れ ま し た。
|
|
|
| デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ
バ イ ト を使用 し て い ま す。
|
|
|
| デー タ ・ ペー ジ に対す る LRU で のバ ッ フ ァ 置
換方式
再分割したベクトル
集合
テーブルの分割ま た は中間結果がグループ化演算に役立た な い場合が
あ り ま す。 グループ化カ ラ ム に一致す る よ う に ソ ー ス ・ デー タ を 再分
割 し て、 並列ベ ク ト ル集合 を 適用す る こ と に よ り 、 グループ化演算 を
並列に実行す る 価値が あ る 場合 も あ り ま す。 次に そ の よ う な シ ナ リ オ
を 示 し ま す。 こ の シ ナ リ オでは、 カ ラ ム (a1, a2) で分割が実行 さ れ る
が、 ク エ リ では カ ラ ム a1 でベ ク ト ル集合 を 実行す る こ と が必要です。
select count(*), a1 from RA2 group by a1
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
調整プ ロ セ ス と 4 作業プ ロ セ ス に よ り 並列に実行 さ れ ま し た。
6 operator(s) under root
ク エ リ の タ イ プは SELECT です。
ROOT:EMIT Operator
|EXCHANGE Operator (Merged)
|Executed in parallel by 2 Producer and 1 Consumer
processes.
|
|
|
|
|EXCHANGE:EMIT Operator
|
|
|HASH VECTOR AGGREGATE Operator
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
195
Adaptive Server の並列クエリ実行モデル
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
行 さ れ ま し た。
2 段階のベクトル
集合
| GROUP BY
| グループ化 さ れた COUNT AGGREGATE を評価 し ま す。
| 内部記憶領域 と し て Worktable1 を使用 し て い ま す。
|
|
|EXCHANGE Operator (Repartitioned)
|
|Executed in parallel by 2 Producer
and 2 Consumer processes.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|EXCHANGE:EMIT Operator
|
|
|SCAN Operator
|
| FROM TABLE
|
| RA2
|
| テーブル ・ ス キ ャ ン です。
|
| 前方ス キ ャ ン
|
| テーブルの最初に位置付け ま す。
|
| 2 方向分割ス キ ャ ン に よ り 並列に実
前の例の ク エ リ では、 再分割に長時間か か る 可能性が あ り ま す。 も う
1 つ考え ら れ る 方法は、 最初の レ ベルの グループ化 を 実行 し 、 N 対 1
の exchange 演算子 を 使用 し てデー タ を マ ー ジ し て か ら 、 次の レ ベル の
グループ化 を 実行す る 方法です。 こ れは、 「2 段階の ベ ク ト ル集合」 と
呼ばれ ま す。 グループ化カ ラ ム の重複数に よ り 、 Adaptive Server は、
N 対 1 の交換 を 使用 し てデー タ ・ ス ト リ ー ミ ン グ の カ ーデ ィ ナ リ テ ィ
を 減 ら し ま す。 こ れ に よ り 、 2 番目の レ ベルの グループ化の コ ス ト が
削減 さ れ ま す。
select count(*), a1 from RA2 group by a1
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
調整プ ロ セ ス と 2 作業プ ロ セ ス に よ り 並列に実行 さ れ ま し た。
5 operator(s) under root
ク エ リ の タ イ プは SELECT です。
ROOT:EMIT Operator
|HASH VECTOR AGGREGATE Operator
| GROUP BY
| Evaluate Grouped SUM OR AVERAGE AGGREGATE.
| 内部記憶領域 と し て Worktable2 を使用 し て い ま す。
|
|
|EXCHANGE Operator (Merged)
196
Adaptive Server Enterprise
第5章
|
|
|
|
|
|
|
し ま す。
|
ま す。
|
|
|
|
|
|
ま し た。
逐次ベクトル集合
並列クエリ処理
|Executed in parallel by 2 Producer and
1 Consumer processes.
|
|
|EXCHANGE:EMIT Operator
|
|
|
|
|HASH VECTOR AGGREGATE Operator
|
|
| GROUP BY
|
|
| グループ化 さ れた COUNT AGGREGATE を評価
|
|
| 内部記憶領域 と し て Worktable1 を使用 し て い
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|SCAN Operator
| FROM TABLE
| RA2
| テーブル ・ ス キ ャ ン です。
| 2 方向分割ス キ ャ ン に よ り 並列に実行 さ れ
前の一部の例 と 同様に、 述部 を 使用す る こ と に よ り グループ化演算子
へ のデー タ の フ ロ ー の量が制限 さ れて い る 場合、 そ の ク エ リ を 並列に
実行す る こ と が 合理的 で は な い こ と が あ り ま す。 そ の よ う な 場合、
パーテ ィ シ ョ ン は並列に ス キ ャ ン さ れ、 N 対 1 の exchange 演算子 を 使
用 し て、 逐次ベ ク ト ル集合に よ る ス ト リ ー ム の フ ロ ー を 逐次化 し ま す。
select count(*), a1, a2 from RA2
where a1 between 100 and 200
group by a1, a2
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
調整プ ロ セ ス と 2 作業プ ロ セ ス に よ り 並列に実行 さ れ ま し た。
4 operator(s) under root
ク エ リ の タ イ プは SELECT です。
ROOT:EMIT Operator
|HASH VECTOR AGGREGATE Operator
| GROUP BY
| グループ化 さ れた COUNT AGGREGATE を評価 し ま す。
| 内部記憶領域 と し て Worktable1 を使用 し て い ま す。
|
|
|EXCHANGE Operator (Merged)
|
|Executed in parallel by 2 Producer and 1
Consumer processes.
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
197
Adaptive Server の並列クエリ実行モデル
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|EXCHANGE:EMIT Operator
|
|
|SCAN Operator
|
| FROM TABLE
|
| RA2
|
| テーブルの最初に位置付け ま す。
|
| 2 方向分割ス キ ャ ン に よ り 並列に実行 さ れ ま し た。
必ず し も 分割対象カ ラ ム を グループ化 し た り 、 既に グループ化カ ラ ム
で分割 さ れて い る テーブル を 利用 し た り す る こ と はで き ま せん。 ク エ
リ ・ オプテ ィ マ イ ザは、 再分割 し てグループ化 を 並列に実行す る か、
分割 さ れた テーブル にデー タ ・ ス ト リ ー ム を マ ー ジ し て、 逐次ま た は
2 段階の集約処理でグループ化 を 実行す る か、 ど ち ら の方が効果的か
を 判断 し ま す。
distinct
distinct 演算 を 使用 し た ク エ リ は、 集合部分の な い グループ化ベ ク ト ル
集合 と 同 じ です。 次に例 を 示 し ま す。
select count(*), a1, a2 from RA2
こ れは、 次の ク エ リ と 同 じ です。
select a1, a2 from RA2 group by a1, a2
ベ ク ト ル集合に適用で き る すべて の方法は こ こ で も 適用で き ま す。
in リストのある
クエリ
Adaptive Server では、 in リ ス ト の処理に最適化 し た手法 を 使用 し ま す。
こ れは一般的な SQL 構成体です。 例 :
col in (value1, value2,..valuek)
こ れは、 次の ク エ リ と 同 じ です。
col = value1 OR col = value2 OR .... col = valuek
in リ ス ト の値は、 特別な in メ モ リ ・ テーブル に保存 さ れ、 重複 を 削除
す る た め に ソ ー ト さ れ ま す。 そ の後、 こ の テーブルは イ ン デ ッ ク ス ・
ネ ス ト ループ ・ ジ ョ イ ン を 使用 し てベ ー ス ・ テーブル に ジ ョ イ ン さ れ
ま す。 次の例は、 or リ ス ト の 2 つ の値に対応す る in リ ス ト の 2 つ の値
を 使用 し て こ れ を 説明 し て い ま す。
SCAN Operator
FROM OR List
OR List has up to 2 rows of OR/IN values.
select * from RA2 where a3 in (1425, 2940)
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
調整プ ロ セ ス と 2 作業プ ロ セ ス に よ り 並列に実行 さ れ ま し た。
198
Adaptive Server Enterprise
第5章
並列クエリ処理
6 operator(s) under root
ク エ リ の タ イ プは SELECT です。
ROOT:EMIT Operator
|EXCHANGE Operator (Merged)
|Executed in parallel by 2 Producer and 1
Consumer processes.
|
|
|
|
|EXCHANGE:EMIT Operator
|
|
|NESTED LOOP JOIN Operator (Join Type:
Inner Join)
|
|
|
|
|
|
|SCAN Operator
|
|
|
| FROM OR List
|
|
|
| OR List has up to 2 rows of OR/IN
values.
|
|
|
|
|
|
|RESTRICT Operator
|
|
|
|
|
|
|
|
|SCAN Operator
|
|
|
|
| FROM TABLE
|
|
|
|
| RA2
|
|
|
|
| イ ン デ ッ ク ス : RA2_NC1
|
|
|
|
| 前方ス キ ャ ン
|
|
|
|
| キー に よ っ て位置付け ま す。
|
|
|
|
| Keys are:
|
|
|
|
|
a3 ASC
|
|
|
|
| 2 方向ハ ッ シ ュ ・ ス キ ャ ン に よ り 並列に実行
さ れ ま し た。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
199
Adaptive Server の並列クエリ実行モデル
or 句を含むクエリ
Adaptive Server では、 or 句の よ う な離接述部 を 、 離接語の前後に別々
に適用 し 、 一連の ロ ー ID (RID) を 修飾 し ま す。 離接語の前後の接続述
部は、 イ ン デ ッ ク ス可能で あ る 必要が あ り ま す。 さ ら に離接語の前後
に あ る 接続述部内に は、 追加の離接語 を 含め る こ と はで き ま せん。
つ ま り 、 離接句 と 接続句の深い ネ ス ト を 任意に使用 し て も 、 ほ と ん ど
意味が あ り ま せん。 次の例では、 離接述部は同 じ カ ラ ム に含ま れ ま す
が ( 時間の か か ら な い ス キ ャ ン を 実行で き る イ ン デ ッ ク ス が あ る 限
り 、 述部は異な る カ ラ ム に含め る こ と がで き ま す )、 述部は重複 し た
一連のデー タ ・ ロ ー を 修飾す る 可能性が あ り ま す。 Adaptive Server は、
離接語の前後に述部 を 別々に使用 し て、 一連の ロ ー ID を 修飾 し ま す。
そ の後 こ れ ら の ロ ー ID に は、 重複削除が適用 さ れ ま す。
select a3 from RA2 where a3 = 2955 or a3 > 2990
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
調整プ ロ セ ス と 2 作業プ ロ セ ス に よ り 並列に実行 さ れ ま し た。
8 operator(s) under root
ク エ リ の タ イ プは SELECT です。
ROOT:EMIT Operator
|EXCHANGE Operator (Merged)
|Executed in parallel by 2 Producer and 1
Consumer processes.
|
|
|EXCHANGE:EMIT Operator
|
|
|
|
|RID JOIN Operator
|
|
| 内部記憶領域 と し て Worktable2 を 使用 し て い ま す。
|
|
|
|
|
|
|HASH UNION Operator has 2 children.
| | | | 内部記憶領域 と し て Worktable1 を使用 し て い ま す。
|
|
|
|
|
|
|
|
|SCAN Operator
|
|
|
|
| FROM TABLE
|
|
|
|
| RA2
|
|
|
|
| イ ン デ ッ ク ス : RA2_NC1
|
|
|
|
| 前方ス キ ャ ン
|
|
|
|
| キー に よ っ て位置付け ま す。
|
|
|
|
| イ ン デ ッ ク ス に は、 必要な カ ラ ム がすべて含ま
れて い ま す。 ベー ス ・ テーブルは読み込ま れ ま せん。
|
|
|
|
| Keys are:
|
|
|
|
|
a3 ASC
200
Adaptive Server Enterprise
第5章
並列クエリ処理
|
|
|
|
| 2 方向ハ ッ シ ュ ・ ス キ ャ ン に よ り 並列に実行
さ れ ま し た。
|
|
|
|
|
|
|
|
|SCAN Operator
|
|
|
|
| FROM TABLE
|
|
|
|
| RA2
|
|
|
|
| イ ン デ ッ ク ス : RA2_NC1
|
|
|
|
| 前方ス キ ャ ン
|
|
|
|
| キー に よ っ て位置付け ま す。
|
|
|
|
| イ ン デ ッ ク ス に は、 必要な カ ラ ム がすべて含ま
れて い ま す。 ベー ス ・ テーブルは読み込ま れ ま せん。
|
|
|
|
| Keys are:
|
|
|
|
|
a3 ASC
|
|
|
|
| 2 方向ハ ッ シ ュ ・ ス キ ャ ン に よ り 並列に実行
さ れ ま し た。
|
|
|
|RESTRICT Operator
|
|
|
|
|
|
|
|
|SCAN Operator
|
|
|
|
| FROM TABLE
|
|
|
|
| RA2
|
|
|
|
| 動的 イ ン デ ッ ク ス を使用 し て い ま す。
|
|
|
|
| 前方ス キ ャ ン
|
|
|
|
| ロ ー識別子 (RID) に よ っ て位置付け ま す。
|
|
|
|
| デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ
ロ バ イ ト を使用 し て い ま す。
|
|
|
|
| デー タ ・ ペー ジ に対す る LRU で の バ ッ フ ァ
置換方式
カ ラ ム a3 で定義 さ れた イ ン デ ッ ク ス RA2_NC1 を 使用 し て 2 つ の別々
の イ ン デ ッ ク ス ・ ス キ ャ ン が実行 さ れ ま す。 そ の後、 条件 を 満たす一
連の ロ ー ID で重複 し た ロ ー ID がチ ェ ッ ク さ れ、 最後に ベー ス ・ テー
ブル に ジ ョ イ ン さ れ ま す。 Positioning by Row Identifier (RID)
と い う 行に注目 し て く だ さ い。 述部が イ ン デ ッ ク ス可能で あ る 限 り 、
そ の内容に よ り 、 離接語の前ま た は後に異な る イ ン デ ッ ク ス を 使用で
き ま す。 こ れ を 簡単に識別す る 方法の 1 つ は、 離接語の前後でそれぞ
れ別々に ク エ リ を 実行 し 、 述部が イ ン デ ッ ク ス可能で あ る こ と を 確認
す る こ と です。 Adaptive Server は、 テーブルの単一ス キ ャ ン よ り も コ
ス ト がか か り そ う な場合は、 イ ン デ ッ ク ス の積 を 選択 し な い こ と が あ
り ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
201
Adaptive Server の並列クエリ実行モデル
order by 句を含むク
エリ
order by 句が あ る た め に、 ク エ リ で ソ ー ト さ れた出力が必要な場合、
Adaptive Server は sort を 並列に適用で き ま す。 まず、 固有の順序 を 使用
で き る 場合に は、 Adaptive Server は ソ ー ト を 避け る こ と を 試み ま す。
ソ ー ト が強制 さ れ る 場合、 Adaptive Server は ソ ー ト を 並列で実行で き
る か ど う か を 確認 し ま す。 そ の た め に は、 Adaptive Server は既存の
デー タ ・ ス ト リ ー ム を 再分割す る か、 既存の分割ス キー ム を 使用 し 、
そ の後構成ス ト リ ー ム の それぞれ に ソ ー ト を 適用で き ま す。 ソ ー ト 適
用後のデー タ は N 対 1 の順序 を 使用 し て マ ー ジ さ れ、 exchange 演算子
が保持 さ れ ま す。
select * from RA2 order by a1, a2
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
調整プ ロ セ ス と 2 作業プ ロ セ ス に よ り 並列に実行 さ れ ま し た。
4 operator(s) under root
ク エ リ の タ イ プは SELECT です。
ROOT:EMIT Operator
|EXCHANGE Operator (Merged)
|Executed in parallel by 2 Producer and
1 Consumer processes.
|
|
|
|
|
|
|
|
|
|
|
|
|
|EXCHANGE:EMIT Operator
|
|
|SORT Operator
|
| 内部記憶領域 と し て Worktable1 を使用 し て い ま す。
|
|
|
|
|SCAN Operator
|
|
| FROM TABLE
|
|
| RA2
|
|
| イ ン デ ッ ク ス : RA2_NC2L
|
|
| 前方ス キ ャ ン
|
|
| テーブルの最初に位置付け ま す。
|
|
| 2 方向分割ス キ ャ ン に よ り 並列に実行 さ れ ま し た。
ソ ー ト す る デー タ の量お よ び使用可能な リ ソ ー ス に基づ き、 Adaptive
Server は、 現在の ス ト リ ー ム よ り も 度数 ( パーテ ィ シ ョ ン の数 ) が多
く な る よ う にデー タ ・ ス ト リ ー ム を 再分割 し て、 sort 演算が加速 さ れ
る よ う に で き ま す。 ソ ー ト の度合い は、 sort を 並列に行 う こ と に よ る
メ リ ッ ト が再分割の オ ーバー ヘ ッ ド に は る か に勝 っ て い る か ど う か に
よ り ま す。
202
Adaptive Server Enterprise
第5章
並列クエリ処理
サブクエリ
Adaptive Server で は、 サブ ク エ リ の処理の コ ス ト 削減 に 異な る 方法 を
使用 し ま す。 並列最適化は、 サブ ク エ リ の タ イ プ に よ っ て異な り ま す。
•
実体化 さ れたサブ ク エ リ - 並列 ク エ リ ・ メ ソ ッ ド は、 マ テ リ ア
ラ イ ズ の手順に は考慮 さ れ ま せん。
•
フ ラ ッ ト 化 さ れたサブ ク エ リ - 並列 ク エ リ 最適化は、 サブ ク エ
リ が通常の内部ジ ョ イ ン ま た は セ ミ ジ ョ イ ン に フ ラ ッ ト 化 さ れ る
場合に だけ考慮 さ れ ま す。
•
ネ ス ト さ れたサブ ク エ リ - 並列演算は、 サブ ク エ リ を 含む ク エ
リ の最 も 外側に あ る ク エ リ ・ ブ ロ ッ ク に対 し てだけ考慮 さ れ、
内部に あ る ネ ス ト さ れた ク エ リ は、 常に逐次で実行 さ れ ま す。 こ
れは、 ネ ス ト さ れたサブ ク エ リ 内の すべて の テーブルは逐次ア ク
セ ス さ れ る こ と を 意味 し ま す。 次の例では、 テーブル RA2 は並列
に ア ク セ ス さ れ ま すが、 そ の結果は、 サブ ク エ リ に ア ク セ ス す る
前に 2 対 1 の exchange 演算子 を 使用 し て直列化 さ れ ま す。 サブ ク
エ リ 内の テーブル RB2 は、 並列に ア ク セ ス さ れ ま す。
select count(*) from RA2 where not exists
(select * from RB2 where RA2.a1 = b1)
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
調整プ ロ セ ス と 2 作業プ ロ セ ス に よ り 並列に実行 さ れ ま し た。
8 operator(s) under root
ク エ リ の タ イ プは SELECT です。
ROOT:EMIT Operator
|SCALAR AGGREGATE Operator
| グループ化 さ れて い な い COUNT AGGREGATE を評価 し ま す。
|
|
|SQFILTER Operator has 2 children.
|
|
|
|
|EXCHANGE Operator (Merged)
|
|
|Executed in parallel by 2 Producer
and 1 Consumer processes.
|
|
|
|
|
|
|
|
|
|
|
|
|EXCHANGE:EMIT Operator
|
|
|RESTRICT Operator
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
203
Adaptive Server の並列クエリ実行モデル
|
|
|
|
|
|
|
|
|
|
|SCAN Operator
|
|
|
|
|
| FROM TABLE
|
|
|
|
|
| RA2
|
|
|
|
|
| イ ン デ ッ ク ス : RA2_NC2L
|
|
|
|
|
| 前方ス キ ャ ン
|
|
|
|
|
| 2 方向分割ス キ ャ ン に よ り 並列に実行
さ れ ま し た。
|
|
|
| サブ ク エ リ 1 の実行 ( ネ ス ト ・ レ ベル 1)
|
|
|
| サブ ク エ リ 1 に対す る ク エ リ ・ プ ラ ン ( ネ ス ト ・ レ ベル 1、
2 行目 )
|
|
|
|
相関サブ ク エ リ 。
|
|
EXISTS 述語内のサブ ク エ リ 。
|
|
|
|
|SCALAR AGGREGATE Operator
|
|
| グループ化 さ れて い な い ANY AGGREGATE を評価 し
ま す。
|
|
| 最初に該当す る ロ ー ま でだけ を ス キ ャ ン し ま す。
|
|
|
|
|
|
|SCAN Operator
|
|
|
| FROM TABLE
|
|
|
| RB2
|
|
|
| テーブル ・ ス キ ャ ン です。
|
|
|
| 前方ス キ ャ ン
|
|
|
| サブ ク エ リ 1 に対す る ク エ リ ・ プ ラ ン終了
次の例では、 セ ミ ジ ョ イ ン に フ ラ ッ ト 化 さ れた in サブ ク エ リ を 示 し て
い ま す。 Adaptive Server は こ れ を 内部ジ ョ イ ン に変換 し 、 ジ ョ イ ン順
でテーブル を 入れ替え る こ と に お い て さ ら な る 柔軟性 を 提供 し て い
ま す。 下に示 し た よ う に、 最初はサブ ク エ リ に含ま れて い た テーブル
RB2 が、 並列に ア ク セ ス さ れ ま す。
select * from RA2 where a1 in (select b1 from RB2)
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
調整プ ロ セ ス と 5 作業プ ロ セ ス に よ り 並列に実行 さ れ ま し た。
10 operator(s) under root
ク エ リ の タ イ プは SELECT です。
ROOT:EMIT Operator
204
Adaptive Server Enterprise
第5章
並列クエリ処理
|EXCHANGE Operator (Merged)
|Executed in parallel by 3 Producer and 1 Consumer
processes.
|
|
|
|
|
|
|
|
|
|
ま す。
|
|
|
|
|
|
ま し た。
|
|
|
ま す。
|
|
|
|EXCHANGE:EMIT Operator
|
|
|MERGE JOIN Operator (Join Type: Inner Join)
|
| 内部記憶領域 と し て Worktable3 を使用 し て い ま す。
|
| Key Count: 1
|
| Key Ordering: ASC
|
|
|
|
|SORT Operator
|
|
| 内部記憶領域 と し て Worktable1 を使用 し て い
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|SORT Operator
| 内部記憶領域 と し て Worktable2 を使用 し て い
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
付け ま す。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|EXCHANGE:EMIT Operator
|
|
|RESTRICT Operator
|
|
|
|
|SCAN Operator
|
|
| FROM TABLE
|
|
| RA2
|
|
| イ ンデ ッ ク ス : RA2_NC2L
|
|
| 前方ス キ ャ ン
|
|
| イ ンデ ッ ク ス の最初に位置
|
|
|
|
|SCAN Operator
| FROM TABLE
| RB2
| テーブル ・ ス キ ャ ン です。
| 3 方向分割ス キ ャ ン に よ り 並列に実行 さ れ
|EXCHANGE Operator (Merged)
|Executed in parallel by 2
Producer and 3 Consumer
processes.
|
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
|
2 方向分割ス キ ャ ン に よ り
205
Adaptive Server の並列クエリ実行モデル
並列に実行 さ れ ま し た。
select into 句
select into 句 を 含む ク エ リ は、 ク エ リ の結果セ ッ ト を 格納す る た め の新
し い テーブル を 作成 し ま す。 Adaptive Server は、 通常の ク エ リ と 同 じ
方法で select into コ マ ン ド の ベー ス ・ ク エ リ 部分 を 最適化 し ま す。 そ
の際に、 並列ア ク セ ス ・ メ ソ ッ ド と 逐次ア ク セ ス ・ メ ソ ッ ド の両方が
考慮 さ れ ま す。 並列で実行 さ れ る select into 文は、 次の よ う に処理 さ れ
ま す。
•
select into 文で指定 さ れた カ ラ ム を 使用 し て、 新 し い テーブル を 作
成 し ま す。
•
新 し い テーブルで N 個の パーテ ィ シ ョ ン を 作成 し ま す。 N は、 オ
プテ ィ マ イ ザが選択す る ク エ リ の insert 演算の並列度です。
•
N 個の ワ ー カ ー ・ プ ロ セ ス を 使用 し て、 ク エ リ の結果 を 新 し い
テーブル に移植 し ま す。
•
移植先の分割が必要で な い場合は、 新 し い テーブルの分割 を 解除
し ま す。
select into 文 を 並列で実行す る 場合は、 それ を 逐次 ク エ リ ・ プ ラ ン で実
行す る 場合よ り も 多 く の手順が必要に な り ま す。 次に並列で実行 し た
単純な select into を 示 し ま す。
select * into RAT2 from RA2
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
調整プ ロ セ ス と 2 作業プ ロ セ ス に よ り 並列に実行 さ れ ま し た。
4 operator(s) under root
ク エ リ の タ イ プは INSERT です。
ROOT:EMIT Operator
|EXCHANGE Operator (Merged)
|Executed in parallel by 2 Producer and 1
Consumer processes.
|
|
|
|
|
206
|EXCHANGE:EMIT Operator
|
|
|INSERT Operator
|
| 直接更新モ ー ド です。
Adaptive Server Enterprise
第5章
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
使用 し て い ま す。
並列クエリ処理
|SCAN Operator
| FROM TABLE
| RA2
| テーブル ・ ス キ ャ ン です。
| 前方ス キ ャ ン
| テーブルの最初に位置付け ま す。
| 2 方向分割ス キ ャ ン に よ り 並列に実行 さ れ ま し た。
TO TABLE
RAT2
デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を
Adaptive Server では、 テーブル RA2 か ら の ス キ ャ ン に よ る ス ト リ ー ム
の度合い ( パーテ ィ シ ョ ン の数 ) を 上げず、 送信先テーブルへ の並列
挿入に使用 し ま す。 挿入先テーブルは、 最初は 2 度の ラ ウ ン ド ロ ビ ン
分割 を 使用 し て作成 さ れ ま す。 挿入後、 テーブル の分割は解除 さ れ
ま す。
挿入す る よ う に設定 さ れたデー タ のサ イ ズが十分では な い場合、
Adaptive Server は こ のデー タ の逐次挿入 を 選択す る 場合が あ り ま す。
ソ ー ス ・ テーブルの ス キ ャ ン は、 並列で実行す る こ と がで き ま す。
そ の後挿入先の テーブルが非分割テーブル と し て作成 さ れ ま す。
select into を 使用す る と 、 挿入先の分割 を 指定で き ま す。 こ の よ う な場
合、 挿入先テーブルは、 そ の分割 を 使用 し て作成 さ れ、 Adaptive
Server が最適なデー タ 挿入方法 を 見つ け ま す。 挿入先テーブルが ソ ー
ス ・ デー タ と 同様に分割 さ れ る 必要が あ り 、 挿入す る デー タ が十分に
あ る 場合は、 insert 演算子は並列で実行 さ れ ま す。
次の例は、 ソ ー ス ・ テーブル と 挿入先テーブルが同様に分割 さ れて
お り 、 Adaptive Server が こ の シ ナ リ オ を 認識 し 、 ソ ー ス ・ デー タ を 再
分割 し な い こ と を 選択す る 場合 を 示 し て い ま す。
select * into new_table
partition by range(a1, a2)
(p1 values <= (500,100), p2 values <= (1000, 2000))
from RA2
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
調整プ ロ セ ス と 2 作業プ ロ セ ス に よ り 並列に実行 さ れ ま し た。
4 operator(s) under root
ク エ リ の タ イ プは INSERT です。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
207
Adaptive Server の並列クエリ実行モデル
ROOT:EMIT Operator
|EXCHANGE Operator (Merged)
|Executed in parallel by 2 Producer and 1 Consumer
processes.
|
|
|EXCHANGE:EMIT Operator
|
|
|
|
|INSERT Operator
|
|
| 直接更新モ ー ド です。
|
|
|
|
|
|
|SCAN Operator
|
|
|
| FROM TABLE
|
|
|
| RA2
|
|
|
| テーブル ・ ス キ ャ ン です。
|
|
|
| 前方ス キ ャ ン
|
|
|
| テーブルの最初に位置付け ま す。
|
|
|
| 2 方向分割ス キ ャ ン に よ り 並列に実行 さ れ ま し た。
|
|
|
|
|
| TO TABLE
|
|
| RRA2
|
|
| デー タ ・ ペー ジ に対 し て I/O サ イ ズ 16 キ ロ バ イ ト
を使用 し て い ま す。
ソ ー ス の分割が挿入先テーブルの分割 と 一致 し な い場合、 ソ ー ス ・デー
タ を 再分割す る 必要が あ り ま す。 こ れは次の例で示 し ま す。 こ の例で
は、 範囲分割か ら ハ ッ シ ュ 分割にデー タ を 変換す る 2 対 2 の exchange
演算子 を 使用 し てデー タ を 再分割 し た後で、 2 つ の ワ ー カ ー ・ プ ロ セ
ス を 使用 し て挿入 を 並列で実行 し ま す。
select * into HHA2
partition by hash(a1, a2)
(p1, p2)
from RA2
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
調整プ ロ セ ス と 4 作業プ ロ セ ス に よ り 並列に実行 さ れ ま し た。
6 operator(s) under root
ク エ リ の タ イ プは INSERT です。
ROOT:EMIT Operator
208
Adaptive Server Enterprise
第5章
並列クエリ処理
|EXCHANGE Operator (Merged)
|Executed in parallel by 2 Producer and 1
Consumer processes.
|
|
|
|
|
|
|EXCHANGE:EMIT Operator
|
|
|INSERT Operator
|
| 直接更新モ ー ド です。
|
|
|
|
|
|
|
|
|EXCHANGE OperatorEXCHANGE Operator (
Merged)
|Executed in parallel by 2 Producer
and 2 Consumer processes.
|
|
|
|
|
|
|
|
|EXCHANGE:EMIT Operator
|
|
|
|
|
|
|
|
|
|
|SCAN Operator
|
|
|
|
|
| FROM TABLE
|
|
|
|
|
| RA2
|
|
|
|
|
| テーブル ・ ス キ ャ ン です。
|
|
|
|
|
| 前方ス キ ャ ン
|
|
|
|
|
| テーブルの最初に位置付け ま す。
|
|
|
|
|
| 2 方向分割ス キ ャ ン に よ り 並列に実行 さ れ
ま し た。
|
|
|
|
|
| TO TABLE
|
|
| HHA2
|
|
| デー タ ・ ペー ジ に対 し て I/O サ イ ズ 16 キ ロ バ イ ト を使
用 し て い ま す。
挿入/削除/更新
Adaptive Server では insert、 delete、 お よ び update 演算は逐次実行 さ れ
ま す。 ただ し 、 削除 ま た は更新す る ロ ー を 修飾す る た め に ク エ リ で使
用 し た挿入先テーブル以外の テーブルは、 並列で ア ク セ ス で き ま す。
delete from RA2
where exists
(select * from RB2
where RA2.a1 = b1 and RA2.a2 = b2)
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
調整プ ロ セ ス と 3 作業プ ロ セ ス に よ り 並列に実行 さ れ ま し た。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
209
Adaptive Server の並列クエリ実行モデル
9 operator(s) under root
ク エ リ の タ イ プは DELETE です。
ROOT:EMIT Operator
|DELETE Operator
| 遅延更新モ ー ド です。
|
|
|NESTED LOOP JOIN Operator (Join Type: Inner Join)
|
|
|
|
|SORT Operator
|
|
| 内部記憶領域 と し て Worktable1 を使用 し て い ま す。
|
|
|
|
|
|
|EXCHANGE Operator (Merged)
|
|
|
|Executed in parallel by 3 Producer
and 1 Consumer processes.
|
|
|
|
|
|
|
|
|EXCHANGE:EMIT Operator
|
|
|
|
|
|
|
|
|
|
|RESTRICT Operator
|
|
|
|
|
|
|
|
|
|
|
|
|SCAN Operator
|
|
|
|
|
|
| FROM TABLE
|
|
|
|
|
|
| RB2
|
|
|
|
|
|
| テーブル ・ ス キ ャ ン です。
|
|
|
|
|
|
| 前方ス キ ャ ン
|
|
|
|
|
|
| テーブルの最初に位置付け ま す。
|
|
|
|
|
|
| 3 方向分割ス キ ャ ン に よ り 並列に実
行 さ れ ま し た。
|
|
|
|
|
|
| デー タ・ペー ジ に対 し て I/O サ イ ズ
2 キ ロ バ イ ト を使用 し て い ま す。
|
|
|
|
|
|
| デー タ・ペー ジ に対す る LRU で のバ ッ
フ ァ 置換方式
|
|
|
|
|RESTRICT Operator
|
|
|
|
|
|
|SCAN Operator
|
|
|
| FROM TABLE
|
|
|
| RA2
|
|
|
| イ ンデ ッ ク ス : RA2_NC1
|
|
|
| 前方ス キ ャ ン
|
|
|
| キー に よ っ て位置付け ま す。
210
Adaptive Server Enterprise
第5章
並列クエリ処理
|
|
|
| Keys are:
|
|
|
|
a3 ASC
|
| TO TABLE
| RA2
| デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま
す。
削除対象の テーブル RB2 は、 ス キ ャ ン さ れ、 逐次削除 さ れ ま す。 ただ
し 、 テーブル RA2 は並列で ス キ ャ ン さ れ ま し た。 update 文ま た は insert
文で も こ れ と 同 じ シ ナ リ オ を 想定で き ま す。
パーティション排除
セ マ ン テ ィ ッ ク 分割の利点の 1 つ は、 ク エ リ ・ プ ロ セ ッ サが こ れ を 利
用 し 、 コ ン パ イ ル時に range、 hash、 お よ び list パーテ ィ シ ョ ン を 無効
に す る こ と がで き る 可能性が あ る こ と です。 hash パーテ ィ シ ョ ン で
は、 等号述部の み を 使用で き ま すが、 range パーテ ィ シ ョ ン お よ び list
パーテ ィ シ ョ ン では、 パーテ ィ シ ョ ン削除に等号述部 と 不等号述部の
両方 を 使用で き ま す。 た と えば、 カ ラ ム a1、 a2 でセ マ ン テ ィ ッ ク 分割
が定義 さ れて い る (p1 values <= (500,100) お よ び p2 values <= (1000,
2000)) テーブル RA2 を 考え ま し ょ う 。 カ ラ ム a1 ま た は カ ラ ム a1, a2 に
述部が あ る 場合は、 パーテ ィ シ ョ ン排除が可能です。 た と えば、 次の
文はデー タ を 修飾 し て い ま せん。
select * from RA2 where a1 > 1500
こ れは showplan 出力に示 さ れ ま す。
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
................................
|
|
|SCAN Operator
|
|
| FROM TABLE
|
|
| RA2
|
|
| [ Eliminated Partitions : 1 2 ]
|
|
| イ ン デ ッ ク ス : RA2_NC2L
Eliminated Partitions フ レ ーズは、 作成方法に従 っ てパーテ ィ
シ ョ ン を 識別 し 、 識別の た め に序数 を 割 り 当て ま す。 テーブル RA2 の
場合、 p1 で示すパーテ ィ シ ョ ン (a1, a2) <= (500, 100) は、 パーテ ィ シ ョ
ン 1 で、 p2 で示すパーテ ィ シ ョ ン (a1, a2) > (500, 100) お よ び <= (1000,
2000) はパーテ ィ シ ョ ン 2 と し て識別 さ れ ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
211
Adaptive Server の並列クエリ実行モデル
ハ ッ シ ュ 分割の すべて の キー に equality 句が あ る ハ ッ シ ュ 分割テーブ
ルの等号 ク エ リ を 考え ま す。 こ れは カ ラ ム (a1, a2) で 2 通 り の方法で
ハ ッ シ ュ 分割 さ れた テーブル HA2 で示す こ と がで き ま す。 序数は、
sp_help の出力でパーテ ィ シ ョ ン が リ ス ト さ れ る 順序 を 示 し ま す。
select * from HA2 where a1 = 10 and a2 = 20
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
................................
|SCAN Operator
| FROM TABLE
| HA2
| [ Eliminated Partitions : 1 ]
| テーブル ・ ス キ ャ ン です。
分割スキュー
分割ス キ ュ ーは、 並列分割ス キ ャ ン を 使用で き る か ど う か の判断に重
要な役割 を 果た し ま す。 Adaptive Server 分割ス キ ュ ーは、 パーテ ィ シ ョ
ン の平均サ イ ズ に対す る 最大の パー テ ィ シ ョ ン ・ サ イ ズ の割合 と し て
定義 さ れ ま す。 サ イ ズが 20、 20、 35、 お よ び 80 ペ ー ジ の 4 つ の パ ー
テ ィ シ ョ ン の あ る テ ーブル を 考え ま す。 平均パ ー テ ィ シ ョ ン の サ イ ズ
は、 (20 + 20 + 35 + 85)/4 = 40 ペー ジ です。 最大パーテ ィ シ ョ ン に は 85
ペー ジ が あ り 、 分割ス キ ュ ーは 85/40 = 2.125 と し て計算 さ れ ま す。 分
割ス キ ャ ン では、 並列ス キ ャ ン 実行の コ ス ト は、 最大パー テ ィ シ ョ ン
で の ス キ ャ ン と 同様 に 高 く な り ま す。 ハ ッ シ ュ ベ ー ス の 分割 の 場合、
各 ワ ー カ ー ・ プ ロ セ ス が 1 つ の ペ ー ジ番号ま た は 1 つ の ア ロ ケ ー シ ョ
ン ・ ユニ ッ ト で ハ ッ シ ュ し 、 そ の部分のデー タ を ス キ ャ ン で き る の で、
分割が高速 に 行われ る 可能性が あ り ま す。 偏 っ た分割 に よ る パ フ ォ ー
マ ン ス の損失の ペ ナルテ ィ は、 必ず し も ス キ ャ ン ・ レ ベルで発生す る
も の では あ り ま せ ん が、 複数の ジ ョ イ ン 演算子の よ う な よ り 複雑な演
算子 と し て、 デー タ の上 に 構築 さ れ ま す。 そ の よ う な場合、 許容誤差
は急激に増大 し ま す。
分割ス キ ュ ー を 表示す る に は、 テーブルで sp_help を 実行 し ま す。
sp_help HA2
........
name
type partition_type partitions partition_keys
------ -------------------- -------------- ----------HA2
base table
hash
2 a1, a2
partition_name partition_id pages
212
segment
Adaptive Server Enterprise
第5章
並列クエリ処理
create_date
-------------------------- ------------ ----------- -------------------------------------HA2_752002679
752002679
324 default
Aug 10 2005 2:05PM
HA2_768002736
768002736
343 default
Aug 10 2005 2:05PM
Partition_Conditions
-------------------NULL
Avg_pages
Max_pages
Min_pages
Ratio(Max/Avg)
Ratio(Min/Avg)
----------- ----------- ----------- ---------------------------------------------------333
343
324
1.030030
0.972973
代わ り に、 各パーテ ィ シ ョ ン の ペ ー ジ数が リ ス ト さ れ る systabstats シ
ス テ ム ・ カ タ ロ グ を ク エ リ す る こ と に よ っ て も ス キ ュ ー を 計算で き
ま す。
クエリが並列で実行されない理由
Adaptive Server は次の場合に ク エ リ を 逐次実行 し ま す。
•
並列ア ク セ ス の メ リ ッ ト を 利用で き る だけ の十分なデー タ がな い
場合。
•
ク エ リ に次の よ う な等価ジ ョ イ ン述部が含ま れな い場合。
select * from RA2, RB2
where a1 > b1
•
ス レ ッ ド や メ モ リ な ど の リ ソ ー ス が、 ク エ リ を 並列で実行す る た
め に十分に な い場合。
•
グ ロ ーバル ・ ノ ン ク ラ ス タ ー ド ・ イ ン デ ッ ク ス の カ バー ド ・ ス
キ ャ ン を 使用す る 場合。
•
テーブルお よ び イ ン デ ッ ク ス が、 フ ラ ッ ト 化で き な い ネ ス ト さ れ
たサブ ク エ リ 内で ア ク セ ス さ れ る 場合。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
213
Adaptive Server の並列クエリ実行モデル
実行時調整
実行時に使用可能な十分な数の ワ ー カ ー ・ プ ロ セ ス がな い場合、
実行エ ン ジ ン は、 プ ラ ン 内に存在す る exchange 演算子が使用す る ワ ー
カ ー ・ プ ロ セ ス の数 を 減 ら す こ と を 試み ま す。
•
まず、 ク エ リ の逐次再 コ ン パ イ ル と い う 手段 を 使わずに、 ク エ
リ ・ プ ラ ン内の特定の exchange 演算子の ワ ー カ ー ・ プ ロ セ ス使用
率の低減 を 試み ま す。 ク エ リ ・ プ ラ ン の セ マ ン テ ィ ク ス に よ り 、
特定の exchange 演算子に は調整可能な も の と 調整可能で な い も の
が あ り ま す。 ま た、 制限付き で調整可能な も の も あ り ま す。
•
並列 ク エ リ ・ プ ラ ン を 実行す る に は、 最低限の数の ワ ー カ ー ・ プ
ロ セ ス が必要です。 十分な数の ワ ー カ ー ・ プ ロ セ ス を 使用で き な
い場合は、 ク エ リ は逐次再 コ ン パ イ ル さ れ ま す。 再 コ ン パ イ ルが
不可能な場合、 ク エ リ は ア ボー ト さ れ、 適切な エ ラ ー ・ メ ッ セ ー
ジ が生成 さ れ ま す。
こ れは次の 2 通 り の方法で行われ ま す。
Adaptive Server はすべて に つ い て再 コ ン パ イ ル を サポー ト し て い ま す。
•
ア ド ホ ッ ク の select ク エ リ 。 ただ し select into、 alter table、 お よ び
execute immediate ク エ リ を 除き ま す。
•
ス ト ア ド ・ プ ロ シ ー ジ ャ 。 ただ し 、 select into ク エ リ と alter table ク
エ リ は除き ま す。
実行時調整の識別と管理
Adaptive Server では、 ク エ リ ・ プ ラ ン の実行時調整の た め の次の 2 つ
の メ カ ニズ ム が提供 さ れ ま す。
•
set process_limit_action を 使用す る と 、 実行時調整の発生時に バ ッ
チ処理ま た はプ ロ シ ー ジ ャ を ア ボー ト で き ま す。
•
214
showplan は、 実行時調整が発生 し 、 showplan が有効な場合に は、
調整後の ク エ リ ・ プ ラ ン を 出力 し ま す。
Adaptive Server Enterprise
第5章
並列クエリ処理
set process_limit_action の使用
set コ マ ン ド と 共に process_limit_action を 使用 し て、 調整 さ れた ク エ
リ ・ プ ラ ン の使用 を セ ッ シ ョ ン ま た は ス ト ア ド ・ プ ロ シ ー ジ ャ ・
レ ベルで監視 し ま す。 調整 さ れた ク エ リ ・ プ ラ ン が必要な場合、
process_limit_action を 「ア ボー ト 」 に設定す る と 、 Adaptive Server はエ
ラ ー 11015 を 記録 し て、 ク エ リ を ア ボー ト し ま す。 process_limit_action
を 「警告」 に設定す る と 、 Adaptive Server はエ ラ ー 11014 を 記録 し ま
すが、 ク エ リ は実行 し ま す。 た と えば、 次の コ マ ン ド は、 ク エ リ が実
行時に調整 さ れ る 場合に バ ッ チ処理 を ア ボー ト し ま す。
set process_limit_action abort
エ ラ ー 11014 と エ ラ ー 11015 がエ ラ ー ・ ロ グ に記録 さ れて い る か ど う
か を 調べ る と 、 Adaptive Server が最適化 さ れた ク エ リ ・ プ ラ ン の代わ
り に調整 ク エ リ ・ プ ラ ン を 使用 し た程度 を 確認で き ま す。 制限 を 解除
し て実行時調整 を 可能に す る に は、 次の コ マ ン ド を 使用 し ま す。
set process_limit_action quiet
『 リ フ ァ レ ン ス ・ マ ニ ュ ア ル : コ マ ン ド 』 の 「set」 を 参照 し て く
だ さ い。
showplan の使用
showplan を 使用す る と 、 Adaptive Server は ク エ リ の実行前に、 そ の ク
エ リ に つ い て最適化 さ れた プ ラ ン を 表示 し ま す。 ク エ リ ・ プ ラ ン に並
列処理が含 ま れ、 実行時調整が行われ る 場合は、 showplan は次の メ ッ
セ ー ジ に続け て調整 ク エ リ ・ プ ラ ン を 表示 し ま す。
AN ADJUSTED QUERY PLAN IS BEING USED FOR STATEMENT 1
BECAUSE NOT ENOUGH WORKER PROCESSES ARE CURRENTLY
AVAILABLE.
ADJUSTED QUERY PLAN:
set notexec を 使用す る 場合、 Adaptive Server は ク エ リ の実行 を 試み な
い の で、 実行時プ ラ ン は表示 さ れ ま せん。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
215
Adaptive Server の並列クエリ実行モデル
実行時調整の発生回数の削減
実行時調整の数 を 減 ら す に は、 並列 ク エ リ に使用で き る ワ ー カ ー ・ プ
ロ セ ス数 を 増や し て く だ さ い。 こ れは、 よ り 多 く の合計 ワ ー カ ー ・ プ
ロ セ ス数 を シ ス テ ム に追加す る か、 重要で な い ク エ リ に対す る 並列処
理の実行 を 制限 ま た は削除す る こ と で可能に な り ま す。 次の いずれか
の方法 を 使い ま す。
•
set parallel_degree。 並列度に セ ッ シ ョ ン レ ベルの制限 を 設定 し ま
す。 ま た は
•
ク エ リ レ ベルの parallel 1 句お よ び parallel N 句。 個々の文に よ る
ワ ー カ ー ・ プ ロ セ ス の使用 を 制限 し ま す。
シ ス テ ム ・ プ ロ シ ー ジ ャ に つ い て実行時調整の数 を 減 ら す場合は、
サーバ ・ レ ベル ま た は セ ッ シ ョ ン ・ レ ベルの並列度 を 変更 し て か ら 、
プ ロ シ ー ジ ャ を 再 コ ン パ イ ル し ま す。 『 リ フ ァ レ ン ス ・ マ ニ ュ ア ル :
プ ロ シ ー ジ ャ 』 の 「sp_recompile」 を 参照 し て く だ さ い。
216
Adaptive Server Enterprise
第
6
章
積極的集約と消極的集約
こ の章では、 Adaptive Server の積極的集約 と 消極的集約に つ い て
説明 し ま す。
トピック
概要
集約処理 と ク エ リ 処理
例
積極的集約の使用
ページ
217
219
222
229
概要
集約処理は、 DBMS 環境に お け る 最 も 有用な オ ペ レ ー シ ョ ン の 1
つ です。 こ の処理に よ っ て、 大量のデー タ を 次の よ う な集約値に
よ っ て要約 し ま す。
•
指定 さ れた ロ ー の セ ッ ト 内の カ ラ ム の値の最小値、 最大値、
合計値、 ま た は平均値
•
条件に一致す る ロ ー数
•
他の統計関数
SQL では、 集約処理は min()、 max()、 count()、 sum()、 avg() 集合関
数 と 、 group by お よ び having 句 を 使用 し て実行 さ れ ま す。 SQL 言語
に は、 ベ ク ト ル集合お よ び ス カ ラ 集合の 2 種類の集約処理が実装
さ れて い ま す。 select-project-join (SPJ) ク エ リ で、 こ れ ら の 2 種類の
集約処理 を 示 し ま す。
select r1, s1
from r, s
where r2 = s2
ベクトル集合
ベ ク ト ル集合では、 SPJ の結果セ ッ ト が group by 句の式に よ っ て
グループ化 さ れ、 select 句の集合関数が各グループ に適用 さ れ
ま す。 ク エ リ は、 1 つ の グループ に 1 つ の結果 ロ ー を 生成 し ま す。
select r1, sum (s1)
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
217
概要
from r, s
where r2 = s2
group by r1
スカラ集合
ス カ ラ 集合の場合、 group by 句は あ り ま せん。 SPJ の結果セ ッ ト 全体が
同 じ select 句の集合関数に よ っ て 1 つ の グループ と し て集約 さ れ ま す。
ク エ リ は、 1 つ の結果 ロ ー を 生成 し ま す。
select sum (s1)
from r, s
where r2 = s2
積極的集約
積極的集約は、 上記の よ う な ク エ リ の内部表現 を 変換 し 、 集約が段階
的に実行 さ れて い る か の よ う に処理 さ れ ま す。 すな わ ち 、 最初は ロ ー
カ ル に各テーブルで小 さ い ロ ー カ ル ・ サブグループ の中間集約結果 を
生成 し 、 次に全体的に、 ジ ョ イ ン を 実行 し て ロ ー カ ルな集約結果 を 結
合 し 、 最終的な結果セ ッ ト を 生成 し ま す。
ど のデー タ ・ セ ッ ト で も 同 じ 結果 を 返す こ れ ら の ク エ リ は、 上記の ベ
ク ト ル集合お よ び ス カ ラ 集合の例 を SQL レ ベルで書き直 し た抽出
テーブルです。 こ れ ら の ク エ リ は、 Adaptive Server が ク エ リ の内部表
現に対 し て実行す る 積極的集約の変形 を 示 し て い ま す。
ベクトル集合
select r1, sum(sum_s1 * count_r)
from
(select
r1,r2,
count_r = count(*)
from r
group by r1,r2
)gr
,
(select
s2,
sum_s1 = sum(s1)
from s
group by s2
)gs
where r2-s2
group by r1
スカラ集合
select sum(sum_s1 * count_r)
from
(select
218
Adaptive Server Enterprise
第6章
積極的集約と消極的集約
r2,
count_r = count(*)
from r
group by r2
)gr
,
(select
s2,
sum_s1 = sum(s1)
from s
group by s2
)gs
where r2 = s2
積極的集約の プ ラ ン は、 オプテ ィ マ イ ザに よ っ て生成 さ れて コ ス ト が
付け ら れ、 最適なプ ラ ン と し て選択で き ま す。 こ の形式で高度に ク エ
リ を 最適化す る と 、 元の SQL ク エ リ を 基準に し てパ フ ォ ー マ ン ス を
か な り 向上で き ま す。
集約処理とクエリ処理
ク エ リ 処理 (QP) の観点か ら は、 集約処理は コ ス ト の か か る オ ペ レ ー
シ ョ ン で あ る と 共に、 それ を 実行す る 場所が ク エ リ の パ フ ォ ー マ ン ス
に重要な影響 を 与え る オ ペ レ ー シ ョ ン で も あ り ま す。
•
通常、 集約処理に よ っ て集計値が計算 さ れ る 。 ベ ク ト ル集合は、 グ
ルー プ の集約結果 を 得 る た め に ロ ー を グルー プ に ま と め る 必要が
あ り 、 通常 こ れは ソ ー ト やハ ッ シ ュ を使用 し て ロ ー を並べ替え る コ
ス ト の かか る 操作を 含む の で、 ス カ ラ 集合よ り も コ ス ト がかか る 。
•
フ ィ ル タ の よ う な カ ーデ ィ ナ リ テ ィ が減少す る 演算子 を 入力セ ッ
ト に適用 し た後に集合演算 を 行 う と 、 集合演算の コ ス ト が減少 し 、
ク エ リ の全体的な パ フ ォ ー マ ン ス が向上す る 。
•
ジ ョ イ ン や union の よ う な カ ーデ ィ ナ リ テ ィ が増加す る 演算子 を
入力セ ッ ト に 適用す る 前 に 集合演算 を 行 う と 、 集合演算の コ ス ト
が減少 し 、 ク エ リ の全体的な パ フ ォ ー マ ン ス が向上す る 。
•
早期 に 集合演算 を 行 う と 、 親演算子の入力セ ッ ト の カ ーデ ィ ナ リ
テ ィ の減少 に よ っ て親演算子の コ ス ト が減少 し 、 ク エ リ の全体的
な パ フ ォ ー マ ン ス が向上す る 。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
219
集約処理とクエリ処理
•
グループ化カ ラ ム に あ る 個別の値の組み合わせが比較的少な い場
合は、 集合に よ っ て結果セ ッ ト 内の入力セ ッ ト の カ ーデ ィ ナ リ
テ ィ を 飛躍的に減 ら す こ と がで き る 。
•
集合がグループ化カ ラ ム で順序付け さ れて い る 場合な ど では、 集
合の入力セ ッ ト の プ ロ パテ ィ の一部が既に グループ化 さ れて い る
の で、 ベ ク ト ル集合の コ ス ト が減少す る 。 ス カ ラ 集合の場合は、
集合カ ラ ム に配列 さ れた ロ ー に よ っ て、 それぞれの入力 ロ ー に ア
ク セ ス し な い で min ま た は max を 計算で き る 。
•
プ ラ ン ・ フ ラ グ メ ン ト 物理プ ロ パテ ィ は、 集合 コ ス ト に大き な影
響 を 与え る 。
集合の ネ イ テ ィ ブ の QP の実装では、 SQL ク エ リ に よ っ て示 さ れ る よ
う に、 ク エ リ ・ ブ ロ ッ ク の SPJ 部分に ス カ ラ 集合お よ びベ ク ト ル集合
演算子 を 配置 し ま す。 ただ し 、 ク エ リ の セ マ ン テ ィ ッ ク を 維持 し 、
次の よ う に演算子の ツ リ ー の別の場所で の集合 を 可能に す る 代数的な
変形が存在 し ま す。
•
集合 を リ ー フ の ほ う に押 し 下げ、 早期に集約す る ( 積極的集約 と
呼ばれ る )。
•
集合 を ルー ト の ほ う に引き上げ、 後で集約す る ( 消極的集約 と 呼
ばれ る )。
そ の よ う な変形に よ っ て得 ら れ る プ ラ ン は、 パ フ ォ ー マ ン ス に大差が
あ り ま す。 分散 ク エ リ 処理 (DQP) に と っ て さ ら に重要な の は、 積極的
集約に よ っ て中間結果の カ ーデ ィ ナ リ テ ィ を 大き く 減 ら す こ と がで き
る こ と です。 こ の よ う に カ ーデ ィ ナ リ テ ィ を 減 ら す こ と で ノ ー ド を ま
たが る デー タ 転送 コ ス ト が削減 さ れ、 従来の QP と 対照 し た場合の
DQP の主な短所がな く な り ま す。
Adaptive Server 15.0.2 以降に は、 ク エ リ ・ プ ラ ン の リ ー フ 全体、 すな
わ ち ス キ ャ ン演算子全体に積極的集約が実装 さ れて い ま す。
次の ク エ リ は、 積極的集約の QP 実装 を 示 し ま す。
select r1, sum (s1)
from r,s
where r2 = s2
group by r1
220
Adaptive Server Enterprise
第6章
積極的集約と消極的集約
図 6-1: 標準的なクエリ実行プラン
GroupHashing: r1; sum(s1)
MergeJoin: r2=s2
IndScan: ir2, r
IndScan: is2, s
r(r2) お よ び s(s2) の 2 つ の イ ン デ ッ ク ス ・ ス キ ャ ン に よ っ て、 マ ー ジ ・
ジ ョ イ ン “r2=s2” で必要 と す る 順序付けが提供 さ れ ま す。 ハ ッ シ ュ
ベー ス の グループ化は、 ク エ リ の指定に従 っ て ジ ョ イ ン全体に実行 さ
れ ま す。
ま た、 オプテ ィ マ イ ザに よ っ て積極的集約 を 実行す る ク エ リ ・ プ ラ ン
が生成 さ れ、 グループ化の プ ッ シ ュ ダ ウ ン、 早期グループ化、 ま た は
積極的グループ化 と も 呼ばれ る 積極的集約が実行 さ れ ま す。 抽出テー
ブル を 使用す る 変換の SQL 表現は次の と お り です。
select r1, sum(sum_s1 * cnt_r)
from
(select r1, r2, cnt_r = count(*)
from r
group by r1, r2
) as gr
,
(select s2, sum_s1 = sum(s1)
from s
group by s2
) as gs
where r2 = s2
group by r1
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
221
例
図 6-2: 積極的集約プランの例
GroupHashing: r1; sum(sum_s1*cnt_r)
MergeJoin: r2=s2
GroupSorted: r1, r2;
cnt_r = count(*)
GroupSorted: s2;
cnt_s1 = sum(s1)
IndScan: ir21, r
IndScan: is2, s
2 つ の積極的 GroupSorted 演算子は、 ロ ー カ ル の グループ化カ ラ ム で
グループ化 し ま す。 GroupSorted 演算子は、 集合関数の引数で あ る と
い う 理由以外の理由で抽出 さ れた カ ラ ム に適用 さ れ ま す。 こ れ ら の カ
ラ ム に は次の も の が含ま れ ま す。
•
group by 句内の メ イ ン の グループ化カ ラ ム
•
ま だ適用 さ れて い な い述部に よ っ て必要 と さ れ る カ ラ ム
低 コ ス ト の GroupSorted 演算子 を 配置す る に は、 子プ ラ ン ・ フ ラ グ メ
ン ト に よ っ てすべて の ロ ー カ ルの グループ化カ ラ ム に順序付け を 提供
す る 必要が あ り ま す。 し たが っ て、 r(r2, r1) に ir21 イ ン デ ッ ク ス
が作成 さ れて い ま す。
例
オンラインのデー
タ・アーカイブ
222
積極的集約 を 実装す る 最大の理由はオ ン ラ イ ン のデー タ ・ ア ー カ イ ブ
です。 こ れは分散 ク エ リ 処理 (DQP) の イ ン ス ト ールで、 最近の OLTP
読み取 り /書き込みデー タ は Adaptive Server 上に置かれ、 読み込み専
用の履歴デー タ は別の サーバ、 Adaptive Server ま た は ASIQ に置かれ
ま す。
Adaptive Server Enterprise
第6章
積極的集約と消極的集約
次の view、 v は、 意思決定支援シ ス テ ム (decision support system: DSS)
ア プ リ ケ ー シ ョ ン に ase_tab 内の ロ ー カ ル Adaptive Server デー タ へ の
透過的な ア ク セ ス を 提供 し 、 コ ン ポー ネ ン ト 統合サー ビ ス (Component
Integration Services: CIS) proxy_asiq_tab を 介 し て ASIQ サ ー バ 上 の リ
モ ー ト の履歴デー タ へ の透過的な ア ク セ ス を 提供 し ま す。
create view v(v1, v2)
as
select a1, a2 from ase_tab
union all
select q1, q2 from proxy_asiq_tab
DSS ア プ リ ケ ー シ ョ ン ではデー タ の分散 さ れた性質 を 無視 し 、 unionin-view テーブル を 複雑な ク エ リ の ベー ス ・ テーブル と し て使用 し て、
通常は次の集合 を 使用 し ま す。
select t1, sum(v1)
from t,v
where t2=v2
group by t1
view お よ び union の解析後、 以下の演算子ツ リ ーが取得 さ れ ま す。
図 6-3: SQL クエリの書き直し
group:t1;sum(v1)
join:t2=v2
t
union
ase_tab
proxy_aseq_tab
こ の ツ リ ーでは CIS プ ロ キ シ ・ テーブルが使用 さ れて い る の で、 CIS
レ イ ヤは特別な リ モ ー ト ・ ス キ ャ ン演算子 を 使用 し てプ ラ ン ・ フ ラ グ
メ ン ト を 生成 し 、 リ モ ー ト ・ サ イ ト に送信 し ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
223
例
図 6-4: 代表的な次善 CIS 動作
GROUP
"select
q1, q2
from
asiq_tab"
ASE
ASIQ
JOIN
scan:t
scan:
ase_tab
union
scan:
proxy_asiq_t
scan:
asiq_tab
こ の よ う に、 こ の メ カ ニズム は次善的です。 履歴テーブル全体が CIS
レ イ ヤ を 介 し て Adaptive Server 側に移動 さ れ、 多 く の ネ ッ ト ワ ー ク ・
コ ス ト を 損失 し て い ま す。 さ ら に、 高度な ASIQ ビ ッ ト マ ッ プベ ー ス
の グループ化ア ルゴ リ ズ ム が使用 さ れて い ま せん。
224
Adaptive Server Enterprise
第6章
積極的集約と消極的集約
図 6-5: 代表的な集約処理
group
join
Scan: t
union
グループ化は、 ASE 側の こ こ で ク エ
リ の セ マ ン テ ィ ッ ク に従 っ て行われ
ま す。
中間演算子。
• グループ化の プ ッ シ ュ ダ ウ ン を ブ
ロ ッ ク し ま す。
• グループ化を 使用 し て切 り 替え る
必要が あ り ま す。
ASIQ
Scan: ase tab
Scan: proxy_asiq_tab
グループ化は、 ASIQ 側の こ こ で必
要に な り ま す。
• ASIQ では ビ ッ ト マ ッ プ を使用 し
ま す。
• 結果デー タ は少な く な り ま す。
理想的に は、 変換は演算子ツ リ ー上で実行 さ れ、 グループ化は ASIQ
側で実行 さ れて、 集約 さ れたデー タ の みが転送 さ れ る よ う に し ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
225
例
図 6-6: 望ましい集約処理のレイアウト
グループ化は、 こ こ で ク エ リ の セ マ
ン テ ィ ッ ク に従 っ て行われ ま す。
group
join
Scan: t
?
セ マ ン テ ィ ッ ク を保持す る 中間
演算子
union
group
Scan: ase tab
ASIQ
Scan: proxy_asiq_tab
セ マ ン テ ィ ッ ク を保持す る
積極的グループ化
こ の例では、 group と CIS プ ロ キ シ の間に、 ジ ョ イ ン お よ び union と い
う 2 つ の演算子が あ り ま す。 次の変形に よ っ て、 グループ化は ジ ョ イ
ン と union の下に プ ッ シ ュ さ れ、 積極的集約 を 達成 し ま す。
226
Adaptive Server Enterprise
第6章
積極的集約と消極的集約
図 6-7: 積極的集約
group
積極的集約の達成
join
Scan: t
union
group
group
Scan: ase tab
Scan: proxy_asiq_tab
こ こ では、 グループ化は CIS プ ロ キ シ と 隣接 し て い ま す。 CIS レ イ ヤ
はグループ化 さ れた ク エ リ を ASIQ に送信 し 、 集約 さ れたデー タ を 返
し ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
227
例
図 6-8: 積極的集約を含む最適な CIS 動作
select q2, ASIQ
sum(q1)
from
asiq_tab
group by q2
group
ASE
group
join
scan:t
group
union
NetScan:
ASIQ
scan:
asiq_tab
Scan:
ase_tab
DSS/DQP
シングルノード DSS
分散環境で複雑な集合 DSS ク エ リ を 有効に実行す る の は、 オ ン ラ イ
ン のデー タ ・ ア ー カ イ ブ に お け る 課題で あ る だけで な く 、 通常は、 オ
ン ラ イ ン のデー タ ・ ア ー カ イ ブ DSS/DQP に お け る 次の よ う な
DSS/DQP の一般的な問題です。
•
標準的な ク エ リ に は複雑な ジ ョ イ ン や union が含 ま れ、 集合は ク
エ リ ・ ツ リ ー の先頭で実行 さ れ る 。
•
デー タ は ノ ー ド 間に分散 さ れ、 中間結果 を プ ロ デ ュ ーサ ・ ノ ー ド
か ら コ ン シ ュ ーマ ・ ノ ー ド に移動し て さ ら に処理す る 必要があ る 。
通常、 上の例は DQP の場合ですが、 オ ン ラ イ ン のデー タ ・ ア ー カ イ
ブでは、 積極的集約の パ フ ォ ー マ ン ス の影響は DQP ノ ー ド 間の中間
結果の移動 を 上回 り ま す。
積極的集約では、 中間結果セ ッ ト を 減 ら す こ と に よ っ て集約 さ れた複
雑な ク エ リ の パ フ ォ ー マ ン ス が向上 し ま す。 集約 さ れた複雑な ク エ リ
は一般的な の で、 積極的集約に よ っ て、 すべて の DSS ア プ リ ケ ー
シ ョ ン で Adaptive Server の パ フ ォ ー マ ン ス は向上 し ま す。
228
Adaptive Server Enterprise
第6章
積極的集約と消極的集約
積極的集約の使用
積極的集約は、 内部の ク エ リ 処理機能です。 積極的集約 を 有効に す る
場合は、 SQL レ ベルで変更す る 必要は あ り ま せん。 集合 を 使用す る ク
エ リ に は、 オプテ ィ マ イ ザに よ っ て自動的に列挙 さ れ、 コ ス ト が付け
ら れた積極的集約ベ ー ス の プ ラ ン が あ り ま す。
積極的集約の有効化
積極的集約は、 advanced_aggregation オプテ ィ マ イ ザ設定値に よ っ て
制御 さ れ ま す。 すべて の最適化目標は、 デ フ ォ ル ト がオ ン で あ る
allrows_dss を 除い て、 オ フ がデ フ ォ ル ト です。 積極的集約は、 接続 レ
ベル ま た は ク エ リ ・ レ ベルで有効や無効に し た り 、 オプテ ィ マ イ ザの
目標のデ フ ォ ル ト 値に リ セ ッ ト で き ま す。
た と えば、 接続 レ ベルで有効に す る に は、 次の よ う に し ま す。
set advanced_aggregation
ク エ リ ・ レ ベルで有効に す る に は、 次の よ う に し ま す。
select r1, sum (s1)
from r, s
where r2 = s2
group by r1
plan
"(use advanced_aggregation on)"
ま た、 最適化目標が allrows_dss に設定 さ れて い る 場合は、 積極的
集約は暗黙的に有効に な り ま す。 次の例では、 抽象プ ラ ン に よ っ て
ク エ リ ・ レ ベルで allrows_dss が設定 さ れ ま す。
select r1, sum (s1)
from r, s
where r2 = s2
group by r1
plan
"(use optgoal allrows_dss)"
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
229
積極的集約の使用
積極的集約のチェック
積極的集約が有効な場合は、 オプテ ィ マ イ ザは最 も 見積 も り コ ス ト の
低い プ ラ ン が積極的集約 を 使用す る か ど う か に よ っ て コ ス ト を 決定 し
ま す。
showplan 集計の出力。
1>
2>
3>
4>
5>
select r1, sum (s1)
from r, s
where r2=s2
group by r1
go
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
STEP 1
ク エ リ の タ イ プは SELECT です。
6 operator(s) under root
|ROOT:EMIT Operator
|
| |HASH VECTOR AGGREGATE Operator
| | GROUP BY
| | グループ化 さ れた SUM OR AVERAGE AGGREGATE を評価 し ま す。
| | 内部記憶領域 と し て Worktable2 を使用 し て い ま す。
| | Key Count: 1
| |
| | |MERGE JOIN Operator (Join Type: Inner Join)
| | | 内部記憶領域 と し て Worktable1 を使用 し て い ま す。
| | | Key Count: 1
| | | Key Ordering: ASC
| | |
| | | |GROUP SORTED Operator
| | | | グループ化 さ れた COUNT AGGREGATE を評価 し ま す。
| | | |
| | | | |SCAN Operator
| | | | | FROM TABLE
| | | | | r
| | | | | イ ン デ ッ ク ス : ir21
| | | | | 前方ス キ ャ ン
| | | | | テーブルの最初に位置付け ま す。
| | | | | イ ン デ ッ ク ス に は、 必要な カ ラ ム がすべて含ま れて い ま す。 ベー ス ・ テーブルは読み込ま れ
ま せん。
| | | | | イ ン デ ッ ク ス の リ ー フ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
| | | | | イ ン デ ッ ク ス の リ ー フ ・ ペー ジ に対す る LRU で の バ ッ フ ァ 置換方式
| | |
| | | |GROUP SORTED Operator
| | | | グループ化 さ れた SUM OR AVERAGE AGGREGATE を評価 し ま す。
| | | |
230
Adaptive Server Enterprise
第6章
積極的集約と消極的集約
| | | | |SCAN Operator
| | | | | FROM TABLE
| | | | | s
| | | | | イ ン デ ッ ク ス : is21
| | | | | 前方ス キ ャ ン
| | | | | テーブルの最初に位置付け ま す。
| | | | | イ ン デ ッ ク ス に は、 必要な カ ラ ム がすべて含ま れて い ま す。 ベー ス ・ テーブルは読み込ま れ
ま せん。
| | | | | イ ン デ ッ ク ス の リ ー フ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を 使用 し て い ま す。
| | | | | イ ン デ ッ ク ス の リ ー フ ・ ペー ジ に対す る LRU で のバ ッ フ ァ 置換方式
r1
----------- ----------1
2
2
4
(2 rows affected)
ク エ リ に よ っ て r と s の ジ ョ イ ン に ベ ク ト ル集合が実行 さ れ る の で、
ク エ リ ・ ツ リ ー の先頭に あ る hash vector aggregate 演算子はすべて の場
合に要求 さ れ ま す。 ただ し 、 r お よ び s の ス キ ャ ン に対す る group sorted
演算子は、 ク エ リ の一部では あ り ま せん。 それ ら に よ っ て、 積極的集
約が実行 さ れ ま す。
次の よ う に advanced_aggregation が off の場合は、 プ ラ ン に は積極的集
約演算子 group sorted が含ま れ ま せん。
1>
2>
1>
2>
3>
4>
5>
set advanced_aggregation off
go
select r1, sum(s1)
from r, s
where r2=s2
group by r1
go
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
STEP 1
ク エ リ の タ イ プは SELECT です。
4 operator(s) under root
|ROOT:EMIT Operator
|
| |HASH VECTOR AGGREGATE Operator
| | GROUP BY
| | グループ化 さ れた SUM OR AVERAGE AGGREGATE を評価 し ま す。
| | 内部記憶領域 と し て Worktable2 を使用 し て い ま す。
| | Key Count: 1
| |
| | |MERGE JOIN Operator (Join Type: Inner Join)
| | | 内部記憶領域 と し て Worktable1 を使用 し て い ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
231
積極的集約の使用
| | | Key Count: 1
| | | Key Ordering: ASC
| | |
| | | |SCAN Operator
| | | | FROM TABLE
| | | | r
| | | | イ ン デ ッ ク ス : ir21
| | | | 前方ス キ ャ ン
| | | | テーブルの最初に位置付け ま す。
| | | | イ ン デ ッ ク ス に は、 必要な カ ラ ム がすべて含ま れて い ま す。 ベー ス ・ テーブルは読み込ま れ ま
せん。
| | | | イ ン デ ッ ク ス の リ ー フ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を 使用 し て い ま す。
| | | | イ ン デ ッ ク ス の リ ー フ ・ ペー ジ に対す る LRU で のバ ッ フ ァ 置換方式
| | |
| | | |SCAN Operator
| | | | FROM TABLE
| | | | s
| | | | イ ン デ ッ ク ス : is21
| | | | 前方ス キ ャ ン
| | | | テーブルの最初に位置付け ま す。
| | | | イ ン デ ッ ク ス に は、 必要な カ ラ ム がすべて含ま れて い ま す。 ベー ス ・ テーブルは読み込ま れ ま
せん。
| | | | イ ン デ ッ ク ス の リ ー フ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を 使用 し て い ま す。
| | | | イ ン デ ッ ク ス の リ ー フ ・ ペー ジ に対す る LRU で のバ ッ フ ァ 置換方式
r1
----------- ----------1
2
2
4
(2 rows affected)
抽象プランによる積極的集約の強制
オプテ ィ マ イ ザは、 子プ ラ ン ・ フ ラ グ メ ン ト に よ っ て ロ ー カ ルの グ
ループ化カ ラ ム の順序付けが提供 さ れた場合、 日和見的に コ ス ト の低
い GroupSorted ベ ー ス の積極的集約プ ラ ン を 列挙 し ま す。
こ の制限に よ っ て、 最適化の検索領域お よ び検索時間の増加が回避 さ
れ ま す。 ただ し 、 ハ ッ シ ュ ベー ス の積極的集約に よ っ て最 も コ ス ト の
低い プ ラ ン が生成 さ れ る 場合が あ り ま す。 そ の よ う な場合は、 抽象プ
ラ ン を 使用 し て積極的集約 を 強制で き ま す。 抽象プ ラ ン を 使用す る に
は advanced_grouping を 有効に す る 必要が あ り ま す。 有効に し て い な い
と 、 積極的集約抽象プ ラ ン は拒否 さ れ ま す。
232
Adaptive Server Enterprise
第6章
積極的集約と消極的集約
上の例では、 r に (r1, r2) の イ ン デ ッ ク ス がな く 、 r が大き い に も か か わ
ら ず r1--r2 の異な る 値の ペ ア が少な い場合は、 次の抽象プ ラ ン に よ っ
て強制 さ れ る r の積極的集約 を 伴 う ハ ッ シ ュ ・ ジ ョ イ ン が最適なプ ラ
ン です。
1> select r1, sum (s1)
2> from r, s
3> where r2=s2
4> group by r1
5> plan
6> "(group_hashing
7>
(h_join
8>
(group_hashing
9>
(t_scan r)
10>
)
11>
(t_scan s)
12>
)
13> )"
14> go
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
PLAN 句の Abstract Plan を使用 し て最適化 し ま し た。
STEP 1
ク エ リ の タ イ プは SELECT です。
5 operator(s) under root
|ROOT:EMIT Operator
|
| |HASH VECTOR AGGREGATE Operator
| | GROUP BY
| | グループ化 さ れた SUM OR AVERAGE AGGREGATE を評価 し ま す。
| | 内部記憶領域 と し て Worktable3 を使用 し て い ま す。
| | Key Count: 1| |
| | |HASH JOIN Operator (Join Type: Inner Join)
| | | 内部記憶領域 と し て Worktable2 を使用 し て い ま す。
| | | Key Count: 1
| | |
| | | |HASH VECTOR AGGREGATE Operator
| | | | GROUP BY
| | | | グループ化 さ れた COUNT AGGREGATE を 評価 し ま す。
| | | | 内部記憶領域 と し て Worktable1 を使用 し て い ま す。
| | | | Key Count: 2
| | | |
| | | | |SCAN Operator
| | | | | FROM TABLE
| | | | | r
| | | | | テーブル ・ ス キ ャ ン です。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
233
積極的集約の使用
| | | | | 前方ス キ ャ ン
| | | | | テーブルの最初に位置付け ま す。
| | | | | デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を使用 し て い ま す。
| | | | | デー タ ・ ペー ジ に対す る LRU で の バ ッ フ ァ 置換方式
| | |
| | | |SCAN Operator
| | | | FROM TABLE
| | | | s
| | | | テーブル ・ ス キ ャ ン です。
| | | | 前方ス キ ャ ン
| | | | テーブルの最初に位置付け ま す。
| | | | デー タ ・ ペー ジ に対 し て I/O サ イ ズ 2 キ ロ バ イ ト を 使用 し て い ま す。
| | | | デー タ ・ ペー ジ に対す る LRU で のバ ッ フ ァ 置換方式
r1
----------- ----------1
2
2
4
(2 rows affected)
ハ ッ シ ュ ・ ベ ク ト ル集合演算子は、 抽象プ ラ ン の要求に従 っ て、 r の
ス キ ャ ン の積極的集約 を 実行 し ま す。
234
Adaptive Server Enterprise
第
7
章
最適化の制御
こ の章では、 ク エ リ ・ プ ロ セ ッ サが選択す る ジ ョ イ ン順、 イ ン
デ ッ ク ス、 I/O サ イ ズ、 キ ャ ッ シ ュ 方式に影響す る 、 ク エ リ 処理
の オプ シ ョ ン に つ い て説明 し ま す。
トピック
特殊な最適化手法
ク エ リ ・ プ ロ セ ッ サの オプ シ ョ ン を指定す る
ジ ョ イ ン に テーブル順序を指定す る
ク エ リ ・ プ ロ セ ッ サが検討す る テーブル数を指定す る
ク エ リ に イ ン デ ッ ク ス を指定す る
ク エ リ に I/O サ イ ズ を指定す る
キ ャ ッ シ ュ 方式を指定す る
大容量 I/O と キ ャ ッ シ ュ 方式の制御
非同期 ロ グ ・ サー ビ ス
マ ー ジ ・ ジ ョ イ ン を有効ま た は無効に す る
ジ ョ イ ン推移閉包の有効化 と 無効化
リ テ ラ ルの パ ラ メ ー タ化の制御
ク エ リ の並列度の指定
小 さ い テーブルの同時実行性の最適化
ページ
235
239
240
242
243
245
249
251
252
255
256
258
260
271
特殊な最適化手法
Sybase では、 こ の章で説明す る ツ ール を使用す る 前に、 『パ フ ォ ー
マ ン ス & チ ュ ーニ ン グ ・ シ リ ーズ : 基本』 を 読む こ と を おすすめ
し ま す。 こ れ に よ り 、 こ の章の内容に関す る 理解 を 深め る こ と が
で き ま す。
Adaptive Server ク エ リ ・ プ ロ セ ッ サの決定 し た内容が上書き さ れ、
使用法 を 誤 る と パ フ ォ ー マ ン ス に非常に深刻な悪影響 を 及ぼす こ
と が あ る た め、 最適化手法は注意 し て使用 し て く だ さ い。 各 ク エ
リ の パ フ ォ ー マ ン ス と シ ス テ ム全体の パ フ ォ ー マ ン ス の両方に対
す る 影響に つ い て理解す る 必要が あ り ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
235
現在のオプティマイザ設定の表示
Adaptive Server は、 コ ス ト ベ ー ス の高度な ク エ リ ・ プ ロ セ ッ サで あ り 、
ほ と ん ど の状況で適切な ク エ リ ・ プ ラ ン を 生成 し ま す。 ただ し 、 ク エ
リ ・ プ ロ セ ッ サが最適な パ フ ォ ー マ ン ス を 得 る た め の適切な イ ン デ ッ
ク ス を 選択 し な か っ た り 、 最良では な い ジ ョ イ ン順 を 選択 し た り す る
場合が あ る た め、 ク エ リ に使用す る ア ク セ ス方式 を 制御す る 必要が あ
り ま す。 最適化手法に よ り 、 こ の制御 を 行え る よ う に な り ま す。
ま た、 チ ュ ーニ ン グ時に、 異な る ジ ョ イ ン順、 I/O サ イ ズ、 ま た は
キ ャ ッ シ ュ 方式の効果の確認が必要に な る 場合 も あ り ま す。 こ の章で
説明す る 最適化オプ シ ョ ン の中に は、 手間 を か け て再構成 を し な く て
も ク エ リ 処理方式ま た は ア ク セ ス方式 を 指定で き る も の が あ り ま す。
Adaptive Server は、 ク エ リ 最適化に影響す る ツ ールや ク エ リ 句、 お よ
び ク エ リ ・ プ ロ セ ッ サが選択 し た最適化方法 を 知 る こ と がで き る 優れ
た ク エ リ 分析ツ ール を 提供 し ま す。
注意 こ の章では、 特定の最適化の問題に対す る 対処方法 も 説明 し
ま す。 対処方法に よ り 問題 を 解決で き な い場合は、 Sybase 製品の保守
契約 を 結ん で い る サポー ト ・ セ ン タ に連絡 し て く だ さ い。
現在のオプティマイザ設定の表示
sp_options に よ り 、 次の オプ シ ョ ン に対す る 現在の オプテ ィ マ イ ザの
設定 を 表示で き ま す。
236
•
set plan dump / set plan load
•
set plan exists check
•
set forceplan
•
set plan optgoal
•
set [optCriteria]
•
set plan opttimeoutlimit
•
set plan replace
•
set statistics simulate
•
set metrics_capture
•
set prefetch
Adaptive Server Enterprise
第7章
•
set parallel_degree number
•
set process_limit_action
•
set resource_granularity number
•
set scan_parallel_degree number
•
set repartition_degree number
最適化の制御
sp_options は sysoptions の偽の テーブル に ク エ リ を 実行 し ま す。 こ の
テーブル に は、 各 set オプ シ ョ ン、 カ テゴ リ 、 現在の設定 と デ フ ォ ル
ト 設定が保管 さ れ ま す。 sysoptions に は、 各オプ シ ョ ン の詳細情報 を 示
す ビ ッ ト マ ッ プ も 含ま れて い ま す。
sp_options の構文は次の と お り です。
sp_options [ [show | help
[, option_name | category_name |null
[, dflt | non_dflt | null
[, spid] ] ] ] ]
各パ ラ メ ー タ の意味は、 次の と お り です。
•
show - カ テゴ リ に応 じ てグループ化 さ れたすべて の オプ シ ョ ン
の現在値 と デ フ ォ ル ト 値 を 示 し ま す。 オプ シ ョ ン名 を 指定 し て
sp_options show を 発行す る と 、 個別オプ シ ョ ン の現在値 と デ フ ォ
ル ト 値が示 さ れ ま す。 セ ッ シ ョ ン ID と 、 デ フ ォ ル ト 設定で の オプ
シ ョ ン ま た はデ フ ォ ル ト 以外の設定で の オプ シ ョ ン の表示 も 指定
で き ま す。
•
help - 使用法に つ い て の情報 を 表示 し ま す。 パ ラ メ ー タ を 指定せ
ずに sp_options を 発行す る 場合 と 同 じ 結果が得 ら れ ま す。
•
null - 設定 を 表示す る オプ シ ョ ン を 示 し ま す。
•
dflt | non_dflt | null - デ フ ォ ル ト 設定で の オプ シ ョ ン ま た はデ フ ォ ル
ト 以外の設定で の オプ シ ョ ン の表示 を 示 し ま す。
•
spid - セ ッ シ ョ ン ID を 指定 し ま す。 他の セ ッ シ ョ ン設定 を 表示す
る に はセ ッ シ ョ ン ID を 使用 し ま す。
た と えば、 次に示 さ れた現在の オプテ ィ マ イ ザ設定 を 表示す る に は、
次の よ う に入力 し ま す。
1> sp_options show
2> go
Category: Query Tuning
name
currentsetting
defaultsetting
scope
------------------------------------------ -----------------------------optgoal
allrows_mix
allrows_mix
0
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
237
現在のオプティマイザ設定の表示
opttimeoutlimit
merge_join
hash_join
nl_join
distinct_sorted
distinct_sorting
distinct_hashing
group_sorted
group_hashing
group_inserting
order_sorting
append_union_all
merge_union_all
merge_union_distinct
hash_union_distinct
store_index
bushy_space_search
parallel_query
replicated_partition
ase125_primed
index_intersection
index_union
multi_table_store_ind
advanced_aggregation
opportunistic_distinct_view
repartition_degree
scan_parallel_degree
resource_granularity
parallel_degree
statistics simulate
forceplan
prefetch
metrics_capture
process_limit_action
plan replace
plan exists check
plan dump
plan load
40
1
0
1
1
1
1
1
1
0
1
1
1
1
1
1
0
1
0
0
0
1
0
0
1
3
0
10
0
0
0
1
0
quiet
0
0
0
0
10
1
0
1
1
1
1
1
1
0
1
1
1
1
1
1
0
1
0
0
0
1
0
0
1
1
1
10
1
0
0
1
0
quiet
0
0
0
0
0
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
2
2
2
2
4
7
6
6
2
4
4
4
4
(39 rows affected)
(return status = 0)
sp_options の詳細に つ い ては、 『Adaptive Server リ フ ァ レ ン ス ・ マ ニ ュ
ア ル : プ ロ シ ー ジ ャ 』 を 参照 し て く だ さ い。
238
Adaptive Server Enterprise
第7章
最適化の制御
ユーザは誰で も sysoptions に対 し て ク エ リ を 実行で き ま す。
文字列操作 ま た はキ ャ ス ト も 使用で き ま す。 た と えば、 オプ シ ョ ン が
数値の場合、 次 を 入力す る と sysoptions に対 し て ク エ リ を 実行で き
ま す。
if (isnumeric(currentsetting))
select@int_val = convert(int, currentsetting)
...
else
select@char_val = currentsetting
...
sysoptions の詳細に つ い ては、 『Adaptive Server リ フ ァ レ ン ス ・ マ ニ ュ
ア ル : テーブル』 を 参照 し て く だ さ い。
クエリ・プロセッサのオプションを指定する
Adaptive Server では、 ク エ リ ・ バ ッ チ ま た は ク エ リ の テキ ス ト に コ マ
ン ド を 含め る こ と で、 次の最適化の オプ シ ョ ン を 指定で き ま す。
•
ジ ョ イ ン で の テーブルの順序
•
ジ ョ イ ン最適化中に同時に評価 さ れ る テーブルの数
•
テーブル ・ ア ク セ ス に使われ る イ ン デ ッ ク ス
•
I/O サ イ ズ
•
キ ャ ッ シ ュ 方式
•
並列度
特定の状況では、 ク エ リ ・ プ ロ セ ッ サ に よ り 最適なプ ラ ン が選択 さ れ
な い場合が あ り ま す。 場合に よ っ ては、 ク エ リ ・ プ ロ セ ッ サ に よ り
「最適な」 プ ラ ン よ り も ほ ん の わずか に コ ス ト がか か る プ ラ ン が選択
さ れ る こ と が あ る た め、 強制的に選択 さ れた こ れ ら の オプ シ ョ ン を 維
持、 調節す る コ ス ト と 、 最適なプ ラ ン よ り 低い パ フ ォ ー マ ン ス と を よ
く 比較検討す る 必要が あ り ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
239
ジョインにテーブル順序を指定する
ジ ョ イ ン順、 イ ン デ ッ ク ス、 I/O サ イ ズ、 ま た はキ ャ ッ シ ュ 方式 を 指
定す る コ マ ン ド を statistics io、 showplan な ど の ク エ リ ・ レ ポー ト ・ コ
マ ン ド と 組み合わせて使 う と 、 ク エ リ ・ プ ロ セ ッ サがそ の選択 を 行 っ
た理由 を 判断で き ま す。
警告! こ の章で説明す る オプ シ ョ ン は注意 し て使 っ て く だ さ い。 強制
の オプ シ ョ ン に よ っ て ク エ リ ・ プ ロ セ ッ サが選ぶ ク エ リ ・ プ ラ ン は、
状況に よ っ ては不適切で あ り 、 パ フ ォ ー マ ン ス を 低下 さ せ る 場合が あ
り ま す。 ア プ リ ケ ー シ ョ ン に こ れ ら の オプ シ ョ ン を 含め る 場合は、 ク
エ リ ・ プ ラ ン、 I/O 統計値な ど の パ フ ォ ー マ ン ス ・ デー タ を 定期的に
チ ェ ッ ク し て く だ さ い。
一般的に は、 こ れ ら の オプ シ ョ ン はチ ュ ーニ ン グや動作確認の た め の
ツ ール と し て使用す る も の で、 最適化の問題に対す る 長期的な解決策
と し て使用す る も の では あ り ま せん。
ジョインにテーブル順序を指定する
Adaptive Server は、 I/O を 最小限に抑え る た め に ジ ョ イ ン順 を 最適化
し ま す。 ほ と ん ど の場合、 ク エ リ ・ プ ロ セ ッ サが選択す る 順序は、
select コ マ ン ド の from 句の順序 と 一致 し ま せん。 指定 し た順序 ど お り
に Adaptive Server がテーブル に ア ク セ ス す る よ う に す る に は、 次の
コ マ ン ド を 使い ま す。
set forceplan [on|off]
こ の場合で も 、 各テーブルへ の ア ク セ ス は、 ク エ リ ・ プ ロ セ ッ サ に よ
り 最適な方法が選択 さ れて行われ ま す。 forceplan を 使用 し て ジ ョ イ ン
順 を 指定す る と 、 ク エ リ ・ プ ロ セ ッ サは、 別の テーブル順序では使わ
れ る イ ン デ ッ ク ス と は違 う イ ン デ ッ ク ス を 使用 し た り 、 存在す る イ ン
デ ッ ク ス を 使用で き な か っ た り し ま す。
他の ク エ リ 分析ツ ール を 使 っ た結果、 ク エ リ ・ プ ロ セ ッ サが最適な
ジ ョ イ ン順 を 選択 し て い な い と 考え ら れ る 場合は、 こ の コ マ ン ド を デ
バ ッ グ の補助 と し て使用で き ま す。 set statistics io on を 使い、 forceplan
を 指定 し た場合 と し な い場合の I/O を 比較す る こ と に よ っ て、 強制 し
た順序に よ り I/O と 論理読み込みが減少 し て い る か ど う か を 常に検証
し ま す。
forceplan を 指定す る 場合は、 定期的に パ フ ォ ー マ ン ス管理 を チ ェ ッ ク
し 、 forceplan を 使 う ク エ リ と プ ロ シ ー ジ ャ が、 パ フ ォ ー マ ン ス を 向上
さ せ る こ の オプ シ ョ ン を 必要 と し て い る こ と も 検証 し て く だ さ い。
240
Adaptive Server Enterprise
第7章
最適化の制御
ス ト ア ド ・ プロ シ ー ジ ャ の テキ ス ト に forceplan を 含め る こ と ができ
ま す。
set forceplan は、 ジ ョ イ ン ・ タ イ プでは な く ジ ョ イ ン順だけ を 指定 し
ま す。 ジ ョ イ ン ・ タ イ プ を 指定す る コ マ ン ド は あ り ま せん。 ただ し 、
サーバ ・ レ ベル ま た はセ ッ シ ョ ン ・ レ ベルで マ ー ジ ・ ジ ョ イ ン を 無効
に す る こ と は可能です。
セ ッ シ ョ ン ・ レ ベルでハ ッ シ ュ ・ ジ ョ イ ン を 無効に で き ま す。 さ ら
に、 抽象プ ラ ン を 使用す る こ と で、 ジ ョ イ ン順や ジ ョ イ ン ・ タ イ プ を
含む完全なプ ラ ン の指定がで き る こ と に注意 し て く だ さ い。
詳細に つ い ては、 「第 12 章 抽象プ ラ ン の作成 と 使用」 と 「マ ー ジ ・ ジ ョ
イ ン を 有効 ま た は無効に す る 」 (255 ペ ー ジ ) を 参照 し て く だ さ い。
ジ ョ イ ン順 を 強制的に指定す る 場合に は次の リ ス ク が伴い ま す。
•
誤 っ て使用 さ れ る と 、 ク エ リ の コ ス ト が著 し く 高 く な る 恐れが あ
る 。 statistics io を 使い、 forceplan を 使用す る 場合 と し な い場合で ク
エ リ を 常に入念に テ ス ト す る こ と 。
•
メ ン テナ ン ス が必要に な る 。 forceplan を 含む ク エ リ と ス ト ア ド ・
プ ロ シ ー ジ ャ を 定期的に チ ェ ッ ク す る 必要が あ る 。 ま た、 Adaptive
Server の新 し い各バー ジ ョ ン で、 イ ン デ ッ ク ス を 強制的に使用 さ
せ る 原因 と な っ て い た問題が解決 さ れ る 可能性が あ る た め、 新 し
い バー ジ ョ ン の イ ン ス ト ール時に、 強制 さ れた ク エ リ ・ プ ラ ン を
使 う すべて の ク エ リ を 常に チ ェ ッ ク し て く だ さ い。
forceplan を 使用す る 前に、 次の点に注意 し て く だ さ い。
•
showplan 出力 を 調べて、 イ ン デ ッ ク ス ・ キーが意図 し た と お り に
使われて い る か ど う か を 判断す る 。
•
set option show normal を使用し て、ほか に最適化の問題がな い か探す。
•
イ ン デ ッ ク ス で update statistics を 実行す る 。
•
update statistics コ マ ン ド を 使い、 イ ン デ ッ ク ス な し の検索句の探索
引数の統計値 を ク エ リ に追加す る 。 特に複合 イ ン デ ッ ク ス の マ イ
ナー ・ キー と 一致す る 探索引数の場合。
•
set オプ シ ョ ン の show_missing_stats on を 使用 し て、 統計が必要な
カ ラ ム を 探す。
•
ク エ リ が 5 つ以上の テーブル を ジ ョ イ ン す る 場合は、set table count
を 使 っ て ジ ョ イ ン順が良 く な る か ど う か を 確認す る 。
「 ク エ リ ・ プ ロ セ ッ サが検討す る テーブル数 を 指定す る 」 (242 ペ ー
ジ ) を 参照 し て く だ さ い。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
241
クエリ・プロセッサが検討するテーブル数を指定する
クエリ・プロセッサが検討するテーブル数を指定する
15.0 よ り 前の バー ジ ョ ン では、 Adaptive Server は一度に 2 つ か ら 4 つ
の順列 を 検討す る こ と に よ っ て ジ ョ イ ン を 最適化 し ま す。 バー ジ ョ ン
15.0 以降では、 ク エ リ ・ プ ロ セ ッ サ に よ り 検討 さ れ る 順列の数に制限
は あ り ま せん。 そ の代わ り 、 新 し い検索エ ン ジ ン に は、 ク エ リ の最適
化に大幅な時間がか か ら な い よ う に す る た め に、 タ イ ム ア ウ ト ・ メ カ
ニズ ム を 導入 し て い ま す。 こ の項で後述す る set table count 設定は、 検
索エ ン ジ ン に よ り 検出 さ れ る 初期ジ ョ イ ン順に引き続き影響す る た
め、 タ イ ム ア ウ ト と な っ た と き の最終ジ ョ イ ン 順に影響が あ り ま す。
検索エ ン ジ ン が タ イ ム ア ウ ト に な っ た と き に選択 さ れて い る ジ ョ イ ン
順が不適切で あ る と 考え ら れ る 場合は、 set table count を 使 っ て検討 さ
れ る テーブルの数 を 増加 し ま す。 こ れ に よ り 、 順列の開始時に検索エ
ン ジ ン に よ り 検討 さ れ る 初期ジ ョ イ ン順が変化 し ま す。
Adaptive Server は引き続き、 一度に 2 つ か ら 4 つ の テーブルの順列 を
検討す る こ と に よ っ て joins を 最適化 し ま すが、 ジ ョ イ ン ・ ク エ リ で、
選択 さ れて い る ジ ョ イ ン順が不適切で あ る と 考え ら れ る 場合は、 set
table count を 使 っ て同時に検討 さ れ る テーブルの数 を 増やす こ と がで
き ま す。
set table count int_value
有効値は 0 か ら 8 です。 0 はデ フ ォ ル ト の動作 を リ ス ト ア し ま す。
た と えば、 一度に 4 つ の テーブルの最適化 を 行 う に は、 次の コ マ ン ド
を 使用 し ま す。
set table count 4
値 を 小 さ く す る と 、 ク エ リ ・ プ ロ セ ッ サがすべて の ジ ョ イ ン順の候補
を 検討す る 可能性が減 り ま す。 ジ ョ イ ン 順 を 決め る 際に検討 さ れ る
テーブルの数 を 増やす と 、 ク エ リ を 最適化す る た め に要す る 時間が非
常に長 く な る 可能性が あ り ま す。
テーブルが増え る ご と に ク エ リ の最適化に要す る 時間が増大す る た
め、 set table count オプ シ ョ ン は、 ジ ョ イ ン順の改良に よ る 実行時間の
短縮分が、 最適化の た め の時間の増加分 を 上回 る 場合に、 た い へん有
効 と な る オプ シ ョ ン です。 以下は、 そ の例です。
242
•
よ り 最適な ジ ョ イ ン 順 を 指定す る こ と で、 ク エ リ の最適化 と 実行
時間の合計が短縮で き る と 考え ら れ る 場合。 特に い っ た ん プ ラ ン
がプ ロ シ ー ジ ャ ・ キ ャ ッ シ ュ に入れ ら れた後、 何度 も 実行 さ れ る
と 予想 さ れ る ス ト ア ド ・ プ ロ シ ー ジ ャ な ど の場合。
•
後で使用す る た め の抽象プ ラ ン を 保存す る 場合。
Adaptive Server Enterprise
第7章
最適化の制御
statistics time を 使 っ て解析時間 と コ ン パ イ ル時間 を 調べ、 statistics io を
使 っ て ジ ョ イ ン順の改良に よ っ て物理 I/O と 論理 I/O が減 っ て い る こ
と を 確か め ま す。
table count を 増や し て ジ ョ イ ン の最適化は向上 し て も 、 CPU 時間が受
け入れがた い ほ ど 増大す る 場合は、 ク エ リ の from 句 を 書き直 し て、
showplan 出力が示す ジ ョ イ ン順でテーブル を 指定 し 、 forceplan を 使用
し て ク エ リ を 実行 し ま す。 定期的な パ フ ォ ー マ ン ス管理チ ェ ッ ク で、
指定 し た ジ ョ イ ン順が良好な パ フ ォ ー マ ン ス を 維持 し て い る こ と を 確
か め て く だ さ い。
クエリにインデックスを指定する
select 文、 update 文、 お よ び delete 文に (index index_name 句 を 使用 し て、
ク エ リ に使用す る イ ン デ ッ ク ス を 指定で き ま す。 テーブル名 を 指定す
る こ と に よ っ て、 ク エ リ で強制的に テーブル ・ ス キ ャ ン を 実行 さ せ る
こ と も で き ま す。 構文は次の と お り です。
select select_list
from table_name [correlation_name]
(index {index_name | table_name } )
[, table_name ...]
where ...
delete table_name
from table_name [correlation_name]
(index {index_name | table_name }) ...
update table_name set col_name = value
from table_name [correlation_name]
(index {index_name | table_name})...
例:
select pub_name, title
from publishers p, titles t (index date_type)
where p.pub_id = t.pub_id
and type = "business"
and pubdate > "1/1/93"
ク エ リ ・ プ ロ セ ッ サが最適な ク エ リ ・ プ ラ ン を 選択 し て い な い と 考え
ら れ る 場合に、 ク エ リ に イ ン デ ッ ク ス を 指定す る と 有効です。 イ ン
デ ッ ク ス を 指定す る 場合は、 次の点に注意 し て く だ さ い。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
243
クエリにインデックスを指定する
•
ク エ リ の statistics io を 常に チ ェ ッ ク し て、 選択 さ れた イ ン デ ッ ク
ス が必要 と す る I/O の方が、 ク エ リ ・ プ ロ セ ッ サが選ぶ方法よ り
も 少な い か ど う か を 確認す る 。
•
ク エ リ 句に対 し て有効な値の すべて の範囲 を テ ス ト す る 。 特に次
の場合な ど 。
•
デー タ の分散が偏 っ て い る テーブルの ク エ リ を 調整す る 。
•
範囲 ク エ リ を 実行す る 。 範囲 ク エ リ の ア ク セ ス方式は範囲の
サ イ ズ に よ っ て影響 を 受けやす い た め。
イ ン デ ッ ク ス ・ オプ シ ョ ン を 指定 し た方が ク エ リ が向上す る こ と がテ
ス ト 結果か ら 明 ら か に な っ た場合に だけ、 (index index_name を 使用 し
ま す。 ク エ リ に こ の イ ン デ ッ ク ス ・ オプ シ ョ ン を 指定 し た場合は、 結
果の プ ラ ン が ク エ リ ・ プ ロ セ ッ サが選ぶほ か の方法よ り も 優れて い る
こ と を 定期的に チ ェ ッ ク し て く だ さ い。
ノ ン ク ラ ス タ ー ド ・ イ ン デ ッ ク ス と テーブル と が同 じ 名前で あ る 場合
は、 テーブル名 を 指定 し た つ も り で も ノ ン ク ラ ス タ ー ド ・ イ ン デ ッ ク
ス が使われ ま す。 select select_list from tablename (0) を 使用す る と 、
テーブル ・ ス キ ャ ン を 強制的に実行で き ま す。
イ ン デ ッ ク ス を 指定す る と 、 次の リ ス ク が伴い ま す。
244
•
デー タ の分布が変わ る と 、 強制 さ れた イ ン デ ッ ク ス の方がほ か の
選択よ り も 効率が良 く な い場合が あ る 。
•
イ ン デ ッ ク ス を 削除す る と 、 イ ン デ ッ ク ス を 指定す る すべて の ク
エ リ と プ ロ シ ー ジ ャ が、 イ ン デ ッ ク ス が存在 し な い こ と を 示す情
報 メ ッ セ ー ジ を 出力す る 。 こ の よ う な ク エ リ は、 最適な他の ア ク
セ ス方式で最適化 さ れ る 。
•
こ の オプ シ ョ ン を 使 う すべて の ク エ リ は定期的に チ ェ ッ ク し な け
ればな ら な い た め、 メ ン テナ ン ス ・ コ ス ト が増加す る 。 ま た、
Adaptive Server の新 し い各バー ジ ョ ン で、 イ ン デ ッ ク ス を 強制的
に使用 さ せ る 原因 と な っ て い た問題が解決 さ れ る 可能性が あ る た
め、 強制 さ れた イ ン デ ッ ク ス を 使 う すべて の ク エ リ は新 し い バー
ジ ョ ン の イ ン ス ト ール時に常に チ ェ ッ ク す る 必要が あ る 。
•
イ ン デ ッ ク ス は、 イ ン デ ッ ク ス を 使 う ク エ リ が最適化 さ れ る と き
に存在 し て い な ければな ら な い。 イ ン デ ッ ク ス を 作成 し て か ら 、
同一の バ ッ チ内の ク エ リ に こ の イ ン デ ッ ク ス を 使用す る こ と はで
き な い。
Adaptive Server Enterprise
第7章
最適化の制御
ク エ リ に イ ン デ ッ ク ス を 指定す る 前に、 次の点に注意 し て く だ さ い。
•
showplan 出力 を チ ェ ッ ク し て、 “Keys are” メ ッ セ ー ジ を 探 し 、 期
待 さ れた と お り に イ ン デ ッ ク ス ・ キーが使われて い る こ と を 確認
する。
•
dbcc traceon(3604) ま た は set option show normal を 使用 し て、 ほ か に
最適化の問題がな い か探す。
•
イ ン デ ッ ク ス で update statistics を 実行す る 。
•
イ ン デ ッ ク ス が複合 イ ン デ ッ ク ス で、 イ ン デ ッ ク ス を 探索引数 と
し て使用す る 場合は、 イ ン デ ッ ク ス の マ イ ナー ・ キーで update
statistics を 実行す る 。 こ れ に よ り 、 ク エ リ ・ プ ロ セ ッ サの コ ス ト 見
積 も り 能力が大幅に向上す る 。 検索句で頻繁に使用す る 他の カ ラ
ム の統計 を 作成 し て も 、 見積 も り 能力が向上す る 。
•
set オプ シ ョ ン の show_missing_stats on を 使用 し て、 統計が必要な
カ ラ ム を 探す。
クエリに I/O サイズを指定する
Adaptive Server に対 し て、 デ フ ォ ル ト ・ デー タ ・ キ ャ ッ シ ュ か名前
付きデー タ ・ キ ャ ッ シ ュ 内に大容量 I/O が設定 さ れて い る 場合、 ク エ
リ ・ プ ロ セ ッ サは、 ク エ リ に対 し て大容量 I/O を 使 う こ と を 決定で き
ま す。
•
テーブル全体 を ス キ ャ ン す る ク エ リ
•
>、 <、 > x、 < y、 between、 like “charstring %” な ど を 使 う ク エ リ で、
ク ラ ス タ ー ド ・ イ ン デ ッ ク ス を 使 う 範囲 ク エ リ
•
大量の イ ン デ ッ ク ス ・ リ ー フ ・ ペ ー ジ を ス キ ャ ン す る ク エ リ
テーブル ま た は イ ン デ ッ ク ス が使 う キ ャ ッ シ ュ が 16K I/O に設定 さ れ
て い る 場合は、 1 つ の I/O で同時に 8 ペ ー ジ ま で読み込む こ と がで き
ま す。 名前付きデー タ ・ キ ャ ッ シ ュ ご と に複数の プール を 設定で き、
プールご と に異な っ た I/O サ イ ズ を 設定で き ま す。 I/O サ イ ズ を ク エ
リ に指定す る と 、 そ の ク エ リ に使用 さ れ る I/O は指定 し た I/O サ イ ズ
の プールで実行 さ れ ま す。 名前付きデー タ ・ キ ャ ッ シ ュ の設定の詳細
に つ い ては、 『シ ス テ ム管理ガ イ ド 第 2 巻』 を 参照 し て く だ さ い。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
245
クエリに I/O サイズを指定する
ク エ リ ・ プ ロ セ ッ サが選んだ I/O サ イ ズ と 異な る I/O サ イ ズ を 指定す
る に は、 select 文、 delete 文、 ま た は update 文の index 句に prefetch を 指
定 し ま す。 構文は次の と お り です。
select select_list
from table_name
( [index {index_name | table_name} ]
prefetch size)
[, table_name ...]
where ...
delete table_name from table_name
( [index {index_name | table_name} ]
prefetch size)
...
update table_name set col_name = value
from table_name
( [index {index_name | table_name} ]
prefetch size)
...
有効な プ リ フ ェ ッ チ ・ サ イ ズはペ ー ジ ・ サ イ ズ に よ っ て異な り ま す。
オブ ジ ェ ク ト が使 う デー タ ・ キ ャ ッ シ ュ 内に指定 し たサ イ ズ の プール
が存在 し な い場合は、 ク エ リ ・ プ ロ セ ッ サは使用可能なサ イ ズ の な か
で最適なサ イ ズ を 選択 し ま す。
au_lname に ク ラ ス タ ー ド ・ イ ンデ ッ ク スが設定 さ れて い る 場合は、 次の
ク エ リ はデー タ ・ ペー ジ を ス キ ャ ン す る と き に 16K I/O を実行し ま す。
select *
from authors (index au_names prefetch 16)
where au_lname like "Sm%"
通常は大容量 I/O を 実行す る ク エ リ に対 し て、 2K I/O の場合の I/O パ
フ ォ ー マ ン ス を 調べた い場合に は、 次の よ う に I/O サ イ ズ を 2K に指
定 し ま す。
select type, avg(price)
from titles (index type_price prefetch 2)
group by type
注意 大容量 I/O は、 論理ペ ー ジ ・ サ イ ズが 2K の サーバ に基づ き ま す。
ペー ジ ・ サ イ ズが 8K のサーバでは、 I/O の基本単位は 8K に な り ま
す。 ペー ジ ・ サ イ ズが 16K の サーバでは、 I/O の基本単位は 16K に な
り ま す。
246
Adaptive Server Enterprise
第7章
最適化の制御
インデックス・タイプと大容量 I/O サイズ
prefetch を 使 っ て I/O サ イ ズ を 指定す る と 、 デー タ ・ ペ ー ジ と リ ー フ レ
ベル ・ イ ン デ ッ ク ス ・ ペ ー ジ の両方が影響 を 受け ま す。 表 7-1 に、 そ
の影響 を 示 し ま す。
表 7-1: アクセス方式とプリフェッチ
アクセス方式
テーブル ・ ス キ ャ ン
ク ラ スター ド ・
イ ンデ ッ ク ス
ノ ン ク ラ スター ド ・
イ ンデ ッ ク ス
大容量 I/O の処理対象
デー タ ・ ペー ジ数
全ペー ジ ロ ッ ク ・ テーブルではデー タ ・ ペー ジ の み
デー タ オ ン リ ー ロ ッ ク ・ テーブルではデー タ ・ ペー
ジ と リ ー フ レ ベル ・ イ ン デ ッ ク ス ・ ペー ジ
ノ ン ク ラ ス タ ー ド ・ イ ン デ ッ ク ス のデー タ ・ ペー ジ
と リ ー フ ・ ペー ジ
showplan は、 デー タ お よ び リ ー フ レ ベル ・ ペー ジ の両方で使用 さ れ る
I/O サ イ ズ を レ ポー ト し ま す。
詳細に つ い ては、 「I/O サ イ ズ の メ ッ セ ー ジ」 (64 ペー ジ ) を 参照 し て く
だ さ い。
prefetch の指定が使用されない場合
通常は、 ク エ リ に I/O サ イ ズ を 指定す る と 、 ク エ リ ・ プ ロ セ ッ サは こ
の I/O サ イ ズ を ク エ リ の プ ラ ン に取 り 込み ま す。 し か し 、 場合に よ っ
ては、 指定 し た と お り の大容量 I/O が行われな い こ と が あ り ま す。 こ
れ に は ク エ リ 全般に関 し て一切行われな い場合 と 、 ま た は あ る 1 回の
容量 I/O 要求に つ い て行われな い場合の双方が あ り ま す。
次の場合に は、 ク エ リ に大容量 I/O を 使用で き ま せん。
•
指定サ イ ズ の I/O 用に キ ャ ッ シ ュ が構成 さ れて い な い。 ク エ リ ・
プ ロ セ ッ サは使用可能なサ イ ズ の う ち 最適なサ イ ズで代用 し て
い る。
•
sp_cachestrategy を 使用 し て、 テーブル ま た は イ ン デ ッ ク ス に対す
る 大容量 I/O を オ フ に し て い る 。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
247
クエリに I/O サイズを指定する
次の場合に は、 シ ン グル ・ バ ッ フ ァ に大容量 I/O を 使用で き ま せん。
•
そ の I/O 要求に含ま れ る ペ ー ジ の いずれかが別の プール内に あ る 。
•
ペー ジ が ア ロ ケ ー シ ョ ン ・ ユニ ッ ト の最初の エ ク ス テ ン ト に あ
る 。 こ の エ ク ス テ ン ト は、 そ の ア ロ ケ ー シ ョ ン ・ ユニ ッ ト に対す
る ア ロ ケ ー シ ョ ン ・ ペー ジ を 保持 し て お り 、 デー タ ・ ペー ジ は 7
ペー ジ し か な い。
•
要求 し た I/O サ イ ズ に対応す る プール内に、 使用で き る バ ッ フ ァ
がな い。
大容量 I/O が実行で き な い場合、 Adaptive Server は、 ク エ リ に よ っ て
必要 と さ れ る エ ク ス テ ン ト 内に あ る 特定の ペ ー ジ ( 複数可 ) に つ い て、
常に 2K I/O を 実行 し ま す。
prefetch 指定に従 っ て い る か ど う か を 判別す る に は、 showplan を 使用 し
て ク エ リ ・ プ ラ ン を 表示 し 、 statistics io を 使用 し て ク エ リ に対す る I/O
処理の結果 を 調べ ま す。 sp_sysmon を 使用す る と 、 キ ャ ッ シ ュ ご と に
要求 さ れた大容量 I/O と 拒否 さ れた大容量 I/O に関す る 情報が レ ポー
ト さ れ ま す。
『パ フ ォ ーマ ン ス & チ ュ ーニ ン グ ・ シ リ ーズ : sp_sysmon に よ る
Monitoring Adaptive Server の監視』 の 「Data Cache Management ( デー
タ ・ キ ャ ッ シ ュ 管理 )」 (102 ペー ジ ) を参照し て く だ さ い。
prefetch を設定する
デ フ ォ ル ト では、 大容量 I/O プールが設定 さ れて い る 場合、 ク エ リ は
常に大容量 I/O を 使用 し 、 ク エ リ ・ プ ロ セ ッ サは常に大容量 I/O に
よ っ て ク エ リ の コ ス ト が減少す る と 判断 し ま す。 セ ッ シ ョ ン中に大容
量 I/O を 使用で き な い よ う に す る に は、 次の コ マ ン ド を 使用 し ま す。
set prefetch off
大容量 I/O を 再び使用可能に す る に は、 次の コ マ ン ド を 使用 し ま す。
set prefetch on
sp_cachestrategy を 使 っ て オブ ジ ェ ク ト の大容量 I/O を オ フ に し た場合
は、 set prefetch on はそ の設定 を 上書き し ま せん。
set prefetch off を 使 っ て セ ッ シ ョ ン の大容量 I/O を オ フ に し た場合は、
select 文、 delete 文、 ま た は insert 文の一部 と し てプ リ フ ェ ッ チ ・ サ イ
ズ を 指定 し て も そ の設定 を 上書き で き ま せん。
248
Adaptive Server Enterprise
第7章
最適化の制御
set prefetch コ マ ン ド は、 実行 さ れ る 同一の バ ッ チ内で有効に な る た
め、 プ ロ シ ー ジ ャ 内の ク エ リ の実行に影響 を 与え る よ う に ス ト ア ド ・
プ ロ シ ー ジ ャ 内に指定す る こ と がで き ま す。
キャッシュ方式を指定する
テーブル のデー タ ・ ペ ー ジ ま た は ノ ン ク ラ ス タ ー ド ・ イ ン デ ッ ク ス の
リ ー フ ・ レ ベル ( カ バー ド ・ ク エ リ ) を ス キ ャ ン す る ク エ リ に つ い て
は、 Adaptive Server の ク エ リ ・ プ ロ セ ッ サは、 使い捨て の MRU ( 最 も
最近に使用 さ れた ) 方式 と LRU ( 最 も 長い間使用 さ れて い な い ) 方式
と い う 2 つ の キ ャ ッ シ ュ 置換方式の ど ち ら か を 選択 し ま す。
『パ フ ォ ー マ ン ス & チ ュ ー ニ ン グ ・ シ リ ー ズ : 物理デ ー タ ベ ー ス の
チ ュ ーニ ン グ』 の 「 ヒ ープ ・ テーブル、 I/O、 キ ャ ッ シ ュ 方式」 (54 ペ ー
ジ ) を 参照 し て く だ さ い。
一般的に は ク エ リ ・ プ ロ セ ッ サは、 次の場合に は MRU 方式 を 選択 し
ま す。
•
テーブル ・ ス キ ャ ン を 実行す る ク エ リ
•
ク ラ ス タ ー ド ・ イ ン デ ッ ク ス を 使 う 範囲 ク エ リ
•
ノ ン ク ラ ス タ ー ド ・ イ ン デ ッ ク ス の リ ー フ ・ レ ベル を ス キ ャ ン す
る カ バー ド ・ ク エ リ
•
ジ ョ イ ン の内部テーブルのサ イ ズがキ ャ ッ シ ュ よ り も 大き い場合
の、 そ の内部テーブル
•
ジ ョ イ ン の外部テーブル ( 外部テーブルは 1 回だけ読み取ればよ
いため )
•
マ ー ジ ・ ジ ョ イ ン の両方の テーブル
オブ ジ ェ ク ト の キ ャ ッ シ ュ 方式 を 指定す る に は、 次の方法が あ り ま す。
•
•
select 文、 update 文、 ま た は delete 文に lru ま た は mru を 指定す る
sp_cachestrategy を 使 っ て mru 方式 を 使用不可に す る 、 ま た は再び
使用可能に す る
MRU 方式が指定 さ れ、 ペ ー ジ がデー タ ・ キ ャ ッ シ ュ 内に すで に存在
す る 場合は、 ペー ジ は ウ ォ ッ シ ュ ・ マ ー カ の位置では な く 、 キ ャ ッ
シ ュ の MRU 側の終端に置かれ ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
249
キャッシュ方式を指定する
キ ャ ッ シ ュ 方式 を 指定す る と 、 デー タ ・ ペー ジ と イ ン デ ッ ク ス の リ ー
フ ・ ペ ー ジ に だけ影響 し ま す。 ルー ト ・ ペー ジ と 中間ペー ジ は、 常に
LRU 方式 を 使い ま す。
select 文、delete 文、および update 文
select コ マ ン ド 、 delete コ マ ン ド 、 ま た は update コ マ ン ド に lru ま た は
mru を 使用 し て、 ク エ リ の I/O サ イ ズ を 指定で き ま す ( 正 し く 設定 し
た キ ャ ッ シ ュ に基づ く サ イ ズ の みが得 ら れ ま す。 た と えば、 4K を 指定
し て も 、 Adaptive Server で 4K の ペ ー ジ ・ サ イ ズ を 使用 し な い場合、
2K が返 さ れ ま す )。
select select_list
from table_name
(index index_name prefetch size [lru|mru])
[, table_name ...]
where ...
delete table_name from table_name (index index_name
prefetch size [lru|mru]) ...
update table_name set col_name = value
from table_name (index index_name
prefetch size [lru|mru]) ...
16K I/O の指定に LRU 置換方式 を 追加す る に は、 次の よ う に入力 し
ま す。
select au_lname, au_fname, phone
from authors (index au_names prefetch 16 lru)
詳細に つ い ては、 「 ク エ リ に I/O サ イ ズ を 指定す る 」 (245 ペー ジ ) を 参
照 し て く だ さ い。
250
Adaptive Server Enterprise
第7章
最適化の制御
大容量 I/O とキャッシュ方式の制御
sysindexes テーブルの ス テー タ ス ・ ビ ッ ト は、 テーブル ま た は イ ン
デ ッ ク ス を 大容量 I/O prefetch、 ま た は MRU 置換方式の対象 と す る か
ど う か を 示 し ま す。 デ フ ォ ル ト では、 ど ち ら も 使用可能です。 こ れ ら
の方式 を 使用不可に す る 、 ま た は再び使用可能に す る に は、
sp_cachestrategy を 使用 し ま す。
sp_cachestrategy dbname , [ownername.]tablename
[, indexname | "text only" | "table only"
[, { prefetch | mru }, { "on" | "off"}]]
authors テーブルの au_name_index に対 し て大容量 I/O prefetch 方式 を 使
用 し な い よ う に設定す る に は、 次の よ う に入力 し ま す。
sp_cachestrategy pubtune, authors, au_name_index,
prefetch, "off"
titles テーブル に対 し て MRU 置換方式 を 再び使用可能に す る に は、 次
の よ う に入力 し ま す。
sp_cachestrategy pubtune, titles, "table only",
mru, "on"
オブ ジ ェ ク ト に対す る キ ャ ッ シ ュ 方式の使用方法 を 変更ま た は表示で
き る の は、 シ ス テ ム管理者 と オブ ジ ェ ク ト 所有者だけ です。
キャッシュ方式に関する情報の取得
あ る オブ ジ ェ ク ト に対 し て使われて い る キ ャ ッ シ ュ 方式 を 確認
す る に は、 次の よ う にデー タ ベ ー ス名 と オブ ジ ェ ク ト 名 を 指定 し て
sp_cachestrategy を 実行 し ま す。
sp_cachestrategy
object name
---------------titles
pubtune, titles
index name
large IO MRU
---------------- -------- -------NULL
ON
ON
showplan 出力は、 ワ ー ク テーブル を 含む各オブ ジ ェ ク ト の キ ャ ッ シ ュ
方式 を 表示 し ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
251
非同期ログ・サービス
非同期ログ・サービス
非同期 ロ グ ・ サー ビ ス (ALS: Asynchronous log service) に よ っ て
Adaptive Server の ス ケ ー ラ ビ リ テ ィ が向上 し 、 ハ イ エ ン ド の対称型マ
ルチプ ロ セ ッ サ ・ シ ス テ ム に対 し てサブ シ ス テ ム を ロ ギ ン グす る 場合
の ス ループ ッ ト が向上 し ま す。
エ ン ジ ン数が 4 以上な い と 、 ALS を 使用で き ま せん。
ALS の有効化、 無効化、 設定に は sp_dboption ス ト ア ド ・ プ ロ シ ー
ジ ャ を 使用で き ま す。
sp_dboption <db Name>, "async log service",
"true|false"
sp_dboption の発行後に、 ALS オプ シ ョ ン を 設定す る デー タ ベ ー ス内で
checkpoint を 発行す る 必要が あ り ま す。
sp_dboption "mydb", "async log service", "true"
use mydb
checkpoint
checkpoint を 使用 し て、 1 つ のデー タ ベ ー ス ま た は複数のデー タ ベー ス
を 指定 し た り 、 all 句 を 使用で き ま す。
checkpoint [all | [dbname[, dbname[, dbname.....]]]
ALS を 無効に す る に は、 次の よ う に入力 し ま す。
sp_dboption "mydb", "async log service", "false"
use mydb
checkpoint
-------------
デー タ ベー ス に ア ク テ ィ ブなユーザが い な い こ と を 確認 し て か ら 、
ALS を 無効に し ま す。 ALS を 無効に す る と き に
Error 3647: Cannot put database in single-user mode.
Wait until all users have logged out of the database and
issue a CHECKPOINT to disable "async log service".
252
Adaptive Server Enterprise
第7章
最適化の制御
sp_helpdb を 使用 し て、 指定 し たデー タ ベ ー ス で ALS が有効に な っ て
い る か ど う か を 調べ ま す。
sp_helpdb "mydb"
---------mydb
3.0 MB sa
2
July 09, 2002
select into/bulkcopy/pllsort, trunc log on chkpt,
async log service
こ れ ら の ス ト ア ド ・ プ ロ シ ー ジ ャ の詳細に つ い ては、 『Adaptive Server
リ フ ァ レ ン ス ・ マ ニ ュ ア ル : プ ロ シ ー ジ ャ 』 を 参照 し て く だ さ い。
ユーザ・ログ・キャッシュ (ULC) アーキテクチャの理解
Adaptive Server の ロ ギ ン グ ・ ア ー キテ ク チ ャ では、 ユーザ ・ ロ グ ・
キ ャ ッ シ ュ (ULC: User Log Cache) を 使用 し ま す。 こ れ に よ り 、 タ ス ク
ご と に ロ グ ・ キ ャ ッ シ ュ が割 り 当て ら れ ま す。 タ ス ク は、 ほ か の タ ス
ク の キ ャ ッ シ ュ に書き込む こ と はで き ま せん。 ま た、 ト ラ ン ザ ク シ ョ
ン に よ っ て ロ グ ・ レ コ ー ド が生成 さ れ る たび に、 タ ス ク はユーザ ・ ロ
グ ・ キ ャ ッ シ ュ へ の書き込み を 続け ま す。 ト ラ ンザ ク シ ョ ン が コ ミ ッ
ト ま た は ア ボー ト さ れた と き、 ま た は ロ グ ・ キ ャ ッ シ ュ が満杯に な る
と 、 ULC は共通の ロ グ ・ キ ャ ッ シ ュ へ フ ラ ッ シ ュ さ れ、 現在の すべ
て の タ ス ク か ら 共有可能 と な っ た後にデ ィ ス ク に書き込ま れ ま す。
ULC の フ ラ ッ シ ュ は、 コ ミ ッ ト ま た は ア ボー ト 操作が発生 し た と き
に最初に実行 さ れ ま す。 フ ラ ッ シ ュ の手順は次の と お り です。 各手順
に よ っ て、 遅延ま た は競合の増加 を 引き起 こ す可能性が あ り ま す。
1
最後の ロ グ ・ ペー ジ上で ロ ッ ク を 取得 し ま す。
2
必要に応 じ て、 新 し い ロ グ ・ ペ ー ジ を 割 り 当て ま す。
3
ULC か ら ロ グ ・ キ ャ ッ シ ュ へ ロ グ ・ レ コ ー ド を コ ピ ー し ま す。
手順 2 と 手順 3 の プ ロ セ ス を 実行す る に は、 最後の ロ グ ・ ペ ー ジ
上で ロ ッ ク を 取得 し て い る 必要が あ り ま す。 こ れ に よ り 、 ほ か の
タ ス ク に よ る ロ グ ・ キ ャ ッ シ ュ へ の書き込みや、 コ ミ ッ ト ま た は
ア ボー ト 操作の実行 を 防ぐ こ と がで き ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
253
非同期ログ・サービス
4
ロ グ ・ キ ャ ッ シ ュ を デ ィ ス ク に フ ラ ッ シ ュ し ま す。
手順 4 では、 ダーテ ィ ・ バ ッ フ ァ で write コ マ ン ド を 発行す る た め
に、 ロ グ ・ キ ャ ッ シ ュ の ス キ ャ ン を 繰 り 返 し 実行す る 必要が あ り
ま す。
ス キ ャ ン を 繰 り 返す と 、 ロ グがバ イ ン ド さ れて い る バ ッ フ ァ ・
キ ャ ッ シ ュ の ス ピ ン ロ ッ ク 競合が発生す る 可能性が あ り ま す。 ま
た ト ラ ン ザ ク シ ョ ン の負荷が大き い場合、 こ の ス ピ ン ロ ッ ク で の
競合が著 し い こ と が あ り ま す。
ALS の使用が適する場合
次の パ フ ォ ー マ ン ス上の問題の中か ら 、 少な く と も 1 つ以上が当ては
ま り 、 対象の シ ス テ ム がオ ン ラ イ ン ・ エ ン ジ ン を 4 つ以上実行 し て い
る 場合に は、 特定のデー タ ベー ス に対 し て ALS を 有効に で き ま す。
•
最後の ロ グ ・ ペー ジ で競合が多発す る
Task Management ( タ ス ク 管理 ) レ ポー ト ・ セ ク シ ョ ン の
sp_sysmon の出力が非常に高い値 を 示 し て い る 場合、 最後の ロ グ ・
ペー ジ で競合が発生 し て い る こ と がわ か り ま す。 次に例 を 示 し
ま す。
Task Management
----------------------Log Semaphore Contention
•
per sec
--------58.0
per xact
---------0.3
count
% of total
-------- -------34801
73.1%
ロ グ ・ デバ イ ス で帯域幅 を 十分に活用 し て い な い
注意 複数のデー タ ベー ス環境に ALS を 設定す る と 、 ス ループ ッ ト と
応答時間に予期 し な い変動が発生す る 可能性が あ る た め、 単一のデー
タ ベ ー ス環境で高 ト ラ ン ザ ク シ ョ ン が要求 さ れ る 場合の み ALS を 使
用し て く だ さ い。 複数のデー タ ベー ス に対し て ALS を設定す る 場合は、
最初に ス ループ ッ ト と 応答時間が正常で あ る こ と を チ ェ ッ ク し て く だ
さ い。
254
Adaptive Server Enterprise
第7章
最適化の制御
ALS の使用
ダーテ ィ ・ バ ッ フ ァ ( デ ィ ス ク に書き込ま れて い な いデー タ で い っ ぱ
い の バ ッ フ ァ ) の ス キ ャ ン、 デー タ の コ ピ ー、 デー タ の ロ グへ の書き
込み に使用す る ス レ ッ ド に は、 次の 2 つ が あ り ま す。
•
ユーザ ・ ロ グ ・ キ ャ ッ シ ュ (ULC) フ ラ ッ シ ャ - ULC フ ラ ッ シ ャ
は、 タ ス ク の ユーザ ・ ロ グ ・ キ ャ ッ シ ュ を 一般の ロ グ ・ キ ャ ッ
シ ュ に フ ラ ッ シ ュ す る た め に使用 さ れ る シ ス テ ム ・ タ ス ク ・ ス
レ ッ ド です。 タ ス ク を コ ミ ッ ト す る 準備がで き た ら 、 ユーザは フ
ラ ッ シ ャ ・ キ ュ ーへ コ ミ ッ ト 要求 を 入れ ま す。 各エ ン ト リ に はハ
ン ド ルが あ り ま す。 ULC フ ラ ッ シ ャ では、 こ の ハ ン ド ル を 使 っ
て、 要求 を キ ュ ー に入れた タ ス ク の ULC に ア ク セ ス し ま す。 ULC
フ ラ ッ シ ャ ・ タ ス ク は絶えず フ ラ ッ シ ャ ・ キ ュ ー を 監視 し て、
キ ュ ー か ら 要求 を 削除 し 、 ULC ペー ジ を ロ グ ・ キ ャ ッ シ ュ に フ
ラ ッ シ ュ し ま す。
•
ロ グ ・ ラ イ タ - ULC フ ラ ッ シ ャ に よ っ て ULC ペ ー ジ が ロ グ ・
キ ャ ッ シ ュ に フ ラ ッ シ ュ さ れ る と 、 タ ス ク 要求は ウ ェ イ ク ア ッ
プ ・ キ ュ ー に入れ ら れ ま す。 ロ グ ・ ラ イ タ は ロ グ ・ キ ャ ッ シ ュ 内
の ダーテ ィ ・ バ ッ フ ァ ・ チ ェ ー ン を 監視 し 、 ダーテ ィ ・ バ ッ フ ァ
を 検出す る と write コ マ ン ド を 発行 し ま す。 そ し て、 ウ ェ イ ク ア ッ
プ ・ キ ュ ー内の ペ ー ジ がすべてデ ィ ス ク に書き込ま れた タ ス ク を
監視 し ま す。 ロ グ ・ ラ イ タ はダーテ ィ ・ バ ッ フ ァ ・ チ ェ ー ン を 巡
回チ ェ ッ ク す る の で、 バ ッ フ ァ が い つデ ィ ス ク へ の書き込み準備
がで き た か わ か り ま す。
マージ・ジョインを有効または無効にする
マ ー ジ ・ ジ ョ イ ン は、 デ フ ォ ル ト では allrows mix お よ び allrows_dss
optgoal に対 し てサーバ ・ レ ベルで有効に な っ て い ま す。 allrows_oltp を
含むそ の他の optgoals に は、 無効に な っ て い ま す。 マ ー ジ ・ ジ ョ イ ン
が無効に な っ て い る 場合、 サーバは無効に な っ て い な い そ の他の ジ ョ
イ ン ・ タ イ プ の み の コ ス ト を 検討 し ま す。 マ ー ジ ・ ジ ョ イ ン を サーバ
全体で有効に す る に は、 enable merge join を 1 に設定 し ま す。 15.0 よ り
以前の バー ジ ョ ン の Adaptive Server の enable sort-merge joins and JTC 設
定パ ラ メ ー タ は、 バー ジ ョ ン 15.0 以降の ク エ リ ・ プ ロ セ ッ サ に影響 を
与え ま せん。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
255
ハッシュ・ジョインを有効または無効にする
set merge_join on コ マ ン ド は、 サーバ ・ レ ベルの設定 を 上書き し ま す。
こ れに よ り 、 セ ッ シ ョ ン ま たはス ト ア ド ・ プ ロ シージ ャ でマージ ・
ジ ョ イ ン が使用で き る よ う に な り ま す。
マ ー ジ ・ ジ ョ イ ン を 有効に す る に は、 次の コ マ ン ド を 使い ま す。
set merge_join on
マ ー ジ ・ ジ ョ イ ン を 無効に す る に は、 次の コ マ ン ド を 使い ま す。
set merge_join off
ハッシュ・ジョインを有効または無効にする
ハ ッ シ ュ ・ ジ ョ イ ン は、 デ フ ォ ル ト では allrows_dss optgoal を 実行す る
と き に の み有効に な り ま す。 サーバ ・ レ ベルの設定 を 上書き し て、
セ ッ シ ョ ン ま た は ス ト ア ド ・ プ ロ シ ー ジ ャ でハ ッ シ ュ ・ ジ ョ イ ン を 使
用で き る よ う に す る に は、 set hash_join on を 使用 し ま す。
ハ ッ シ ュ ・ ジ ョ イ ン を 有効に す る に は、 次の コ マ ン ド を 使い ま す。
set hash_join on
ハ ッ シ ュ ・ ジ ョ イ ン を 無効に す る に は、 次の コ マ ン ド を 使い ま す。
set hash_join off
ジョイン推移閉包の有効化と無効化
Adaptive Server バー ジ ョ ン 15.0 以降では、 ジ ョ イ ン推移閉包は常に有
効で、 無効に す る こ と はで き ま せん。 検索エ ン ジ ン は、 タ イ ム ア ウ
ト ・ メ カ ニズム を 使用 し て最適化に大幅な時間がか か ら な い よ う に し
て い ま す。 現在は タ イ ム ア ウ ト の設定に よ り 、 ク エ リ ・ プ ロ セ ッ サの
推移閉包の実際の使用に影響がな い よ う に な っ て い る も の の、 タ イ ム
ア ウ ト の発生時に検索エ ン ジ ン が順列の開始に使用す る 初期ジ ョ イ ン
順に影響 を 与え る こ と が あ り ま す。 タ イ ム ア ウ ト 時に ジ ョ イ ン 順が不
適切で あ る と 考え ら れ る 場合は、 こ の点 も 考慮 し て く だ さ い。
256
Adaptive Server Enterprise
第7章
最適化の制御
デ フ ォ ル ト では、 最適化に時間がか か る た め、 サーバ ・ レ ベルで の ジ ョ
イ ン 推移閉包は有効 に な っ て い ま せ ん。 set jtc on を 使 っ て、 セ ッ シ ョ
ン ・ レ ベ ルで ジ ョ イ ン 推移閉包 を 有効 に で き ま す。 こ の コ マ ン ド は、
enable sort-merge joins and JTC 設定パ ラ メ ー タ (15.0 よ り 以前の バー ジ ョ
ン の Adaptive Server に提供 ) の サーバ ・ レ ベルの設定 を 上書き し ま す。
短時間で実行 さ れ る ク エ リ では、 複数の テーブルが含ま れ る 場合で も 、
ジ ョ イ ン 推移閉包 に よ っ て実行 コ ス ト の面で の 改善は ほ と ん ど な く 、
最適化時間が増加す る 可能性が あ り ま す。 た と えば、次の ク エ リ に ジ ョ
イ ン推移閉包 を 適用す る と 、追加 さ れた各テーブル に対 し 、可能な ジ ョ
イ ン の数が倍加 さ れ ま す。
select * from t1, t2, t3, t4, ... tN
where t1.c1 = t2.c1
and t1.c1 = t3.c1
and t1.c1 = t4.c1
...
and t1.c1 = tN.c1
ただ し 、 サ イ ズが非常に大き い テーブルの joins では、 ジ ョ イ ン推移閉包
に よ っ て追加 さ れた ジ ョ イ ン順の コ ス ト 計算に かか る 最適化時間が、 結
果 と し て ジ ョ イ ン順の応答時間を大幅に改善す る 場合があ り ま す。
set statistics time を 使 う と 、Adaptive Server の ク エ リ の最適化に か か る 時
間 を 確認で き ま す。 set jtc on を 使 っ て ク エ リ を 実行 し て最適化時間が
大幅に増加 し て も 、 よ り 最適な ジ ョ イ ン 順 を 選択す る こ と で ク エ リ の
実行 が 向上 す る 場合 は、 showplan 出力、 set option show_search_engine
normal 出力、 ま た は set option show_search_engine long 出力 を チ ェ ッ ク し
ま す。 ク エ リ ・ テキ ス ト に そ の効果的な ジ ョ イ ン 順 を 明示的に追加 し
ま す。 ジ ョ イ ン 推移閉包な し で ク エ リ を 実行で き、 ジ ョ イ ン 推移閉包
に よ っ て生成 さ れたすべて の可能な ジ ョ イ ン 順 を 確認す る た め に最適
化時間 を 増加 さ せ る こ と な く 、 実行時間 を 改善で き ま す。
ま た、 ジ ョ イ ン 推移閉包 を 有効に し て、 効果的な ク エ リ の抽象プ ラ ン
を 保存で き ま す。 次に、 有効な保存 さ れて い る プ ラ ン か ら こ れ ら の ク
エ リ を 読み込ん で実行す る と 、 保存 さ れて い る 実行プ ラ ン が使用 さ れ
て ク エ リ が最適化 さ れ、 最適化時間が非常に短縮 さ れ ま す。
抽象プ ラ ン の使用お よ びサーバ全体 に 対す る join transitive closure の設
定の詳細に つ い ては、 『パ フ ォ ー マ ン ス & チ ュ ーニ ン グ ・ シ リ ーズ : オ
プテ ィ マ イ ザ と 抽象プ ラ ン』 を 参照 し て く だ さ い。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
257
リテラルのパラメータ化の制御
リテラルのパラメータ化の制御
Adaptive Server バー ジ ョ ン 15.0.1 以降では、 SQL ク エ リ の リ テ ラ ル値
が自動的に パ ラ メ ー タ 記述に変換 さ れ る よ う に な り ま し た ( 変数 と 同
様の使用 )。
サーバ全体で enable literal autoparam を有効ま た は無効に す る に は、
次の コ マ ン ド を 使用 し ま す。
sp_configure "enable literal autoparam", [0 | 1]
1 を 指定す る と 、 リ テ ラ ル値が自動的に パ ラ メ ー タ 記述に変換 さ れ、
0 ( デ フ ォ ル ト ) を 指定す る と こ の機能が無効に な り ま す。
セ ッ シ ョ ン ・ レ ベルで リ テ ラ ルの パ ラ メ ー タ 化 を 設定す る に は、
次の コ マ ン ド を 使用 し ま す。
set literal_autoparam [off | on]
Adaptive Server の 15.0.1 以前の バー ジ ョ ン では、 1 つ以上の リ テ ラ ル
値 を 除い て 2 つ の ク エ リ が ま っ た く 同 じ 場合は、 ス テー ト メ ン ト ・
キ ャ ッ シ ュ に 2 つ の別個の ク エ リ ・ プ ラ ン を 格納す る か、
sysqueryplans に 2 つ の ロ ー を 追加 し て い ま し た。 た と えば、 次の ク エ
リ に対す る ク エ リ ・ プ ラ ン は、 ほぼ同一で あ っ て も 別個に格納 さ れて
い ま し た。
select count(*) from titles where total_sales > 100
select count(*) from titles where total_sales > 200
例
リ テ ラ ルの自動パ ラ メ ー タ 化 を 有効に す る と 、 上述の select
count(*) 例に示 さ れた SQL テキ ス ト が次の よ う に変換 さ れ ま す。
select count(*) from titles where total_sales > @@@V0_INT
@@@V0_INT は、 最初に リ テ ラ ル値 100 お よ び リ テ ラ ル値 200 を 示すパ
ラ メ ー タ に対 し て生成 さ れた名前です。
SQL テキ ス ト 内の すべて の イ ン ス タ ン ス の リ テ ラ ル値は、 最初に生成
さ れた パ ラ メ ー タ に よ っ て置き換え ら れ ま す。 次に例 を 示 し ま す。
select substring(name, 3, 4) from sysobjects where name in
('systypes', 'syscolumns')
こ れは次の よ う に変換 さ れ ま す。
select substring(name, 3, 4) from sysobjects where name in
(@@@V0_VCHAR1,@@@V1_VCHAR1)
258
Adaptive Server Enterprise
第7章
最適化の制御
3、 4、 systypes、 お よ び syscolumns の リ テ ラ ル値 を 置換す る 値の ど
ん な組み合わせで も 、 同 じ パ ラ メ ー タ の同 じ SQL テキ ス ト に変換 さ
れ、 ス テー ト メ ン ト ・ キ ャ ッ シ ュ を 有効に し た と き に同 じ ク エ リ ・ プ
ラ ン を 使用 し ま す。
リ テ ラ ルの自動パ ラ メ ー タ 化に は、 次の利点が あ り ま す。
•
ク エ リ の リ テ ラ ル値に関係な く 、 2 回目以降の ク エ リ の実行で コ
ン パ イ ル時間 を 短縮で き る 。
•
ス テー ト メ ン ト ・ キ ャ ッ シ ュ の メ モ リ 使用量、 抽象プ ラ ン お よ び
ク エ リ 測定基準に対す る sysqueryplans の ロ ー の数な ど 、 SQL テキ
ス ト の記憶領域量 を 削減で き る 。
•
ク エ リ ・ プ ラ ン の保存に使用す る プ ロ シ ー ジ ャ ・ キ ャ ッ シ ュ 量 を
削減で き る 。
•
有効に し た と き に、 Adaptive Server で自動的に行われ る た め、
Adaptive Server に ク エ リ を 送信す る ア プ リ ケ ー シ ョ ン を 変更す る
必要がな い。
リ テ ラ ルの自動パ ラ メ ー タ 化に は、 次の使用課題が あ り ま す。
•
Adaptive Server は、 select、 delete、 update、 お よ び insert の み の リ テ
ラ ル を パ ラ メ ー タ 化す る 。 insert 文の場合、 Adaptive Server は insert
... select 文の み を パ ラ メ ー タ 化 し 、 insert ... values 文 を パ ラ メ ー タ 化
し な い。
•
Adaptive Server は、 group by 句お よ び order by 句の式 ( 「id + 1」 )
の た め に、 select id + 1 from sysobjects group by id + 1 や
select id + 1 from sysobjects order by id + 1 の よ う な ク エ
リ を パ ラ メ ー タ 化 し な い。
•
Adaptive Server は、 テキ ス ト が 16384 バ イ ト を 超え る SQL 文 を ス
テー ト メ ン ト ・ キ ャ ッ シ ュ に キ ャ ッ シ ュ し な い (16K を 超え る
SQL 文はキ ャ ッ シ ュ さ れな い )。 SQL 文の リ テ ラ ル を 変数に変換
す る と 、 SQL テキ ス ト の サ イ ズが大幅に増加す る ( 特に リ テ ラ ル
数が多い場合 )。 リ テ ラ ルの自動パ ラ メ ー タ 化 を 有効に す る と 、 本
来はキ ャ ッ シ ュ さ れ る 一部の SQL 文がキ ャ ッ シ ュ さ れな く な る 。
•
univarchar リ テ ラ ルお よ び unichar リ テ ラ ルはサポー ト さ れて い
な い。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
259
クエリの並列度の指定
•
マルチバ イ ト 文字セ ッ ト を 使用 し て い る 場合、 enable literal
autoparam が自動的に無効に な る 。
•
2 つ の同 じ SQL 文で も 、 リ テ ラ ル値のデー タ 型が異な る と 、 同 じ
SQL テキ ス ト に変換 さ れな い。 た と えば、 次の 2 つ の SQL 文は
同 じ 結果 を 返すが、 デー タ 型が異な る た め に パ ラ メ ー タ 化が異
な る。
select name from sysobjects where id = 1
select name from sysobjects where id = 1.0
こ れ ら の文 を パ ラ メ ー タ 化す る と 、 次の よ う に な る 。
select name from sysobjects where id = @@@V0_INT
select name from sysobjects where id = @@@V0_NUMERIC
クエリの並列度の指定
select コ マ ン ド の from 句に parallel 拡張 と degree_of_parallelism 拡張 を 指
定す る と 、 ス キ ャ ン に使用 さ れ る ワ ー カ ー ・ プ ロ セ ス の数 を 制限で き
ま す。
parallel パーテ ィ シ ョ ン ・ ス キ ャ ン が実行 さ れ る 場合は、
degree_of_parallelism の値 を 分割の数以上に す る 必要が あ り ま す。 並列
イ ン デ ッ ク ス ・ ス キ ャ ン の場合は、 degree_of_parallelism に は任意の
値 を 指定 し ま す。
select 文の構文は次の よ う に な り ま す。
select...
[from {tablename}
[(index index_name
[parallel [degree_of_parallelism | 1]]
[prefetch size] [lru|mru])],
{tablename} [([index_name]
[parallel [degree_of_parallelism | 1]
[prefetch size] [lru|mru])] ...
表 7-2 は、 逐次ス キ ャ ン ま た は並列ス キ ャ ン を 実行す る 場合の、 index
キー ワ ー ド と parallel キー ワ ー ド を 組み合わせ る 方法 を示 し ま す。
260
Adaptive Server Enterprise
第7章
最適化の制御
表 7-2: 逐次実行と並列実行の場合のオプティマイザに対する指定
指定の対象 :
並列パーテ ィ シ ョ ン ・ ス キ ャ ン
並列 イ ン デ ッ ク ス ・ ス キ ャ ン
逐次テーブル ・ ス キ ャ ン
逐次 イ ン デ ッ ク ス ・ ス キ ャ ン
オプテ ィ マ イ ザが選択す る テー
ブル ・ ス キ ャ ン ま たは イ ン デ ッ
ク ス ・ ス キ ャ ン の並列ス キ ャ ン
オプテ ィ マ イ ザが選択す る テー
ブル ・ ス キ ャ ン ま たは イ ン デ ッ
ク ス ・ ス キ ャ ン の逐次ス キ ャ ン
使用コマンド :
(index tablename parallel N)
(index index_name parallel N)
(index tablename parallel 1)
(index index_name parallel 1)
(parallel N)
(parallel 1)
マ ー ジ ・ ジ ョ イ ン でテーブル に並列度 を 指定す る と 、 テーブルの ス
キ ャ ン と マ ー ジ ・ ジ ョ イ ン の両方で使用 さ れ る 並列度に影響が及び
ま す。
セ ッ シ ョ ン ・ レ ベルで set parallel_degree 1 コ マ ン ド を 指定 し て い る か、
ま た はサーバ ・ レ ベルで parallel degree 設定パ ラ メ ー タ を 指定 し 、 並列
処理 を 使用不可に設定 し て い る 場合は、 parallel オプ シ ョ ン は使用で き
ま せん。 parallel オプ シ ョ ン は、 こ れ ら の設定 を 上書き で き ま せん。
degree_of_parallelism に並列度 と し て設定で き る 最大値 を 超え る 値 を
指定す る と 、 Adaptive Server はそ の指定 を 無視 し ま す。
次の条件の いずれかが真で あ る 場合、 オプテ ィ マ イ ザは並列度に指定
さ れて い る 値 を 無視 し ま す。
•
カ ー ソ ル定義で from 句が使われて い る 。
•
サブ ク エ リ の内側の ク エ リ ・ ブ ロ ッ ク 内で、 from 句に parallel が使
用 さ れて い る 。 さ ら に、 オプテ ィ マ イ ザが、 サブ ク エ リ の フ ラ ッ
ト 化の処理中に、 テーブル を 一番外側の ク エ リ ・ ブ ロ ッ ク に移動
し な い。
•
テーブルが ビ ュ ー、 シ ス テ ム ・ テーブル、 仮想テーブルの ど れか。
•
テーブルが外部ジ ョ イ ン の内部テーブルで あ る 。
•
ク エ リ に よ り テーブル に対 し exists、 min、 ま た は max が指定 さ れ
てい る。
•
max scan parallel degree 設定パ ラ メ ー タ の値が 1 に設定 さ れて い る 。
•
分割 さ れて い な い ク ラ ス タ ー ド ・ イ ン デ ッ ク ス が指定 さ れて い る
か、 parallel オプ シ ョ ン だけが指定 さ れて い る 。
•
ノ ン ク ラ ス タ ー ド ・ イ ン デ ッ ク ス が カ バー さ れて い る 。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
261
最適化目標
•
ク エ リ が OR 方式 を 使用 し て処理 さ れ る 。
•
select 文が更新ま た は挿入に使用 さ れて い る 。
クエリ・レベルの parallel 句の例
1 つ の ク エ リ に並列度 を 指定す る に は、 テーブル名の次に parallel を 指
定 し ま す。 次の例は、 逐次処理で実行 さ れ ま す。
select * from titles (parallel 1)
次の例は、 ク エ リ で使用 さ れ る イ ン デ ッ ク ス を 指定 し 、 並列度 を 5 に
設定 し ま す。
select * from titles
(index title_id_clix parallel 5)
where ...
テーブル ・ ス キ ャ ン を 強制的に実行す る に は、 イ ン デ ッ ク ス名の代わ
り に テーブル名 を 使用 し ま す。
最適化目標
Adaptive Server では、 ク エ リ 環境に最 も 適 し た最適化目標 を 選択で き
ま す。
•
fastfirstrow – Adaptive Server か ら 最初の い く つ か の ロ ーがで き る だ
け速 く 返 さ れ る よ う に ク エ リ を 最適化 し ま す。
•
allrows_oltp – Adaptive Server で限定 さ れた数の最適化基準 ( 「最適
化基準」 (264 ペー ジ ) を 参照 ) を 使用 し て最適な ク エ リ ・ プ ラ ン を
選択す る よ う に ク エ リ を 最適化 し ま す。 allrows_oltp は、 純粋な
OLTP ク エ リ に最 も 効果的です。
•
allrows_mixed – Adaptive Server で merge_join や parallel な ど の最 も 利
用で き る 最適化手法 を 使用 し て最適な ク エ リ ・ プ ラ ン を 選択す る
よ う に ク エ リ を 最適化 し ま す。 デ フ ォ ル ト 最適化手法の
allrows_mixed は、 混合 ク エ リ 環境に最 も 効果的です。
•
allrows_dss – Adaptive Server でハ ッ シ ュ ・ ジ ョ イ ン、 高度集合処
理、 枝分かれ の多い ツ リ ー ・ プ ラ ン な ど 、 利用で き る すべて の最
適化手法 を 使用 し て最適な ク エ リ ・ プ ラ ン を 選択す る よ う に ク エ
リ を 最適化 し ま す。 DSS 環境では、 allrows_dss が最 も 効果的です。
262
Adaptive Server Enterprise
第7章
最適化の制御
最適化目標の設定
最適化目標は、 サーバ、 セ ッ シ ョ ン、 ク エ リ の レ ベルで設定で き ま
す。 サーバ ・ レ ベルの最適化目標はセ ッ シ ョ ン ・ レ ベルの目標で上書
き さ れ、 セ ッ シ ョ ン ・ レ ベルの目標は ク エ リ ・ レ ベルの目標で上書き
さ れ ま す。 つ ま り 、 各 レ ベルで異な る 最適化目標 を 設定で き ま す。
サーバ・レベル
サーバ ・ レ ベルで最適化目標 を 設定す る に は、 次の手段 を 使用で き
ま す。
•
sp_configure コ マ ン ド を 使用す る
•
Adaptive Server 設定 フ ァ イ ルの optimization goal 設定パ ラ メ ー タ を
変更す る
た と えば、 サーバ の最適化 レ ベル を fastfirstrow に設定す る に は、 次の
よ う に入力 し ま す。
sp_configure "optimization goal", 0, "fastfirstrow"
セッション・レベル
セ ッ シ ョ ン ・ レ ベルで最適化目標 を 設定す る に は、 set plan optgoal を 使
用 し ま す。 た と えば、 セ ッ シ ョ ン の最適化目標 を allrows に変更す る
に は、 次の よ う に入力 し ま す。
set plan optgoal allrows_oltp
現在の セ ッ シ ョ ン ・ レ ベル の最適化目標 を 確認す る に は、 次の よ う に
入力 し ま す。
select @@optgoal
クエリ・レベル
ク エ リ ・ レ ベルで最適化目標 を 設定す る に は、 select な ど の DML コ マ
ン ド を 使用 し ま す。 た と えば、 現在の ク エ リ に対す る 最適化目標 を
allrows_oltp に変更す る に は、 次の よ う に入力 し ま す。
select * from A order by A.a plan "(use optgoal allrows_oltp)"
ク エ リ ・ レ ベルで最適化目標に fastfirstrow を 設定す る 場合に の み、
Adaptive Server か ら 短時間で返 さ れ る ロ ー の数 を 指定で き ま す。 た と
えば、 次の よ う に入力 し ま す。
select * from A order by A.a plan "(use optgoal fastfirstrow 5)"
一部の例外
一般に、 select 文、 update 文、 お よ び delete 文 を 使用 し て ク エ リ ・ レ ベ
ルの最適化目標 を 設定で き ま す。 ただ し 、 次の場合は こ のガ イ ド ラ イ
ン に は当ては ま り ま せん。
•
純粋な insert 文に は ク エ リ ・ レ ベルの最適化目標 を 設定で き ま せ
んが、 select ... insert 文に は最適化目標 を 設定で き ま す。
•
fastfirstrow は select 文に の み有効です。 他の DML 文に使用す る と
エ ラ ーが発生 し ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
263
最適化基準
最適化基準
各セ ッ シ ョ ン に対 し て、 特定の最適化基準 を 設定で き ま す。 最適化基
準は、 Adaptive Server が ク エ リ ・ プ ラ ン を 作成す る と き に検討 さ れ る
可能性が あ る 特定ア ルゴ リ ズ ム ま た は関連手法 を 表 し ま す。 個々の最
適化基準 を オ ン ま た はオ フ に設定す る こ と で、 現在の セ ッ シ ョ ン の ク
エ リ ・ プ ラ ン を 微調整で き ま す。
注意 各最適化目標に は、 各最適化基準に対す る デ フ ォ ル ト 設定が あ
り ま す。 最適化基準 を リ セ ッ ト す る と 、 現在の最適化目標のデ フ ォ ル
ト 設定に影響が及び、 エ ラ ー ・ メ ッ セ ー ジ が表示 さ れ る こ と が あ り ま
すが、 Adaptive Server に よ り 新 し い設定が適用 さ れ ま す。
Sybase では、 特定 ク エ リ の微調整の必要が あ る 場合に限 っ て個々の最適化基
準 を設定 し 、 そ の場合 も 注意を 払 っ て行 う こ と を おすすめ し ま す。 最適化目
標の設定 を上書き す る と ク エ リ の管理が非常に複雑に な る 場合が あ り ま す。
最適化基準は、 必ず既存の セ ッ シ ョ ン ・ レ ベルの optgoal 設定の後に設定 し
ま す。 optgoal を明示的に設定す る と 、 最適化基準がデ フ ォ ル ト 値に戻 る 場合
が あ り ま す。
「デ フ ォ ル ト 最適化基準」 (267 ペー ジ ) を参照 し て く だ さ い。
最適化基準の設定
set コ マ ン ド を 使用 し て、 個々の基準 を 有効ま た は無効に し ま す。
た と えば、 ハ ッ シ ュ ・ ジ ョ イ ン ・ ア ルゴ リ ズ ム を 有効に す る に は、
次の よ う に入力 し ま す。
set hash_join 1
ハ ッ シ ュ ・ ジ ョ イ ン ・ ア ルゴ リ ズ ム を 無効に す る に は、 次の よ う に入
力 し ま す。
set hash_join 0
1 つ の オプ シ ョ ン を 有効に し て別の オプ シ ョ ン を 無効に す る に は、 次
の よ う に入力 し ま す。
set hash_join 1, merge_join 0
基準の説明
264
こ こ で説明す る ほ と ん ど の基準は、 オプテ ィ マ イ ザに よ り 選択 さ れ る
最終プ ラ ン に特定の ク エ リ ・ エ ン ジ ン演算子 を 使用で き る か ど う か を
決定 し ま す。
Adaptive Server Enterprise
第7章
最適化の制御
最適化基準は次の と お り です。
•
hash_join – ク エ リ ・ プ ロ セ ッ サがハ ッ シ ュ ・ ジ ョ イ ン ・ ア ルゴ リ
ズ ム を 使用で き る か ど う か を 決定 し ま す。 ハ ッ シ ュ ・ ジ ョ イ ン は
多 く の ラ ン タ イ ム ・ リ ソ ー ス を 消費す る 場合が あ り ま すが、 ジ ョ
イ ン す る カ ラ ム に有益な イ ン デ ッ ク ス がな い場合、 ま た は ジ ョ イ
ン す る テーブルの ロ ー の数の積に比べて比較的多 く の ロ ーが ジ ョ
イ ン条件 を 満たす場合に効果的です。
•
hash_union_distinct – ク エ リ ・ プ ロ セ ッ サがハ ッ シ ュ ・ ユニオ ン重
複削除ア ルゴ リ ズ ム を 使用で き る か ど う か を 決定 し ま す。 こ の ア
ルゴ リ ズ ム は、 重複す る ロ ーが少な い場合は効率的では あ り ま
せん。
•
merge_join – ク エ リ ・ プ ロ セ ッ サがマ ー ジ ・ ジ ョ イ ン ・ ア ルゴ リ ズ
ム を 使用で き る か ど う か を 決定 し ま す。 こ の ア ルゴ リ ズム は、 配
列 さ れた入力に依存 し ま す。 merge_join は、 イ ン デ ッ ク ス ・ ス
キ ャ ン を 行 っ た も の な ど 、 入力がマ ー ジ ・ キーで配列 さ れて い る
場合に最 も 効果的です。 入力 を 配列す る た め に、 sort 演算子が必
要に な る 場合は、 merge_join は あ ま り 効果的では あ り ま せん。
•
merge_union_all – ク エ リ ・ プ ロ セ ッ サが union all の マ ー ジ ・ ア ルゴ
リ ズ ム を 使用で き る か ど う か を 決定 し ま す。 merge_union_all は、
ユニオ ン入力の結果 ロ ー の順序 を 維持 し ま す。 merge_union_all は、
入力が配列 さ れ、 親演算子 ( マ ー ジ ・ ジ ョ イ ン な ど ) がそ の順序
を 活用で き る 場合に特に効果的です。 それ以外の場合は、
merge_union_all に sort 演算子が必要に な る 場合が あ り ま すが、
こ れ に よ り 効率が低下 し ま す。
•
merge_union_distinct – ク エ リ ・ プ ロ セ ッ サが union の マ ー ジ ・ ア ル
ゴ リ ズ ム を 使用で き る か ど う か を 決定 し ま す。 merge_union_distinct
は merge_union_all に似て い ま すが、 重複す る ロ ーが維持 さ れな い
点が異な り ま す。 merge_union_distinct に は配列 さ れた入力が必要
に な り 、 配列 し た状態で出力 し ま す。
•
multi_table_store_ind – ク エ リ ・ プ ロ セ ッ サが複数テーブル の ジ ョ イ
ン の結果に再 フ ォ ー マ ッ ト を 使用で き る か ど う か を 決定 し ま す。
multi_tablet_store_ind を使用す る と 、 ワ ー ク テーブル の使用が増加
す る 場合が あ り ま す。
•
nl_join – ク エ リ ・ プ ロ セ ッ サがネ ス ト ループ ・ ジ ョ イ ン ・ ア ルゴ
リ ズ ム を 使用で き る か ど う か を 決定 し ま す。
•
opportunistic_distinct_view – ク エ リ ・ プ ロ セ ッ サが重複削除の強制時
に よ り 柔軟な ア ルゴ リ ズ ム を 使用で き る か ど う か を 決定 し ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
265
最適化基準
•
parallel_query – ク エ リ ・ プ ロ セ ッ サが並列 ク エ リ 最適化 を 使用で き
る か ど う か を 決定 し ま す。
•
store_index – ク エ リ ・ プ ロ セ ッ サが再 フ ォ ー マ ッ ト を 使用で き る
か ど う か を 決定 し ま す。 こ れ に よ り ワ ー ク テーブルの使用が増加
す る 場合が あ り ま す。
•
append_union_all – ク エ リ ・ プ ロ セ ッ サが union all ア ペ ン ド ・ ア ル
ゴ リ ズム を 使用で き る か ど う か を 決定 し ま す。
•
bushy_search_space – ク エ リ ・ プ ロ セ ッ サが枝分かれの多い ツ リ ー
形状の ク エ リ ・ プ ラ ン を 使用で き る か ど う か を 決定 し ま す。 こ れ
に よ り 検索領域が増加す る 可能性が あ り ま すが、 パ フ ォ ー マ ン ス
を 向上 さ せ る た め の よ り 多 く の ク エ リ ・ プ ラ ン ・ オプ シ ョ ン が得
ら れ ま す。
•
distinct_hashing – ク エ リ ・ プ ロ セ ッ サがハ ッ シ ュ ・ ア ルゴ リ ズ ム を
使用 し て重複 を 排除で き る か ど う か を 決定 し ま す。 こ れは、 ロ ー
の数に比べて重複 し な い値が少な い場合に効率的です。
•
distinct_sorted – ク エ リ ・ プ ロ セ ッ サが単一パ ス ・ ア ルゴ リ ズ ム を
使用 し て重複 を 排除で き る か ど う か を 決定 し ま す。 distinct_sorted
は、 配列 さ れた入力ス ト リ ー ム に依存 し 、 入力が配列 さ れて い な
い場合は、 sort 演算子の数が増加す る 場合が あ り ま す。
•
group-sorted – ク エ リ ・ プ ロ セ ッ サが実行中グループ化ア ルゴ リ ズ
ム を 使用で き る か ど う か を 決定 し ま す。 group-sorted は、 グループ
化カ ラ ム で ソ ー ト さ れた入力ス ト リ ー ム に依存 し 、 出力に こ の順
序 を 維持 し ま す。
•
distinct_sorting – ク エ リ ・ プ ロ セ ッ サが ソ ー ト ・ ア ルゴ リ ズ ム を 使
用 し て重複 を 排除で き る か ど う か を 決定 し ま す。 distinct_sorting
は、 入力が配列 さ れて い な い場合 ( イ ン デ ッ ク ス がな い場合な ど )
に有益で、 ソ ー ト ・ ア ルゴ リ ズ ム に よ り 生成 さ れた出力順序は、
マ ー ジ ・ ジ ョ イ ン な ど に効果的です。
•
group_hashing – ク エ リ ・ プ ロ セ ッ サがグループ ・ ハ ッ シ ュ ・ ア ル
ゴ リ ズム を 使用 し て集合 を 処理で き る か ど う か を 決定 し ま す。
•
index_intersection – ク エ リ ・ プ ロ セ ッ サが、 複数 イ ン デ ッ ク ス ・ ス
キ ャ ン の積 を 検索領域の ク エ リ ・ プ ラ ン の一部 と し て使用で き る
か ど う か を 決定 し ま す。
266
Adaptive Server Enterprise
第7章
最適化の制御
関係演算子の すべて の ア ルゴ リ ズ ム が無効に な っ て い る 場合、 ク エ
リ ・ プ ロ セ ッ サはデ フ ォ ル ト ・ ア ルゴ リ ズ ム を 再び有効に し ま す。 た
と えば、 すべて の ジ ョ イ ン ・ ア ルゴ リ ズ ム (nl_join、 m_join、 お よ び
h_join) が無効に な っ て い る 場合、 ク エ リ ・ プ ロ セ ッ サは nl_join を 有効
に し ま す。
ク エ リ ・ プ ロ セ ッ サは、 ジ ョ イ ン す る テーブルが等価ジ ョ イ ン で接続
さ れて い な い場合な ど 、 セ マ ン テ ィ ッ ク 上の理由で も nl_join を 再び有
効に で き ま す。
デフォルト最適化
基準
fastfirstrow、 allrows_oltp、 allrows_mixed、 allrows_dss の各最適化目標に
は、 各最適化基準に対 し てデ フ ォ ル ト 設定 ( オ ン (1) ま た はオ フ (0))
が あ り ま す。 た と えば、 merge_join のデ フ ォ ル ト 設定は、 fastfirstrow お
よ び allrows_oltp に対 し てオ フ (0)、 allrows_mixed お よ び allrows_dss に対
し て オ ン (1) です。 各最適化基準のデ フ ォ ル ト 設定の リ ス ト に つ い て
は、 表 7-3 を 参照 し て く だ さ い。
Sybase では、 最適化基準 を 変更す る 前に、 最適化目標 を リ セ ッ ト し て
パ フ ォ ー マ ン ス を 評価す る こ と を おすすめ し ま す。 特定 ク エ リ の微調
整が必要な場合に の み、 最適化基準 を 変更 し て く だ さ い。
最適化基準
append_union_all
bushy_search_space
distinct_sorted
distinct_sorting
group_hashing
group_sorted
hash_join
hash_union_distinct
index_intersection
merge_join
merge_union_all
multi_gt_store_ind
nl_join
opp_distinct_view
parallel_query
store_index
表 7-3: 最適化基準のデフォルト設定
fastfirstrow
allrows_oltp
1
1
0
0
1
1
1
1
1
1
1
1
0
0
1
1
0
0
0
0
1
1
0
0
1
1
1
1
1
0
1
1
allrows_mixed
1
0
1
1
1
1
0
1
0
1
1
0
1
1
1
1
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
allrows_dss
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
267
最適化時間の制限
最適化時間の制限
optimization timeout limit 設定パ ラ メ ー タ を 使用 し て、 Adaptive Server が
ク エ リ を 最適化す る た め に費やす時間 を 制限で き ま す。 optimization
timeout limit は、 Adaptive Server が ク エ リ の最適化に費やせ る 時間 を 、
ク エ リ の処理に費やす合計時間の割合 と し て指定 し ま す。
タ イ ム ア ウ ト と な る の は、 次の場合です。
•
1 つ以上の完了プ ラ ン が最適なプ ラ ン と し て保持 さ れて い る 。
•
お よ び、 optimization timeout limit を 超過 し た。
サーバ ・ レ ベルで optimization timeout limit を 設定す る に は、 sp_configure
を 使用 し ま す。 た と えば、 最適化時間 を ク エ リ の合計処理時間の 10
パー セ ン ト に制限す る に は、 次の よ う に入力 し ま す。
sp_configure “optimization timeout limit”, 10
セ ッ シ ョ ン ・ レ ベルで optimization timeout limit を 設定す る に は、 次の コ
マ ン ド を 使用 し ま す。
set plan optimeoutlimit n
こ の コ マ ン ド に よ り サーバ の設定が上書き さ れ ま す。
デ フ ォ ル ト 値は 10 パーセ ン ト です。 1 か ら 1000 ま で の任意の値 を 指
定で き ま す。
サーバ ・ レ ベルでは、 ス ト ア ド ・ プ ロ シ ー ジ ャ の コ ン パ イ ル に サーバ ・
レ ベ ル の デ フ ォ ル ト ・ タ イ ム ア ウ ト 値 を 指定す る た め の optimization
timeout limit と い う 別の設定パ ラ メ ー タ が あ り ま す。 デ フ ォ ル ト 値は 40
パー セ ン ト です。 1 か ら 4000 ま で の任意の値 を 指定で き ま す。
optimization timeout limit の詳細に つ い ては、 「 ク エ リ 最適化の時間の
制限」 (19 ペー ジ ) を 参照 し て く だ さ い。
268
Adaptive Server Enterprise
第7章
最適化の制御
並列最適化の制御
ク エ リ を 並列処理で実行す る 目的は、 サーバか ら の合計作業量が多い
場合で も 、 応答時間 を 最短に す る こ と です。
Adaptive Server では、 並列処理 を 有効に し て制御す る た め に、 次の設
定パ ラ メ ー タ が提供 さ れて い ま す。
•
number of worker processes
•
max parallel degree
•
max resource granularity
•
max repartition degree
number of worker processes を 除い て、 こ れ ら の各設定パ ラ メ ー タ はサー
バ ・ レ ベル と セ ッ シ ョ ン ・ レ ベルで設定で き ま す。 現在の セ ッ シ ョ ン ・
レ ベル の パ ラ メ ー タ 値 を 表示す る に は、 select コ マ ン ド を 使用 し ま す。
た と えば、 現在の max resource granularity 値 を 表示す る に は、 次の よ う
に入力 し ま す。
select @@resource_granularity
注意 セ ッ シ ョ ン ・ レ ベルで設定す る か、 表示す る と 、 こ れ ら の パ ラ
メ ー タ に は 「max」 が含ま れて い ま せん。
number of worker processes
number of worker processes を 使用 し て、 同時実行す る すべて の並列 ク エ
リ に対 し て、 Adaptive Server が一度に使用で き る ワ ー カ ー ・ プ ロ セ ス
の最大数 を 指定 し ま す。
number of worker processes は、 単に サーバー全体の設定パ ラ メ ー タ で
す。 パ ラ メ ー タ を 設定す る に は sp_configure を 使用 し ま す。 た と えば、
ワ ー カ ー ・ プ ロ セ ス の最大数 を 200 に設定す る に は、 次の よ う に入力
し ま す。
sp_configure “number of worker processes”, 200
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
269
並列最適化の制御
並列処理に使用できるワーカー・プロセス数を指定する
max parallel degree を 使用 し て、 ク エ リ ご と に使用可能な ワ ー カ ー ・ プ
ロ セ ス の最大数 を 指定 し ま す。 max parallel degree は、 サーバ ・ レ ベル
か セ ッ シ ョ ン ・ レ ベルで設定で き ま す。
た と えば、 サーバ ・ レ ベルで max parallel degree を 60 に設定す る に は、
次の よ う に入力 し ま す。
sp_configure “max parallel degree”, 60
セ ッ シ ョ ン ・ レ ベルで max parallel degree を 60 に設定す る に は、 次の
よ う に入力 し ま す。
set parallel_degree 60
max parallel degree の値は、 現在の number of worker processes 値以下に す
る 必要が あ り ま す。 max parallel degree を 1 に設定す る と 、 並列処理が
オ フ に な り 、 Adaptive Server がすべて の テーブルお よ び イ ン デ ッ ク ス
を 逐次ス キ ャ ン し ま す。 並列パーテ ィ シ ョ ン ・ ス キ ャ ン を 有効に す る
に は、 ク エ リ を 行 う テーブル内の パーテ ィ シ ョ ン 数以上 と な る よ う に
max parallel degree を 設定 し ま す。
max resource granularity
max resource granularity を 使用 し て、 Adaptive Server が 1 つ の ク エ リ に
割 り 当て ら れ る 合計 メ モ リ の割合 を 指定 し ま す。 こ の パ ラ メ ー タ は、
サーバ ・ レ ベルか セ ッ シ ョ ン ・ レ ベルで設定で き ま す。
た と えば、 サーバ ・ レ ベルで max resource granularity を 35 パーセ ン ト
に設定す る に は、 次の よ う に入力 し ま す。
sp_configure “max resource granularity”, 35
セ ッ シ ョ ン ・ レ ベルで max resource granularity を 35 パー セ ン ト に設定
す る に は、 次の よ う に入力 し ま す。
set resource_granularity 35
こ の パ ラ メ ー タ の値は、 ク エ リ に対す る ク エ リ ・ オプテ ィ マ イ ザの演
算子の選択に影響 を 及ぼ し ま す。 max resource granularity を 低 く 設定 し
た場合、 ハ ッ シ ュ ・ ベー ス お よ び ソ ー ト ・ ベ ー ス の演算子 を 選択で き
ま せん。 max resource granularity に よ り 、 ス ケ ジ ュ ー リ ン グ ・ ア ルゴ リ
ズ ム に も 影響が及び ま す。
270
Adaptive Server Enterprise
第7章
最適化の制御
max repartition degree
max repartition degree を 使用 し て、 ク エ リ ・ プ ロ セ ッ サがデー タ ・ ス ト
リ ー ム を パーテ ィ シ ョ ン す る た め に使用で き る ワ ー カ ー ・ プ ロ セ ス数
を 提案 し ま す。 max repartition degree は、 サーバ ・ レ ベルか ク エ リ ・ レ
ベルで設定で き ま す。
注意 max repartition degree の値は、 単な る 候補値です。 ク エ リ ・ プ
ロ セ ッ サ に よ っ て最適な数が決定 さ れ ま す。
max repartition degree は、 ク エ リ を 行 う テーブル に パーテ ィ シ ョ ン がな
く て も 、 こ の結果得 ら れ る デー タ ・ ス ト リ ー ム を パーテ ィ シ ョ ン し
て、 SQL オ ペ レ ー シ ョ ン の同時実行が可能に な る こ と で、 パ フ ォ ー マ
ン ス を 改善で き る 可能性が あ る 場合に最 も 効果的です。
た と えば、 サーバ ・ レ ベルで max repartition degree を 15 に設定す る に
は、 次の よ う に入力 し ま す。
sp_configure “max repartition degree”, 15
セ ッ シ ョ ン ・ レ ベルで max repartition degree を 15 に設定す る に は、
次の よ う に入力 し ま す。
set repartition_degree 15
max repartition degree の値は、 現在の max parallel degree 値以下に す る 必
要が あ り ま す。 Sybase では、 こ の パ ラ メ ー タ の値 を 、 並列処理で き る
CPU 数 ま た はデ ィ ス ク 数以下に す る こ と を おすすめ し ま す。
小さいテーブルの同時実行性の最適化
15 ペ ー ジ以下のデー タ オ ン リ ー ロ ッ ク ・ テーブルでは、 そ の テーブル
に 効果的な イ ン デ ッ ク ス が あ る 場合、 Adaptive Server は テ ー ブル ・ ス
キ ャ ン を 考慮 し ま せん。 そ の代わ り 、 ク エ リ 内の最適化で き る 探索引
数 と 一致す る 最 も コ ス ト の か か ら な い イ ン デ ッ ク ス が常に選択 さ れ ま
す。 イ ン デ ッ ク ス ・ ス キ ャ ン に必要な ロ ッ ク は、 テ ーブル ・ ス キ ャ ン
の場合 よ り も ほ ん の少 し I/O を 多 く 要求す る 場合 も あ り ま すが、 高い
同時実行性 を 提供 し 、 デ ッ ド ロ ッ ク の可能性 を 減 ら し ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
271
小さいテーブルの同時実行性の最適化
小 さ い テーブル の同時実行性は問題で な く 、 代わ り に I/O を 最適化 し
た い場合は、 sp_chgattribute を 使用 し て こ の最適化 を 無効に し ま す。 た
と えば、 テ ーブル の同時実行性の最適化 を オ フ に す る に は、 次の よ う
に入力 し ま す。
sp_chgattribute tiny_lookup_table,
“concurrency_opt_threshold”, 0
同時実行性の最適化 を 無効に す る と 、 ク エ リ ・ プ ロ セ ッ サは、 I/O を
あ ま り 要求 し な い と き に テーブル ・ ス キ ャ ン を 選択で き ま す。
ま た、 テーブルの同時実行性の最適化ス レ ッ シ ョ ル ド を 増やす こ と も
で き ま す。 次の コ マ ン ド は、 テーブルの同時実行性の最適化ス レ ッ
シ ョ ル ド を 30 ペー ジ に設定 し ま す。
sp_chgattribute lookup_table,
“concurrency_opt_threshold”, 30
同時実行性の最適化ス レ ッ シ ョ ル ド の最大値は 32,767 です。 こ の値 を
-1 に設定す る と 、 任意のサ イ ズ の テーブル に対 し て同時実行性の最適
化が強制 さ れ ま す。 こ れは、 イ ン デ ッ ク ス ・ ア ク セ ス よ り も テーブ
ル ・ ス キ ャ ン が選択 さ れ、 そ の結果 ロ ッ ク の競合やデ ッ ド ロ ッ ク が発
生す る と き に便利な場合が あ り ま す。
現在の設定は、 systabstats.conopt_thld に保存 さ れ、 optdiag の一部 と し て
出力 さ れ ま す。
ロック・スキームの変更
同時実行性の最適化は、 デー タ オ ン リ ー ロ ッ ク ・ テーブルだけ に影響
し ま す。 表 7-4 に、 ロ ッ ク ・ ス キー ム の変更に よ る 影響 を 示 し ま す。
表 7-4: テーブルの変更による同時実行性の最適化設定への影響
変更前
全ペー ジ か ら デー タ オ ン リ ー に変更
デー タ オ ン リ ー か ら 全ペー ジ に変更
1 つ のデー タ オ ン リ ー ・ ス キー ム か ら 別
のデー タ オ ン リ ー ・ ス キー ム に変更
272
保存されている値への影響
デ フ ォ ル ト の 15 に設定
0 に設定
設定値を保持
Adaptive Server Enterprise
第
8
章
カーソルの最適化
こ の章では、 カ ー ソ ル に関連す る パ フ ォ ー マ ン ス上の問題に つ い
て説明 し ま す。 カ ー ソ ル と は、 SQL select 文の結果に一度に 1 ロ ー
ずつ (set cursors rows を 使用す る 場合は一度に複数 ロ ーずつ ) ア ク セ
ス す る た め の メ カ ニズ ム です。 カ ー ソ ルが使 う モデルは、 通常の
集合指向の SQL と 異な り 、 カ ー ソ ルが メ モ リ を 使 う 方法 と ロ ッ
ク を 保持す る 方法が、 ア プ リ ケ ー シ ョ ン の パ フ ォ ー マ ン ス に影響
し ま す。 特に、 ペ ー ジ お よ びテーブル ・ レ ベルで の ロ ッ ク 、 ネ ッ
ト ワ ー ク ・ リ ソ ー ス、 命令の処理に伴 う オーバヘ ッ ド がカ ー ソ ル ・
パ フ ォ ー マ ン ス の問題 と な り ま す。
トピック
定義
各ス テー ジ で必要 と さ れ る リ ソ ー ス
カ ー ソ ル ・ モー ド
イ ン デ ッ ク ス使用 と カ ー ソ ルの動作条件
カ ー ソ ルが あ る 場合 と な い場合の パ フ ォ ー マ ン ス の比較
読み込み専用カ ー ソ ル を使 っ た ロ ッ ク
独立性 レ ベル と カ ー ソ ル
分割 さ れた ヒ ープ ・ テーブル と カ ー ソ ル
カ ー ソ ル を最適化す る た め に
ページ
273
276
279
280
282
285
287
288
288
定義
カ ー ソ ル と は、 select 文に関連づけ ら れた記号名です。 カ ー ソ ル を
使用す る と 、 select 文の結果に一度に 1 ロ ーずつ ア ク セ ス で き ま す。
図 8-1 に、 authors テーブル に ア ク セ ス す る カ ー ソ ル を 示 し ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
273
定義
図 8-1: カーソルの例
select * from authors where
state = 'KY' にカーソルを使用
結果セット
A978606525 Marcello Duncan KY
A937406538 Carton
Nita
KY
A1525070956Porczyk Howard KY
プログラミングが実行できること:
- ローを調べる
- ローの値に基づいて処理を行う
A913907285 Bier
Lane
KY
カ ー ソ ルは、 select 文の結果セ ッ ト の 「ハ ン ド ル」 と 考え る こ と がで
き ま す。 カ ー ソ ル を 使 う と 一度に 1 つ の ロ ー を 検査で き、 場合に よ っ
ては操作す る こ と も で き ま す。
集合指向プログラミングとロー指向プログラミング
SQL は集合指向言語で あ る と みな さ れて き ま し た。 Adaptive Server
は、 集合指向モ ー ド で動作す る 場合に非常に パ フ ォ ー マ ン ス が高 く な
り ま す。 ANSI SQL 規格では カ ー ソ ルが必須で あ り 、 カ ー ソ ルが必要
と さ れ る 状況では非常に有益です。 し か し 、 カ ー ソ ルがパ フ ォ ー マ ン
ス を 低下 さ せ る 場合 も あ り ま す。
た と えば、 次の ク エ リ は、 where 句の条件 を 満たすすべて の ロ ー に対
し て同一の処理 を 実行 し ま す。
update titles
set contract = 1
where type = 'business'
オプテ ィ マ イ ザは、 更新 を 実行す る た め の最 も 効率の よ い方法 を 検出
し ま す。 し か し 、 カ ー ソ ルは各 ロ ー を 調べ、 条件が一致す る と 更新 を
1 回実行 し ま す。 ア プ リ ケ ー シ ョ ン は、 select 文に対す る カ ー ソ ル の宣
言、 カ ー ソ ルの オ ープ ン、 ロ ー の フ ェ ッ チ、 ロ ー の処理、 次の ロ ー の
フ ェ ッ チ、 以降繰 り 返 し と い う 順序で動作 し ま す。 ア プ リ ケ ー シ ョ ン
は現在の ロ ー の値に基づ く た め、 ま っ た く 異な る オ ペ レ ー シ ョ ン を す
る 場合が あ り 、 カ ー ソ ル ・ ア プ リ ケ ー シ ョ ン に対応す る サーバ の総合
的な リ ソ ー ス使用の効率は、 サーバ の集合 レ ベルの オ ペ レ ー シ ョ ン よ
り も 低 く な る 可能性が あ り ま す。 し か し 、 カ ー ソ ルは必要に応 じ て集
合指向プ ロ グ ラ ミ ン グ よ り も 柔軟性 を 発揮で き ま す。
274
Adaptive Server Enterprise
第8章
カーソルの最適化
図 8-2 に、 カ ー ソ ルの使用手順を示し ます。 カ ー ソ ルの機能は、 フ ロ ー
チ ャ ー ト の中央に あ る 手順、 つ ま り ユーザ ま た は ア プ リ ケ ー シ ョ ン ・
コ ー ド が ロ ー を 調べ、 ロ ー の値に基づ い て実行す る 内容 を 決定す る こ
と です。
図 8-2: カーソルのフローチャート
カーソルを宣言する
カーソルをオープンする
ローをフェッチする
ローを処理する
( 検索/更新/削除 )
はい
次のローに
進みますか ?
いいえ
カーソルをクローズする
カーソルを割り付け解除する
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
275
各ステージで必要とされるリソース
例
次に、 上記の 「 ロ ー を 処理す る 」 の手順 を 、 疑似 コ ー ド で記述 し た
カ ー ソ ルの単純な例 を 示 し ま す。
declare biz_book cursor
for select * from titles
where type = 'business'
go
open biz_book
go
fetch biz_book
go
/* Look at each row in turn and perform
** various tasks based on values,
** and repeat fetches, until
** there are no more rows
*/
close biz_book
go
deallocate cursor biz_book
go
ロ ー の内容に よ っ ては、 次の よ う にユーザが現在の ロ ー を削除し ま す。
delete titles where current of biz_book
ま た は現在の ロ ー を 更新 し ま す。
update titles set title="The Rich
Executive's Database Guide"
where current of biz_book
各ステージで必要とされるリソース
カ ー ソ ルは メ モ リ を 使用 し 、 テーブル、 デー タ ・ ペ ー ジ、 イ ン デ ッ ク
ス ・ ペー ジ に対す る ロ ッ ク を 必要 と し ま す。 カ ー ソ ルがオ ープ ン さ れ
る と 、 メ モ リ が カ ー ソ ル に割 り 付け ら れ、 生成 さ れ る ク エ リ ・ プ ラ ン
を 保管 し ま す。 カ ー ソ ルがオープ ン に な っ て い る 間に、 Adaptive Server
は意図的テーブル ・ ロ ッ ク も 保持 し 、 場合に よ っ ては ロ ー ・ ロ ッ ク ま
た はペー ジ ・ ロ ッ ク を 保持 し ま す。 図 8-3 は、 カ ー ソ ル ・ オ ペ レ ー
シ ョ ン中の ロ ッ ク が行われて い る 時期 を 示 し て い ま す。
276
Adaptive Server Enterprise
第8章
カーソルの最適化
図 8-3: カーソル文が使うリソース
カーソルを宣言する
カーソルをオープンする
ローをフェッチする
ローを処理する
( 検索/更新/削除 )
はい
次のローに
進みますか ?
いいえ
カーソルをクローズする
テーブルが
ロックされる
ロー
メモリ
( 意図的 ):
または
ページ
いくつかの
ローまたは
がロッ
クされる ページ
がロック
される
カーソルを割り付け解除する
図 8-3 と 表 8-1 に示 し た メ モ リ ・ リ ソ ー ス の説明は、 isql ま た は ClientLibrary を 使用 し て送 ら れ る ク エ リ 用の特別な カ ー ソ ル に関す る も の
です。 他の種類の カ ー ソ ルでは、 ロ ッ ク は同 じ ですが、 カ ー ソ ルの タ
イ プ に よ っ て メ モ リ の割 り 付け と 割 り 付け解除に多少の違い が生 じ ま
す。 詳細に つ い ては、 「 メ モ リ 使用 と 実行カ ー ソ ル」 (279 ペ ー ジ ) を 参
照 し て く だ さ い。
表 8-1: isql と Client-Library クライアント・カーソルに対するロックとメ
モリの使用状況
カーソル・
コマンド
declare cursor
リソース使用状況
カ ー ソ ルが宣言 さ れ る と 、 Adaptive Server は ク エ リ ・
テキ ス ト を保管す る の に十分な メ モ リ だけ を使用
する。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
277
各ステージで必要とされるリソース
カーソル・
コマンド
open
fetch
close
deallocate cursor
278
リソース使用状況
カ ー ソ ルがオープ ン さ れ る と 、 Adaptive Server は メ
モ リ を カ ー ソ ル に割 り 付け、 生成 さ れ る ク エ リ ・ プ
ラ ン を保管す る 。 サーバは ク エ リ を最適化 し 、 イ ン
デ ッ ク ス を検索 し て、 メ モ リ 変数を設定す る 。 ワ ー
ク ・ テーブル を構築す る 必要が あ る と き以外は、
サーバは ロ ー に ア ク セ ス し な い。 し か し 、 必要な
テーブル ・ レ ベル ・ ロ ッ ク ( 意図的 ロ ッ ク ) を設定す
る 。 ロ ーやペー ジ ・ ロ ッ ク の動作は、 独立性 レ ベル、
サーバ の設定、 ク エ リ の型に依存す る 。
詳細に つ い ては、 『パ フ ォ ー マ ン ス & チ ュ ーニ ン グ ・
シ リ ーズ : ロ ッ ク と 同時実行制御』 の 「 ロ ッ ク に対
す る 独立性 レ ベルの影響」 (21 ペー ジ ) を参照 し て く
だ さ い。
fetch が実行 さ れ る と 、 Adaptive Server は 1 つ ま たは
複数の必要な ロ ー を取 り 出 し て、 指定 さ れた値を
カ ー ソ ル変数に読み込むか、 そ の ロ ー を ク ラ イ ア ン
ト に送 る 。 カ ー ソ ルが ロ ー ま た はペー ジ の ロ ッ ク を
保持す る 必要が あ る 場合、 そ の ロ ッ ク は fetch が ロ ー
ま たはペー ジ の外に カ ー ソ ル を移動 さ せ る ま で、
ま たは カ ー ソ ルが ク ロ ーズ さ れ る ま で保持 さ れ る 。
カ ー ソ ルの記述方法に基づ い て、 共有 ロ ッ ク と 更新
ロ ッ ク の いずれかが設定 さ れ る 。
カ ー ソ ルが ク ロ ーズ さ れ る と 、 Adaptive Server は、
ロ ッ ク と メ モ リ 割 り 付け の一部を解放す る 。 必要に
応 じ て カ ー ソ ル を も う 一度オープ ン で き る 。
カ ー ソ ルが割 り 付け解除 さ れ る と 、 Adaptive Server
は カ ー ソ ルが使用 し て い た残 り の メ モ リ ・ リ ソ ー ス
を解放す る 。 カ ー ソ ル を再使用す る に は、 カ ー ソ ル
を も う 一度宣言す る 。
Adaptive Server Enterprise
第8章
カーソルの最適化
メモリ使用と実行カーソル
表 8-1 の declare cursor と deallocate cursor in の説明は、 isql ま た は ClientLibrary を 使用 し て送 ら れ る 特別な カ ー ソ ル に つ い て の説明
です。 ほ か の種類の カ ー ソ ルは、 次の よ う に メ モ リ を 割 り 付け ま す。
•
ス ト ア ド ・ プ ロ シ ー ジ ャ に対 し て宣言 さ れて い る カ ー ソ ルの場合、
declare cursor 時 に は少量の メ モ リ し か割 り 付け ら れ な い。 ス ト ア
ド ・ プ ロ シ ー ジ ャ に対 し て宣言 さ れた カ ー ソ ルは Client-Library ま
た はプ リ コ ン パ イ ラ を 使用 し て送 ら れ、execute cursors と 呼ばれ る 。
•
ス ト ア ド ・ プ ロ シ ー ジ ャ の内部で宣言 さ れて い る カ ー ソ ルの場合
は、 すで に ス ト ア ド ・ プ ロ シ ー ジ ャ に対 し て メ モ リ が割 り 付け ら
れて い る の で、 declare 文は追加の メ モ リ を 必要 と し な い。
カーソル・モード
カ ー ソ ル に は、 読み込み専用 と 更新 と い う 2 つ の モ ー ド が あ り ま す。
名前か ら 想像 さ れ る よ う に、 読み込み専用カ ー ソ ルは select 文の結果
のデー タ を 表示す る だけですが、 更新カ ー ソ ル を 使用す る と 指定の更
新お よ び削除 を 実行で き ま す。
読み込み専用モ ー ド では、 共有ペ ー ジ ・ ロ ッ ク ま た は ロ ー ・ ロ ッ ク を
使用 し ま す。 read committed with lock が 0 に設定 さ れて い て、 ク エ リ が独
立性 レ ベル 1 で実行 さ れ る 場合、 読み込み専用モ ー ド は一時的な ロ ッ
ク を 使用 し 、 次の フ ェ ッ チ ま でペ ー ジ ・ ロ ッ ク ま た は ロ ー ・ ロ ッ ク を
保持 し ま せん。
読み込み専用モ ー ド が有効に な る の は、 for read only が指定 さ れて い る
場合、 ま た は カ ー ソ ルの select 文に distinct、 group by、 union、 ま た は集
合関数が指定 さ れて い る 場合です。 状況に よ っ ては、 select 文に order
by 句が指定 さ れて い る 場合に も こ の モ ー ド が有効に な り ま す。
更新モ ー ド では、 更新ペ ー ジ ま た は ロ ー ・ ロ ッ ク を 使用 し ま す。 こ の
モ ー ド は次の場合に有効に な り ま す。
•
for update を 指定す る 場合
•
select 文に、 distinct、 group by、 union、 サブ ク エ リ 、 集合関数、
ま た は at isolation read uncommitted 句が指定 さ れて い な い場合
•
shared を 指定す る 場合
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
279
インデックス使用とカーソルの動作条件
column_name_list を 指定す る と 、 そ の カ ラ ム だけが更新可能に な り
ま す。
詳細に つ い ては、 『パ フ ォ ー マ ン ス & チ ュ ーニ ン グ ・ シ リ ーズ : ロ ッ
ク と 同時実行制御』 の 「カ ー ソ ル と ロ ッ ク 」 (94 ペ ー ジ ) を 参照 し て く
だ さ い。
カ ー ソ ル を 宣言す る と き に カ ー ソ ル ・ モ ー ド を 指定 し ま す。 select 文に
指定 さ れ る オプ シ ョ ン に よ っ ては、 更新モ ー ド を 宣言 し て も カ ー ソ ル
が更新で き な い こ と が あ り ま す。
インデックス使用とカーソルの動作条件
カ ー ソ ル内で ク エ リ が使用 さ れ る 場合、 そ の ク エ リ は、 カ ー ソ ル外で
使用す る の と は異な る イ ン デ ッ ク ス を 要求ま た は選択す る こ と が あ り
ま す。
全ページロック・テーブル
読み込み専用カ ー ソ ルの場合は、 独立性 レ ベル 0 ( ダーテ ィ ・ リ ー ド )
の ク エ リ はユニー ク ・ イ ン デ ッ ク ス を 要求 し ま す。 独立性 レ ベル 1 ま
た は 3 の読み込み専用カ ー ソ ルは、 カ ー ソ ルの外の select 文 と 同一の
ク エ リ ・ プ ラ ン を 生成 し ま す。
更新可能カ ー ソ ルが イ ン デ ッ ク ス を 必要 と す る こ と は更新可能カ ー ソ
ルが読み込み専用カ ー ソ ル と は異な る ク エ リ ・ プ ラ ン を 使用す る こ と
が あ る と い う こ と を 意味 し ま す。 更新可能カ ー ソ ルが イ ン デ ッ ク ス を
必要 と す る 条件は次の と お り です。
•
カ ー ソ ルが更新カ ー ソ ル と し て宣言 さ れて い な い場合は、 ユニー
ク ・ イ ン デ ッ ク ス がテーブル ・ ス キ ャ ン ま た はユニー ク で な い イ
ン デ ッ ク ス に優先す る 。
•
for update of リ ス ト が指定 さ れずに カ ー ソ ルが更新カ ー ソ ル と し て
宣言 さ れ る 場合は、 全ペ ー ジ ロ ッ ク ・ テーブル上に ユニー ク ・ イ
ン デ ッ ク ス が必須で あ る 。 ユニー ク ・ イ ン デ ッ ク ス が存在 し な い
場合はエ ラ ーが返 さ れ る 。
280
Adaptive Server Enterprise
第8章
•
カーソルの最適化
for update of リ ス ト が指定 さ れて カ ー ソ ルが更新カ ー ソ ル と し て宣
言 さ れ る 場合は、 こ の リ ス ト の カ ラ ム が指定 さ れな い ユニー ク ・
イ ン デ ッ ク ス だけが、 全ペ ー ジ ロ ッ ク ・ テーブル上で必要 と な
る 。 条件 を 満たすユニー ク ・ イ ン デ ッ ク ス が存在 し な い場合は、
エ ラ ーが返 さ れ る 。
カ ー ソ ル を 使用す る 場合、 ユニー ク で あ る と 宣言 さ れて い な い イ ン
デ ッ ク ス で あ っ て も 、 IDENTITY カ ラ ム を 含ん で い ればユニー ク ・
イ ン デ ッ ク ス と み な さ れ ま す。 場合に よ っ ては、 IDENTITY カ ラ ム を
イ ン デ ッ ク ス に追加 し てユニー ク ・ イ ン デ ッ ク ス に す る 必要が あ っ た
り 、 カ ー ソ ル ・ ク エ リ に最適状態では な い ク エ リ ・ プ ラ ン を オプテ ィ
マ イ ザに強制的に選択 さ せ る こ と が あ り ま す。
データオンリーロック・テーブル
デー タ オ ン リ ー ロ ッ ク ・ テーブルでは、 固定 ロ ー ID を 使用 し て カ ー
ソ ル ・ ス キ ャ ン を 配置 し ま す。 そ の た め、 ユニー ク ・ イ ン デ ッ ク ス
は、 ダーテ ィ ・ リ ー ド ま た は更新カ ー ソ ル に は必要あ り ま せん。 更新
カ ー ソ ル内に さ ま ざ ま な ク エ リ ・ プ ラ ン が あ る 理由は、 有効な イ ン
デ ッ ク ス だけ に指定 さ れた カ ラ ム が for update of リ ス ト に含 ま れて い る
場合、 テーブル ・ ス キ ャ ン が使用 さ れ る か ら と い う こ と だけ です。
ハロウィーン問題を避けるためのテーブル・スキャン
ハ ロ ウ ィ ー ン問題 と は、 カ ー ソ ル を 使用 し て い る ク ラ イ ア ン ト が
そ の カ ー ソ ル結果セ ッ ト の ロ ー の カ ラ ム を 更新 し 、 ロ ーがテーブルか
ら 返 さ れ る 順番 を そ の カ ラ ム で定義す る と き に発生す る 、 更新の異常
の こ と です。 た と えば、 カ ー ソ ルが あ る イ ン デ ッ ク ス を last_name と
first_name 上で使用す る こ と に な っ て い て、 こ れ ら の う ち 1 つ の カ ラ ム
を 更新す る 場合、 そ の ロ ーが結果セ ッ ト に 2 番目に現れ る こ と が あ る
と い う も の です。
デー タ オ ン リ ー ロ ッ ク ・ テーブル上で こ の ハ ロ ウ ィ ー ン問題 を 避け る
た め に、 他の有効な イ ン デ ッ ク ス で指定 し た カ ラ ム が for update 句の
カ ラ ム ・ リ ス ト に含ま れて い る 場合、 Adaptive Server はテーブル ・ ス
キ ャ ン を 選択 し ま す。
暗黙的に更新可能な カ ー ソ ルが for update 句 を 使用 し な い で宣言 さ れ
た場合や、 for update 句の カ ラ ム ・ リ ス ト が空の カ ー ソ ルの場合、 そ の
カ ー ソ ルが使用す る イ ン デ ッ ク ス内の カ ラ ム を 更新す る カ ー ソ ル に ハ
ロ ウ ィ ー ン問題が発生す る 可能性が あ り ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
281
カーソルがある場合とない場合のパフォーマンスの比較
カーソルがある場合とない場合のパフォーマンスの比較
こ の項では、 次の よ う に異な る 2 つ の方法で記述 さ れ る ス ト ア ド ・ プ
ロ シ ー ジ ャ の パ フ ォ ー マ ン ス に つ い て説明 し ま す。
•
カ ー ソ ルがな い ス ト ア ド ・ プ ロ シ ー ジ ャ - テーブル を 3 回ス キ ャ
ン し 、 本一冊ご と に価格 を 変更す る 。
•
カ ー ソ ルが あ る ス ト ア ド ・ プ ロ シ ー ジ ャ - テーブル を 1 回だけ ス
キ ャ ンする。
ど ち ら の例で も 、 titles(title_id) に ユニー ク ・ イ ン デ ッ ク ス が設定 さ れて
い ま す。
カーソルがないストアド・プロシージャの例
次に、 カ ー ソ ルがな い ス ト ア ド ・ プ ロ シ ー ジ ャ の例 を 示 し ま す。
/*
**
**
**
**
**
**
**
**
**
*/
Increase the prices of books in the
titles table as follows:
If
If
it
If
current price is <= $30, increase it by 20%
current price is > $30 and <= $60, increase
by 10%
current price is > $60, increase it by 5%
All price changes must take effect, so this is
done in a single transaction.
create procedure increase_price
as
/* start the transaction */
begin transaction
/* first update prices > $60 */
update titles
set price = price * 1.05
where price > $60
/* next, prices between $30 and $60 */
update titles
set price = price * 1.10
where price > $30 and price <= $60
/* and finally prices <= $30 */
282
Adaptive Server Enterprise
第8章
カーソルの最適化
update titles
set price = price * 1.20
where price <= $30
/* commit the transaction */
commit transaction
return
カーソルがあるストアド・プロシージャの例
次の プ ロ シ ー ジ ャ は、 基本 と な る テーブル に対 し て、 前述の カ ー ソ ル
がな い プ ロ シ ー ジ ャ の例 と 同一の変更 を 実行 し ま す。 ただ し 、 こ こ で
は集合指向プ ロ グ ラ ミ ン グでは な く カ ー ソ ル を 使用 し ま す。 各 ロ ーが
フ ェ ッ チ さ れ、 調べ ら れ、 更新 さ れ る たび に、 適切なデー タ ・ ペー ジ
に ロ ッ ク が設定 さ れ ま す。 ま た、 コ メ ン ト が示す と お り 、 各更新は作
成 さ れた と お り に コ ミ ッ ト し ま す。 こ れは明示的な ト ラ ン ザ ク シ ョ ン
がな い た め です。
/* Same as previous example, this time using a
** cursor.Each update commits as it is made.
*/
create procedure increase_price_cursor
as
declare @price money
/* declare a cursor for the select from titles */
declare curs cursor for
select price
from titles
for update of price
/* open the cursor */
open curs
/* fetch the first row */
fetch curs into @price
/* now loop, processing all the rows
** @@sqlstatus = 0 means successful fetch
** @@sqlstatus = 1 means error on previous fetch
** @@sqlstatus = 2 means end of result set reached
*/
while (@@sqlstatus != 2)
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
283
カーソルがある場合とない場合のパフォーマンスの比較
begin
/* check for errors */
if (@@sqlstatus = 1)
begin
print "Error in increase_price"
return
end
/* next adjust the price according to the
** criteria
*/
if @price > $60
select @price = @price * 1.05
else
if @price > $30 and @price <= $60
select @price = @price * 1.10
else
if @price <= $30
select @price = @price * 1.20
/* now, update the row */
update titles
set price = @price
where current of curs
/* fetch the next row */
fetch curs into @price
end
/* close the cursor and return */
close curs
return
以上の例か ら 、 カ ー ソ ルの な い ス ト ア ド ・ プ ロ シ ー ジ ャ (3 回の テー
ブル ・ ス キ ャ ン を 実行 ) と 、 カ ー ソ ルの あ る ス ト ア ド ・ プ ロ シ ー ジ ャ
( カ ー ソ ル に よ る 1 回の ス キ ャ ン を 実行 ) と では、 ど ち ら の パ フ ォ ー
マ ン ス が高い か判断 し て く だ さ い。
カーソルがある場合とない場合のパフォーマンスの比較
表 8-2 は、 ロ ー数 5,000 の テーブル に つ い て収集 さ れた統計値 を 示 し
ま す。 カ ー ソ ル ・ コ ー ド はテーブル を 1 回 し か ス キ ャ ン し ま せんが、
カ ー ソ ルがな い場合の 4 倍以上の時間がか か っ て い ま す。
284
Adaptive Server Enterprise
第8章
カーソルの最適化
表 8-2: ロー数 5,000 のテーブルの実行時間の例
プロシージャ
increase_price
increase_price_cursor
アクセス方式
テーブル ・ ス キ ャ ン を 3
回実行
カ ー ソ ル を使い、 テーブ
ル ・ ス キ ャ ン を 1 回実行
時刻
28 秒
125 秒
こ う し た テ ス ト の結果は、 テ ス ト ご と に大き く 変わ り ま す。 負荷の高
い ネ ッ ト ワ ー ク 、 多数の ア ク テ ィ ブなデー タ ベ ー ス ・ ユーザ、 同一の
テーブル に ア ク セ ス す る 複数の ユーザの あ る シ ス テ ム では、 特に結果
が変わ り やす い と 言え ま す。
カ ー ソ ル を 使用す る と 、 ロ ッ ク だけで な く 、 集合操作の場合よ り も 多
く の ネ ッ ト ワ ー ク ・ ア ク テ ィ ビ テ ィ が行われ、 命令の処理に伴 う オ ー
バヘ ッ ド が生 じ ま す。 ア プ リ ケ ー シ ョ ン ・ プ ロ グ ラ ム は、 ク エ リ の結
果 ロ ー ご と に Adaptive Server と や り と り し な ければな り ま せん。 こ の
た め、 カ ー ソ ル ・ コ ー ド の方が、 テーブル を 3 回ス キ ャ ン す る コ ー ド
よ り も 完了 ま で に長い時間がか か り ま す。
カ ー ソ ルの パ フ ォ ー マ ン ス問題は次の と お り です。
•
ペー ジ お よ びテーブル ・ レ ベルで の ロ ッ ク
•
ネ ッ ト ワー ク ・ リ ソース
•
命令の処理に伴 う オ ーバヘ ッ ド
同等の集合 レ ベルの プ ロ グ ラ ミ ン グが あ る 場合は、 テーブル ・ ス キ ャ
ン を 複数回実行す る プ ロ グ ラ ミ ン グで あ っ て も 、 そ ち ら を 選ぶ こ と を
おすすめ し ま す。
読み込み専用カーソルを使ったロック
こ の項では、 カ ー ソ ルの存在 し て い る 間の各ポ イ ン ト に設定 さ れ る
ロ ッ ク を 表示す る た め に使用す る カ ー ソ ル ・ コ ー ド の例 を 示 し ま す。
次の例では、 全ペ ー ジ ロ ッ ク ・ テーブル を 使用 し ま す。 図 8-4 の コ ー
ド を 実行 し 、 矢印が示す部分で休止 し て、 sp_lock を 実行す る こ と に
よ り 、 設定 さ れ る ロ ッ ク を 調べ ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
285
読み込み専用カーソルを使ったロック
図 8-4: 読み込み専用カーソルとロックを調べるコードの例
declare curs1 cursor for
select au_id, au_lname, au_fname
from authors
where au_id like ’15%’
for read only
go
open curs1
go
fetch curs1
go
fetch curs1
go 100
close curs1
go
deallocate cursor curs1
go
表 8-3 に結果 を 示 し ま す。
表 8-3: カーソルがデータ・ページとインデックス・ページに対して保持す
るロック
イベント
declare の後
open の後
最初の fetch の後
100 回 フ ェ ッ チ し た
あと
close の後
ロックが設定されているデータ・ページ
カ ー ソ ル に関係す る ロ ッ ク は な い。
authors に意図的共有 ロ ッ ク が あ る 。
authors に意図的共有 ロ ッ ク 、 authors テーブル内
の あ る ペー ジ に共有ペー ジ ・ ロ ッ ク が あ る 。
authors に意図的共有 ロ ッ ク 、 authors テーブル内
の別の ペー ジ に共有ペー ジ ・ ロ ッ ク が あ る 。
カ ー ソ ル に関係す る ロ ッ ク は な い。
結果セ ッ ト の最終 ロ ーが フ ェ ッ チ さ れた後で、 さ ら に fetch コ マ ン ド
が発行 さ れ る と 、 最終ペ ー ジ の ロ ッ ク が解放 さ れ る た め、 カ ー ソ ル に
関係す る ロ ッ ク がな く な り ま す。
286
Adaptive Server Enterprise
第8章
カーソルの最適化
デー タ オ ン リ ー ロ ッ ク ・ テーブルが あ る 場合 :
•
カ ー ソ ルの ク エ リ が独立性 レ ベル 1 で実行 さ れて、 read committed
with lock が 0 に設定 さ れて い る 場合、 ペー ジ ・ ロ ッ ク ま た は ロ ー ・
ロ ッ ク は発生 し な い。 値はペー ジ ま た は ロ ー か ら コ ピ ー さ れて、
ロ ッ ク は即座に解放 さ れ る 。
•
read committed with lock が 1 に設定 さ れて い る か、 ク エ リ が独立性
レ ベル 2 ま た は 3 で実行 さ れ る 場合、 表 8-3 で示 し て い る 共有
ペー ジ ・ ロ ッ ク の ポ イ ン ト で、 共有ペ ー ジ ・ ロ ッ ク か共有 ロ ー ・
ロ ッ ク の ど ち ら かが発生す る 。 テーブルがデー タ ロ ー ・ ロ ッ ク を
使用す る 場合、 sp_lock の レ ポー ト に は フ ェ ッ チ さ れた ロ ー の ロ ー
ID が含ま れ る 。
独立性レベルとカーソル
カ ー ソ ル に対応す る ク エ リ ・ プ ラ ン は、 カ ー ソ ルがオ ープ ン さ れた時
点で コ ン パ イ ル さ れ、 最適化 さ れ ま す。 カ ー ソ ルが動作す る 独立性 レ
ベル を 変更す る 場合、 カ ー ソ ルはオープ ン で きず、 set transaction
isolation level を 使用 し ま す。
独立性 レ ベル 0 を 使用す る カ ー ソ ルは、 ほ か の独立性 レ ベル を 使用す
る カ ー ソ ル と は異な っ た形式で コ ン パ イ ル さ れ る の で、 独立性 レ ベル
0 で カ ー ソ ル を オープ ン す る と 、 そ の レ ベルか ら レ ベル 1 ま た は 3 で
の オ ープ ン と フ ェ ッ チ を 実行す る こ と はで き ま せん。 同様に、 独立性
レ ベル 1 ま た は 3 で カ ー ソ ル を オ ープ ン す る と 、 レ ベル 0 で の フ ェ ッ
チは実行で き ま せん。 互換性の な い レ ベルで カ ー ソ ルか ら フ ェ ッ チ を
実行 し よ う と す る と 、 エ ラ ー ・ メ ッ セ ー ジ が表示 さ れ ま す。
特定の独立性 レ ベルで カ ー ソ ル を 一度オ ープ ン し た後は、 カ ー ソ ル を
割 り 付け解除 し て か ら 独立性 レ ベルの変更 を 行 う 必要が あ り ま す。
カ ー ソ ルがオ ープ ン し て い る と き に独立性 レ ベル を 変更す る と 、 次の
よ う な影響が あ り ま す。
•
カ ー ソ ル を 別の独立性 レ ベルで ク ロ ーズ し 再オ ープ ン し よ う と す
る と 失敗 し 、 エ ラ ー ・ メ ッ セ ー ジ が表示 さ れ る 。
•
カ ー ソ ルの ク ロ ーズや再オ ープ ン を せずに独立性 レ ベル を 変更 し
て も 、 使用 し て い る 独立性 レ ベル に影響は な く 、 エ ラ ー ・ メ ッ
セ ー ジ も 表示 さ れな い。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
287
分割されたヒープ・テーブルとカーソル
カ ー ソ ル内で at isolation 句 を 使用 し て、 独立性 レ ベル を 指定で き ま す。
次の例に示す カ ー ソ ルは、 レ ベル 1 で宣言 さ れ、 レ ベル 0 で フ ェ ッ チ
で き ま す。 こ れは、 ク エ リ ・ プ ラ ン が独立性 レ ベル と の互換性 を 持つ
た め です。
declare cprice cursor for
select title_id, price
from titles
where type = "business"
at isolation read uncommitted
分割されたヒープ・テーブルとカーソル
分割 さ れて い な い ヒ ープ ・ テーブル に対す る カ ー ソ ル ・ ス キ ャ ン は、
現在あ る デー タ を すべて読み込み ま す。 こ のデー タ に は、 そ の テーブ
ル に対 し て最後に挿入 さ れたデー タ も 含ま れ ま す。 そ の挿入が、 カ ー
ソ ル ・ ス キ ャ ン が開始 さ れた あ と に始ま る 場合 も 同様です。
ヒ ープ ・ テーブルが分割 さ れて い る 場合、 デー タ が多 く の ペ ー ジ ・
チ ェ ー ン の う ち の 1 つ に挿入 さ れ る 可能性が あ り ま す。 物理挿入ポ イ
ン ト は、 現在カ ー ソ ル ・ ス キ ャ ン を 実行 し て い る 位置の前 ま た は後 ろ
に存在 し て い る 可能性が あ り ま す。 こ れは、 分割 さ れた テーブル に対
す る カ ー ソ ル ・ ス キ ャ ン では、 そ の テーブル に最後に挿入 さ れたデー
タ を ス キ ャ ン で き る 保証がな い こ と を 示 し ま す。
注意 カ ー ソ ル ・ オ ペ レ ー シ ョ ン で、 すべて の挿入が 1 つ の ペー ジ ・
チ ェ ー ン の終端に ま で実行 さ れて い る 必要が あ る 場合は、 カ ー ソ ル ・
ス キ ャ ン に使用す る テーブル を 分割 し な い で く だ さ い。
カーソルを最適化するために
次に、 カ ー ソ ル を 最適化す る た め の い く つ か の ヒ ン ト を 示 し ま す。
288
•
特定の ク エ リ では な く 、 カ ー ソ ル を 使 っ て カ ー ソ ル select 文 を 最
適化す る 。
•
or 句ま た は in リ ス ト の代わ り に union ま た は union all を 使用す る 。
•
カ ー ソ ルの意図 を 宣言す る 。
Adaptive Server Enterprise
第8章
カーソルの最適化
•
for update 句に カ ラ ム名 を 指定す る 。
•
ク ラ イ ア ン ト に ロ ー を 返す場合は、 複数の ロ ー を フ ェ ッ チす る 。
•
複数の コ ミ ッ ト お よ び ロ ールバ ッ ク に わ た っ て カ ー ソ ル を オ ープ
ン の ま ま にする。
•
1 つ の接続で複数の カ ー ソ ル を オ ープ ン す る 。
カーソルを使ったカーソル select 文の最適化
独立 し た select 文の最適化は、 暗黙的 ま た は明示的に更新可能な カ ー
ソ ル に指定 さ れた同一の select 文の最適化 と ま っ た く 異な り ま す。
カ ー ソ ル を 使用す る ア プ リ ケ ー シ ョ ン を 開発す る 場合は、 独立 し た
select では な く 、 カ ー ソ ル を 使用す る と き の ク エ リ ・ プ ラ ン と I/O 統
計値 を 常に チ ェ ッ ク し ま す。 特に、 更新可能カ ー ソ ルの イ ン デ ッ ク ス
制限では、 必要 と な る ア ク セ ス ・ メ ソ ッ ド が ま っ た く 異な り ま す。
or 句または in リストの代わりに union を使用
カ ー ソ ルでは、 OR 方式が生成す る ロ ー ID の動的 イ ン デ ッ ク ス を 使用
で き ま せん。 独立 し た select 文で OR 方式 を 使用す る ク エ リ は、 通常、
読み込み専用カ ー ソ ル を 使用 し てテーブル ・ ス キ ャ ン を 実行 し ま す。
更新可能カ ー ソ ルの場合は、 ユニー ク ・ イ ン デ ッ ク ス を 使 う 必要が
あ り 、 ク エ リ 句 を 評価す る た め に各デー タ ・ ロ ー に順番に ア ク セ ス し
な ければな り ま せん。
union を 使用す る 読み込み専用カ ー ソ ルは、 カ ー ソ ルが宣言 さ れ る と
き に ワ ー ク ・ テーブル を 作成 し 、 ワ ー ク ・ テーブル を ソ ー ト し て重複
を 削除 し ま す。 こ の ワ ー ク ・ テーブル に対 し て フ ェ ッ チが実行 さ れ
ま す。 union all を 使用す る カ ー ソ ルは重複 を 返せ る た め、 ワ ー ク ・ テー
ブル を 必要 と し ま せん。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
289
カーソルを最適化するために
カーソルの意図の宣言
常に カ ー ソ ルの意図、 つ ま り 読み込み専用か更新可能か を 宣言 し て
く だ さ い。 こ れ に よ っ て、 同時実行性の影響 を 十分に制御で き ま す。
意図が指定 さ れな い と 、 Adaptive Server がユーザに代わ っ て判断 し 、
ほ と ん ど の場合更新可能カ ー ソ ル を 選択 し ま す。 更新可能カ ー ソ ルは
更新 ロ ッ ク を 使 う た め、 排他 ロ ッ ク お よ びほ か の更新 ロ ッ ク の設定 を
妨げま す。 更新に よ っ て イ ン デ ッ ク ス設定カ ラ ム が変更 さ れ る と 、
オプテ ィ マ イ ザは ク エ リ の実行に テーブル ・ ス キ ャ ン を 選択 し な けれ
ばな ら な い た め、 同時実行性 と い う 困難な問題が発生す る 可能性が あ
り ま す。 更新可能カ ー ソ ル を 使 う ク エ リ の ク エ リ ・ プ ラ ン を 慎重に検
討 し て確か め て く だ さ い。
for update 句へのカラム名の指定
Adaptive Server は、 カ ー ソ ル select 文の for update 句に リ ス ト さ れて い
る カ ラ ム が あ る すべて の テーブル の ペ ー ジ ま た は ロ ー に、 更新 ロ ッ ク
を 設定 し ま す。 for update 句が カ ー ソ ル宣言に含ま れな い場合は、 from
句内で参照 さ れ る すべて の テーブル に更新 ロ ッ ク が設定 さ れ ま す。
次の ク エ リ は、 for update 句内に カ ラ ム名が含ま れて い ま すが、 for
update 句に price が記述 さ れて い る た め、 titles テーブル に の み更新
ロ ッ ク を 要求 し ま す。 こ の テーブルは全ペー ジ ・ ロ ッ ク を 使用 し
ま す。 authors と titleauthor に対す る ロ ッ ク は、 共有ペー ジ ・ ロ ッ ク
です。
declare curs3 cursor
for
select au_lname, au_fname, price
from titles t, authors a,
titleauthor ta
where advance <= $1000
and t.title_id = ta.title_id
and a.au_id = ta.au_id
for update of price
表 8-4 は、 次の操作の影響 を 示 し ま す。
•
for update 句 を 完全に省略す る 。 shared 句な し 。
•
for update 句か ら カ ラ ム名 を 省略す る 。
•
for update 句に更新対象カ ラ ム名 を 指定す る 。
•
for update of price 使用時に、 titles テーブルの名前の後に shared を 追
加す る 。
290
Adaptive Server Enterprise
第8章
カーソルの最適化
こ の表では、 for update 句の 2 つ の バー ジ ョ ン に対す る 追加の ロ ッ ク 、
つ ま り よ り 制限的な ロ ッ ク の説明 を 強調 し て い ま す。
表 8-4: for update 句と shared がカーソル・ロックに及ぼす影響
titles
authors
titleauthor
句
なし
for update
イ ンデ ッ ク ス に
sh_page
デー タ に
sh_page
デー タ に
sh_page
イ ンデ ッ ク ス に
updpage
イ ンデ ッ ク ス に
updpage
デー タ に
updpage
デー タ に
updpage
for update of
price
デー タ に
updpage
イ ンデ ッ ク ス に
sh_page
デー タ に
updpage
for update of
price
+ shared
デー タ に
sh_page
デー タ に
sh_page
デー タ に
sh_page
イ ンデ ッ ク ス に
sh_page
デー タ に
sh_page
デー タ に
sh_page
デー タ に
sh_page
set cursor rows の使用
SQL 規格では、 カ ー ソ ル に 1 ロ ーずつ の フ ェ ッ チ を 行 う よ う 規定 し
て い ま すが、 こ れは ネ ッ ト ワ ー ク 帯域幅の浪費に つ なが り ま す。 set
cursor rows ク エ リ ・ オプ シ ョ ン と Open Client の フ ェ ッ チ の ト ラ ン ス ペ
ア レ ン ト ・ バ ッ フ ァ 機能 を 使用 し て次の よ う に指定す る と 、 パ フ ォ ー
マ ン ス が向上 し ま す。
ct_cursor(CT_CURSOR_ROWS)
実行頻度が高 く 、 カ ー ソ ル を 使 う ア プ リ ケ ー シ ョ ン で返 さ れ る ロ ー数
を 選択す る 場合に は慎重に行い ま す。 つ ま り 、 ロ ー数 を ネ ッ ト ワ ー ク
に合わせて調整 し ま す。
こ の プ ロ セ ス の詳細に つ い ては、 「ネ ッ ト ワ ー ク ・ パ ケ ッ ト ・ サ イ ズ
の変更」 (21 ペ ー ジ ) を 参照 し て く だ さ い。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
291
カーソルを最適化するために
複数のコミットとロールバックにわたってカーソルをオープンに保つ
ANSI 標準は、 各 ト ラ ン ザ ク シ ョ ン の終了時に カ ー ソ ル を ク ロ ーズす
る よ う に規定 し て い ま す。 Transact-SQL では、 ANSI 標準が定め る 動作
を 満た さ な ければな ら な い ア プ リ ケ ー シ ョ ン に は、 set オプ シ ョ ン と
し て close on endtran を 指定で き ま す。 ただ し 、 デ フ ォ ル ト では こ の オ
プ シ ョ ン はオ フ に な っ て い ま す。 ANSI 稼働条件 を 満た さ な く て も よ
い場合は、 同時実行性 と ス ループ ッ ト を 維持す る た め に、 こ の オプ
シ ョ ン を オ フ の ま ま に し て く だ さ い。
ANSI 標準に準拠 し な ければな ら な い場合は、 Adaptive Server に対す
る 影響の処理方法 を 決定 し て く だ さ い。 た と えば、 1 つ の ト ラ ン ザ ク
シ ョ ン で多数の更新ま た は削除 を 実行す る か ど う か、 それ と も ト ラ ン
ザ ク シ ョ ン を 短 く す る か ど う か な ど を 決定 し ま す。
ト ラ ン ザ ク シ ョ ン を 短 く す る と 決め た場合は、 カ ー ソ ルがオ ープ ン さ
れ る たび に Adaptive Server が結果セ ッ ト を 実体化 し 直す必要が あ る た
め、 カ ー ソ ルの ク ロ ーズ と オ ープ ン が ス ループ ッ ト に影響 し ま す。 ト
ラ ン ザ ク シ ョ ン ご と に よ り 多 く の作業 を 実行す る こ と を 選択す る と 、
ク エ リ が ロ ッ ク を 保持す る た め に同時実行性の問題が起 こ る 可能性が
あ り ま す。
1 つの接続で複数のカーソルをオープンする
開発の仕方に よ っ ては、 DB-Library か ら 2 つ以上の接続 を 使用す る こ
と に よ っ て、 カ ー ソ ル を シ ミ ュ レ ー ト す る こ と も で き ま す。 1 つ の接
続は選択 を 実行 し 、 別の接続は同一の テーブル に対 し て更新ま た は削
除 を 実行 し ま す。 こ の た め、 ア プ リ ケ ー シ ョ ン ・ デ ッ ド ロ ッ ク が生成
さ れ る 可能性が非常に高 く な り ま す。 次に例 を 示 し ま す。
•
接続 A はペ ー ジ に共有 ロ ッ ク を 保持す る 。 Adaptive Server か ら 出
さ れた保留中の ロ ーが あ る かぎ り 、 現在の ペ ー ジ に共有 ロ ッ ク が
保持 さ れ る 。
•
接続 B は同一の ペ ー ジ に排他 ロ ッ ク を 要求 し 、 待機状態に入 る 。
•
ア プ リ ケ ー シ ョ ン は接続 B が成功す る の を 待 っ て か ら 、 共有 ロ ッ
ク を 削除す る た め に必要な論理 を 呼び出す。 し か し 、 実際に は こ
の よ う に は な ら な い。
接続 A は接続 B が保持す る ロ ッ ク を 決 し て要求 し な い た め、 こ の状態
はサーバ側のデ ッ ド ロ ッ ク では あ り ま せん。
292
Adaptive Server Enterprise
第
9
章
クエリ処理測定基準
トピック
概要
QP 測定基準の実行
測定基準へ の ア ク セ ス
測定基準の使用
測定基準の ク リ ア
ク エ リ 測定基準の取得制限
sysquerymetrics に お け る UID の理解
ページ
293
294
294
296
299
300
301
概要
ク エ リ 処理 (QP: Query Processing) 測定基準は、 ク エ リ 実行の経験
的な測定値 を 特定 し て比較 し ま す。 ク エ リ を 実行す る と 、 QP 測定
基準 を 比較す る た め の基盤に な る 定義済み の測定基準セ ッ ト に関
連づけ ら れ ま す。
取得 さ れ る 測定基準に は、 次の も の が あ り ま す。
•
CPU 実行時間 - ク エ リ の実行に か か る 時間 ( ミ リ 秒単位 )
•
経過時間 - コ ン パ イ ルか ら 実行終了ま で の時間 ( ミ リ 秒単位 )
•
論理 I/O - 論理 I/O の読み込み数
•
物理 I/O - 物理 I/O の読み込み数
•
カ ウ ン ト - ク エ リ の実行回数
•
ア ボー ト ・ カ ウ ン ト - リ ソ ー ス制限が超過 し た た め に
Resource Governor に よ っ て ク エ リ が ア ボー ト さ れた回数
カ ウ ン ト お よ び ア ボー ト ・ カ ウ ン ト を 除 く 各測定基準に は、 最小
値、 最大値、 お よ び平均値 と い う 3 つ の値が あ り ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
293
QP 測定基準の実行
QP 測定基準の実行
QP 測定基準は、 サーバ ・ レ ベル ま た はセ ッ シ ョ ン ・ レ ベルで ア ク
テ ィ ブ に し て使用す る こ と がで き ま す。
サーバ ・ レ ベルでは、 sp_configure に enable metrics capture オプ シ ョ ン を
使用 し ま す。 ア ド ホ ッ ク 文の QP 測定基準は、 シ ス テ ム ・ カ タ ロ グ に
直接取得 さ れ、 ス ト ア ド ・ プ ロ シ ー ジ ャ の文の QP 測定基準はプ ロ
シ ー ジ ャ ・ キ ャ ッ シ ュ に保存 さ れ ま す。 ス ト ア ド ・ プ ロ シ ー ジ ャ ま た
は ス テー ト メ ン ト ・ キ ャ ッ シ ュ の ク エ リ が フ ラ ッ シ ュ さ れた場合は、
取得 さ れた それぞれの測定基準が シ ス テ ム ・ カ タ ロ グ に書き込ま れ
ま す。
sp_configure "enable metrics capture", 1
セ ッ シ ョ ン ・ レ ベルでは、 set metrics_capture on/off を 使用 し ま す。
set metrics_capture on/off
測定基準へのアクセス
QP 測定基準は、 常にデ フ ォ ル ト ・ グループ に取得 さ れ ま す。 デ フ ォ
ル ト ・ グループは、 各デー タ ベ ー ス の グループ 1 です。 保存 さ れて い
る QP 測定基準 を デ フ ォ ル ト の実行グループか ら バ ッ ク ア ッ プ ・ グ
ループ に移動す る に は、 sp_metrics ‘backup’ を 使用 し ま す。 測定基準情
報に ア ク セ ス す る に は、 select 文に order by を 指定 し て sysquerymetrics
ビ ュ ー を 表示で き ま す。 詳細に つ い ては、 「sysquerymetrics ビ ュ ー」
(295 ペ ー ジ ) を 参照 し て く だ さ い。
測定基準情報 を ソ ー ト し 、 評価す る ク エ リ を 特定す る に は、 デー タ
操作言語 (DML: Data Manipulation Language) 文 を 使用す る こ と も で き
ま す。 Adaptive Server Enterprise の マ ニ ュ ア ル に含ま れ る 『 コ ン ポー ネ
ン ト 統合サー ビ ス ・ ユーザーズ ・ ガ イ ド 』 の 「第 2 章 コ ン ポー ネ ン ト
統合サー ビ ス に つ い て」 を 参照 し て く だ さ い。
294
Adaptive Server Enterprise
第9章
クエリ処理測定基準
sysquerymetrics ビュー
フィールド
uid
gid
id
hashkey
sequence
exec_min
exec_max
exec_avg
elap_min
elap_max
elap_avg
lio_min
lio_max
lio_avg
pio_min
pio_max
pio_avg
cnt
abort_cnt
qtext
定義
ユーザ ID
グループ ID
ユニー ク な ID
SQL ク エ リ ・ テキ ス ト に お け る ハ ッ シ ュ ・ キー
SQL コ ー ド の テキ ス ト に複数の ロ ーが必要に な る 場合の ロ ー
の シ ー ケ ン ス番号
最小実行時間
最大実行時間
平均実行時間
最小経過時間
最大経過時間
平均経過時間
最小論理 I/O
最大論理 I/O
平均論理 I/O
最小物理 I/O
最大物理 I/O
平均物理 I/O
ク エ リ の実行回数
リ ソ ー ス制限の超過に よ り Resource Governor に よ っ て ク エ リ
が ア ボー ト さ れた回数
ク エ リ ・ テキ ス ト
こ の ビ ュ ー の平均値は、 次の よ う に計算 さ れ ま す。
new_avg = (old_avg * old_count + new_value )/ (old_count + 1) = old_avg +
round((new_value - old_avg)/(old_count + 1))
次に sysquerymetrics ビ ュ ー の例 を 示 し ま す。
select * from sysquerymetrics
uid
gid
hashkey
id
sequence
exec_min
exec_max
exec_avg
elap_min
elap_max
elap_avg
lio_min
lio_max
lio_avg
pio_min
pio_max
pio_avg
cnt
abort_cnt
qtext
----------- ----------- ----------- ----------- ----------- --------------------- ----------- ----------- ----------- ----------- --------------------- ----------- ----------- ----------- ----------- -----------------------------------------------------------------------------------
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
295
測定基準の使用
1
1
106588469
480001710
0
0
0
0
16
33
25
4
4
4
0
4
2
2
0
select distinct c1 from t_metrics1 where c2 in (select c2 from t_metrics2)
上の例は、 SQL 文の レ コ ー ド を 示 し ま す。 こ の文の ク エ リ ・ テキ ス ト
は select distinct c1 from t_metrics1 where c2 in (select c2 from t_metrics2) です。
•
こ の文の現在ま で の実行回数は 2 回 (cnt = 2)。
•
最小経過時間は 16 ミ リ 秒、 最大経過時間は 33 ミ リ 秒、 平均経過
時間は 25 ミ リ 秒。
•
実行時間はすべて 0。 こ れは CPU 実行時間が 1 ミ リ 秒未満で あ る
可能性が あ る た め。
•
最大物理 I/O は 4。 こ れは最大論理 I/O と 同一で あ る 。 ただ し 、
2 回目の実行時に既にデー タ がキ ャ ッ シ ュ さ れて い る た め、 最小
物理 I/O は 0 と な っ て い る 。 論理 I/O は 4 で、 デー タ が メ モ リ に
あ っ て も な く て も同じ であ る。
測定基準の使用
QP 測定基準に よ り 得 ら れ る 情報 を 使用 し て、 次の点 を 特定で き ま す。
•
ク エ リ ・ パ フ ォ ー マ ン ス の後退
•
バ ッ チ実行の ク エ リ の中で最 も コ ス ト の高い ク エ リ
•
最 も 頻繁に実行 さ れて い る ク エ リ
問題 を 引き起 こ し て い る 可能性が あ る ク エ リ の情報が得 ら れ る と 、
ク エ リ を 調整 し て効率 を 向上 さ せ る こ と がで き ま す。
た と えば、 最 も コ ス ト の高い ク エ リ を 特定 し て微調整で き れば、 同 じ
バ ッ チ の コ ス ト の低い ク エ リ を 調整す る 場合よ り も 効率的な改善 を 望
む こ と がで き ま す。
さ ら に最 も 頻繁に実行 さ れ る ク エ リ を 特定 し て微調整す る こ と で、
効率 を 改善で き ま す。
ク エ リ 測定基準 を オ ン に す る と 、 すべて の実行 ク エ リ に追加 I/O が必
要に な る 場合が あ る た め、 パ フ ォ ー マ ン ス に影響 を 及ぼす可能性が あ
り ま す。 し か し 、 上述の利点が得 ら れ る た め、 こ の点 も 含め て検討 し
て く だ さ い。 測定基準 を オ ン に す る よ り も 、 モ ニ タ リ ン グ ・ テーブル
か ら 統計情報 を 収集 し た方が効果的な場合 も あ り ま す。
296
Adaptive Server Enterprise
第9章
クエリ処理測定基準
QP 測定基準お よ びモ ニ タ リ ン グ ・ テーブル を 使用す る と 、 統計情報
を 収集で き ま す。 ただ し 、 モ ニ タ リ ン グ ・ テーブルの代わ り に QP 測
定基準 を 使用す る と 、 モ ニ タ リ ン グ ・ テーブルの一時的な情報では
な く 、 永続的な カ タ ロ グ に集計 さ れた履歴 ク エ リ 情報 を 収集す る こ と
がで き ま す。
例
QP 測定基準 を 使用 し て、 調整す る 特定の ク エ リ お よ びパ フ ォ ー マ ン
ス後退の可能性 を 特定で き ま す。
最もコストの高い文を特定する
通常、 調整候補 と し て最 も コ ス ト の高い文 を 特定す る に は、
sysquerymetrics に よ り 、 測定オプ シ ョ ン と し て CPU 実行時間、
経過時間、 論理 I/O、 お よ び物理 I/O を 取得 し ま す。 た と えば、
通常の測定に は論理 I/O が使用 さ れ ま す。 次の ク エ リ を 使用 し て、
I/O の数が高すぎ る 文 を 調整候補 と し て特定 し ま す。
select lio_avg, qtext from sysquerymetrics order by lio_avg
lio_avg qtext
---------------------------------------------------------------2
select c1, c2 from t_metrics1 where c1 = 333
4
select distinct c1 from t_metrics1 where c2 in (select c2 from t_metrics2)
6
select count(t_metrics1.c1) from t_metrics1, t_metrics2,
t_metrics3 where (t_metrics1.c2 = t_metrics2.c2 and
t_metrics2.c2 = t_metrics3.c2 and t_metrics3.c3 = 0)
164
select min(c1) from t_metrics1 where c2 in (select t_metrics2.c2 from
t_metrics2, t_metrics3 where (t_metrics2.c2 = t_metrics3.c2 and t_metrics3.c3
= 1))
(4 rows affected)
最適な調整候補は、 上記の結果の最後の文で、 平均論理 I/O の最高値
(164) が示 さ れて い ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
297
測定基準の使用
調整のために最も頻繁に使用されている文を特定する
ク エ リ が頻繁に使用 さ れ る 場合は、 微調整 を 行 う こ と でパ フ ォ ー マ ン
ス を 向上 さ せ る こ と がで き ま す。 select 文に order by を 指定す る と 、
最 も 頻繁に使用 さ れ る ク エ リ を 特定で き ま す。
select elap_avg, cnt, qtext from sysquerymetrics order by cnt
elap_avg cnt
qtext
----------- -----------------------------------------------------------0
1
select c1, c2 from t_metrics1 where c1 = 333
16
2
select distinct c1 from t_metrics1 where c2 in (select c2 from t_metrics2)
24
3
select min(c1) from t_metrics1 where c2 in (select t_metrics2.c2 from
t_metrics2, t_metrics3 where (t_metrics2.c2 = t_metrics3.c2 and t_metrics3.c3
= 1))
78
4
select count(t_metrics1.c1) from t_metrics1, t_metrics2, t_metrics3 where
(t_metrics1.c2 = t_metrics2.c2 and t_metrics2.c2 = t_metrics3.c2 and
t_metrics3.c3 = 0)
(4 rows affected)
最適な調整候補は、 結果の上の最後の文で、 最高値 (78) が示 さ れて い
ま す。
298
Adaptive Server Enterprise
第9章
クエリ処理測定基準
パフォーマンス後退の可能性を特定する
場合に よ っ ては、 サーバ を 新 し い バー ジ ョ ン に ア ッ プグ レ ー ド し た と
き に、 QP 測定基準 を 使用 し てパ フ ォ ー マ ン ス を 比較す る こ と が有益
に な り ま す。 サーバ の バー ジ ョ ン を ア ッ プグ レ ー ド し た後に、 パ
フ ォ ー マ ン ス が後退 し て い る ク エ リ を 特定す る に は、 次の手順に従い
ま す。
1
QP 測定基準 を 古い サーバか ら バ ッ ク ア ッ プ ・ グループ に バ ッ ク
ア ッ プ し ま す。
sp_metrics ‘backup’, ’@gid’
2
新 し いサーバで QP 測定基準 を 有効に し ま す。
sp_configure “enable metrics capture”, 1
3
古い サーバ と 新 し いサーバ の QP 測定基準の出力 を 比較 し て、
パ フ ォ ー マ ン ス後退の問題が考え ら れ る ク エ リ を 特定 し ま す。
測定基準のクリア
メ モ リ 内の すべて の集計測定基準 を シ ス テ ム ・ カ タ ロ グ に フ ラ ッ シ ュ
す る に は、 sp_metrics ‘flush’ を 使用 し ま す。 メ モ リ 内に あ る すべて の文
の集計測定基準がゼ ロ に設定 さ れ ま す。
sp_metrics ‘drop’, ‘@gid’ [, ‘@id'
1 つ の エ ン ト リ を 削除す る に は、 次の コ マ ン ド を 使用 し ま す。
sp_metrics ‘drop’, ‘<gid>’, ‘<id>’
filter を 使用 し 、 測定基準の条件 を 指定 し て シ ス テ ム ・ カ タ ロ グか ら
QP 測定基準 を 削除す る こ と も で き ま す。
sp_metrics ‘filter’, ‘@gid’, [, ‘@predicate’]
次の例では、 lio_max < 100 の条件に当ては ま る すべて の QP 測定基準
を グループ 1 か ら 削除 し ま す。
sp_metrics ‘filter’,’1’,’lio_max < 100'
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
299
クエリ測定基準の取得制限
クエリ測定基準の取得制限
次の設定パ ラ メ ー タ を 使用 し て、 カ タ ロ グ に取得す る ク エ リ 測定基準
の ス レ ッ シ ョ ル ド を 設定で き ま す。
•
metrics lio max
•
metrics pio max
•
metrics elap max
•
metrics exec max
こ れ ら の パ ラ メ ー タ に よ り 、 カ タ ロ グ に測定基準情報 を 書き込む前
に、 重要性の低い測定基準 を フ ィ ル タ す る こ と がで き ま す。
デ フ ォ ル ト では、 こ れ ら の設定パ ラ メ ー タ は 0 ( オ フ ) に設定 さ れて
い ま す。
た と えば、 lio が 10 未満の ク エ リ ・ プ ラ ン を 取得 し な い よ う に す る
に は、 次の コ マ ン ド を 使用 し ま す。
sp_configure ‘metrics lio max’, 10
こ れ ら の設定パ ラ メ ー タ を 設定 し な い と 、 Adaptive Server に よ り ク エ
リ 測定基準が シ ス テ ム ・ テーブル に取得 さ れ ま す。 し か し 、 こ れ ら の
設定パ ラ メ ー タ の いずれか を 設定す る と 、 Adaptive Server に よ り 、 0
以外の設定パ ラ メ ー タ の み を 使用 し て ク エ リ 測定基準 を 取得す る か ど
う かが判断 さ れ ま す。
た と えば、 metrics elap max の み を 0 以外に設定す る と 、 経過時間が設
定値よ り も 大き い場合に の み ク エ リ 測定基準が取得 さ れ ま す。 他の 3
つ の設定パ ラ メ ー タ が 0 に設定 さ れて い る た め、 こ れ ら の パ ラ メ ー タ
は測定基準の取得ス レ ッ シ ョ ル ド と し て機能 し ま せん。
300
Adaptive Server Enterprise
第9章
クエリ処理測定基準
sysquerymetrics における UID の理解
ユーザ名で修飾 さ れな い ク エ リ の すべて の テーブル名がデー タ ベー ス
所有者に よ り 所有 さ れて い る 場合、 sysquerymetrics の ユーザ ID (UID)
は 0 に な り ま す。
例1
select * from t1 where cl = 1
t1 はデー タ ベ ー ス所有者に よ り 所有 さ れ、 さ ま ざ ま なユーザの間で共
有 さ れて い ま す。 ど の ユーザが ク エ リ を 発行 し て い る か に関係な く 、
sysquerymetrics の UID エ ン ト リ は 0 に な り ま す。
例2
select * from t2 where cl = 1
こ の場合は、 t2 が user1 に よ り 所有 さ れて い ま す。 t2 が修飾 さ れて お
ら ず、 デー タ ベー ス所有者に よ り 所有 さ れて い な い た め、
sysquerymetrics の エ ン ト リ は user1 の UID に な り ま す。
例3
select * from u1.t3 where cl = 1
こ の場合は、 t3 が u1 に よ り 所有 さ れ、 u1 に よ り 修飾 さ れて い る た め、
UID 0 が使用 さ れ ま す。
こ れ に よ り 、 ユーザ ID 間で共有 さ れ る 測定基準が増加 し 、
sysqueryplans の エ ン ト リ 数が低減 し ま す。 同一 ク エ リ の測定基準は、
ユーザ ID が異な っ て も 自動的に集計 さ れ ま す。 ク エ リ を 発行 し たユー
ザの UID を 使用す る に は、 ト レ ー ス ・ フ ラ グ 15361 を オ ン に し ま す。
注意 insert...selec, /update, delete 文の QP 測定基準は、 1 つ以上の
テーブルが関与す る 場合に取得 さ れ ま す。 CIS 関連の ク エ リ お よ び
insert...values 文は含 ま れ ま せん。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
301
sysquerymetrics における UID の理解
302
Adaptive Server Enterprise
第
1 0
章
パフォーマンス改善のための統計値
の使用
正確な統計値は ク エ リ 最適化に必須です。 先行の イ ン デ ッ ク ス ・
キーで な い カ ラ ム に対 し て統計値 を 追加す る と 、 ク エ リ の パ
フ ォ ー マ ン ス が向上す る 場合 も あ り ま す。 こ の章では、 統計値 を
管理す る コ マ ン ド の使用方法に つ い て説明 し ま す。
トピック
Adaptive Server で管理 さ れ る 統計値
統計値の重要性
統計値の更新
統計値の自動更新
自動 update statistics の設定
カ ラ ム統計値 と 統計値管理
カ ラ ム統計値の作成 と 更新
ヒ ス ト グ ラ ム の ス テ ッ プ数の選択
update statistics 実行時の ス キ ャ ン ・ タ イ プ、 ソ ー ト の稼働
条件、 ロ ッ ク
delete statistics コ マ ン ド の使用
ロ ー ・ カ ウ ン ト が不正確な場合
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
ページ
304
304
306
311
315
319
320
325
327
330
331
303
Adaptive Server で管理される統計値
Adaptive Server で管理される統計値
次の主要な オプテ ィ マ イ ザ統計値は Adaptive Server で管理 さ れ ま す。
•
パーテ ィ シ ョ ン あ た り の統計値 - テーブル ・ ロ ー ・ カ ウ ン ト 、
テーブル ・ ペー ジ ・ カ ウ ン ト 。 非分割テーブルは、 systabstats カ タ
ロ グ用の 1 つ の パーテ ィ シ ョ ン が あ る と 見な さ れ ま す。 パーテ ィ
シ ョ ン あ た り の統計値は systabstats に あ り ま す。
•
イ ンデ ッ ク ス あ た り の統計値 - イ ンデ ッ ク ス ・ ロ ー ・ カ ウ ン ト -
イ ン デ ッ ク ス の高 さ 、 イ ン デ ッ ク ス ・ リ ー フ ・ ペー ジ ・ カ ウ ン
ト 。 ロ ー カ ル ・ イ ン デ ッ ク ス に は、 イ ン デ ッ ク ス ・ パーテ ィ シ ョ
ン ご と に個別の systabstats ロ ーが あ り ま す。 グ ロ ーバル ・ イ ン
デ ッ ク ス は、 1 つ の パーテ ィ シ ョ ン を 持つ分割 イ ン デ ッ ク ス と み
な さ れ、 1 つ の systabstats ロ ーが あ り ま す。 イ ン デ ッ ク ス あ た り の
統計値 : イ ン デ ッ ク ス ・ ロ ー ・ カ ウ ン ト は systabstats に あ り ま す。
•
カ ラ ム あ た り の統計値 - デー タ 分布。 カ ラ ム あ た り の統計値は
sysstatistics に あ り ま す。
•
カ ラ ム の グループ あ た り の統計値 - 密度の情報。 カ ラ ム の グルー
プ あ た り の統計値は sysstatistics に あ り ま す。
•
パーテ ィ シ ョ ン あ た り の統計値 -
•
カ ラ ム統計値 - カ ラ ム あ た り のデー タ 分布、 カ ラ ム の グルー
プ あ た り の密度。 カ ラ ム統計値は sysstatistics に あ り ま す。
こ の章で、 密度 と は特定の カ ラ ム の値の一意性 を 統計的に測定 し た も
の で、 ヒ ス ト グ ラ ム と は関連す る 特定の カ ラ ム の値の分布 を 統計的に
表 し た も の です。
統計値の重要性
Adaptive Server の コ ス ト ・ ベー ス の オプテ ィ マ イ ザは、 ク エ リ 内で指
定 さ れた テーブル、 イ ン デ ッ ク ス、 パーテ ィ シ ョ ン、 カ ラ ム に つ い て
の統計値 を 使用 し て ク エ リ の コ ス ト を 見積 も り ま す。 オプテ ィ マ イ ザ
は、 最小 コ ス ト で あ る と 判断 し た ア ク セ ス ・ メ ソ ッ ド を 選択 し ま す。
し か し 統計値が正確で な い と 、 正確な コ ス ト を 見積 も れ ま せん。
統計値の中に は、 テーブル中の ペ ー ジ数や ロ ー数の よ う に、 ク エ リ 処
理中に更新 さ れ る も の が あ り ま す。 ま た、 カ ラ ム の ヒ ス ト グ ラ ム の よ
う に、 update statistics を 実行 し た と き や イ ン デ ッ ク ス を 作成 し た と き
に だけ更新 さ れ る 統計値 も あ り ま す。
304
Adaptive Server Enterprise
第 10 章
パフォーマンス改善のための統計値の使用
ク エ リ の パ フ ォ ー マ ン ス が低下 し 、 Sybase 製品の保守契約 を 結ん で い
る サポー ト ・ セ ン タ か Web 上の Sybase ニ ュ ー ス ・ グループ に問い合
わせた場合、 最初に update statistics の実行の有無に つ い て質問 さ れ る
こ と が あ り ま す。 次の よ う に optdiag コ マ ン ド を 使用す る と 、 update
statistics を 最後に実行 し た日時 を 統計値の あ る カ ラ ム ご と に確認で き
ま す。
Last update of column statistics: Aug 31 2004
4:14:17:180PM
統計値の管理に必要な も う 1 つ の コ マ ン ド は delete statistics です。 イ ン
デ ッ ク ス を 削除 し て も 、 そ の イ ン デ ッ ク ス の統計値は削除 さ れ ま せ
ん。 イ ン デ ッ ク ス の削除後に カ ラ ム中でキー の分布が変わ っ て も 、 統
計値が い く つ か の ク エ リ に そ の ま ま使用 さ れて い る と 、 古 く な っ た統
計値が ク エ リ ・ プ ラ ン に影響 を 与え ま す。
グ ロ ーバル ・ イ ン デ ッ ク ス に よ る ヒ ス ト グ ラ ム統計値は、 ロ ー カ ル ・
イ ン デ ッ ク ス に よ っ て生成 さ れ る ヒ ス ト グ ラ ム統計値よ り も 正確で
す。 ロ ー カ ル ・ イ ン デ ッ ク ス の場合、 パーテ ィ シ ョ ン ご と に統計値が
作成 さ れ、 各パーテ ィ シ ョ ン の重複す る ヒ ス ト グ ラ ム ・ セルの組み合
わせ方法に応 じ た近似値 を 使用 し て マ ー ジ さ れ、 グ ロ ーバル ・ ヒ ス ト
グ ラ ム が作成 さ れ ま す。 グ ロ ーバル ・ イ ン デ ッ ク ス では、 見積 も り 値
の マ ー ジ を 伴 う マ ー ジ ・ ス テ ッ プは実行 さ れ ま せん。 ほ と ん ど の場
合、 ロ ー カ ル ・ イ ン デ ッ ク ス で の update statistics に問題は あ り ま せん。
ただ し 、 分割テーブル に関連す る ク エ リ に大き な見積 も り エ ラ ーが あ
る 場合は、 ロ ー カ ル ・ イ ン デ ッ ク ス の統計値 を 更新す る の では な く 、
カ ラ ム の グ ロ ーバル ・ イ ン デ ッ ク ス を 作成 し て削除す る こ と に よ っ
て、 ヒ ス ト グ ラ ム精度が向上 し ま す。
バイナリ以外の文字セットのヒストグラム補間
Adaptive Server バー ジ ョ ン 15.0.2 以降 を 使用す る と 、 過剰な数の ヒ ス
ト グ ラ ム ・ ス テ ッ プ を 必要 と し な い で、 バ イ ナ リ 文字セ ッ ト と 同様の
正確性 を 、 選択性の見積 も り で実現で き ま す。 こ の こ と は、 範囲述部
の あ る 次の よ う な ク エ リ に役立 ち ま す。
select * from t1 where charcolumn > "LMC0021" and
charcolumn <= "LMC0029"
指定 し た範囲が同 じ ヒ ス ト グ ラ ム ・ セル内に収ま る 場合、 Adaptive
Server は こ の選択性 を さ ら に正確に見積 も る こ と がで き ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
305
統計値の更新
15.0.2 よ り 前の バー ジ ョ ン の Adaptive Server では、 デ フ ォ ル ト の バ イ
ナ リ 文字セ ッ ト に お い て の み、 範囲述部の選択性の見積 も り に使用 さ
れ る ヒ ス ト グ ラ ム補間が役立 っ て い ま し た。 そ の他すべて の文字セ ッ
ト では、 ヒ ス ト グ ラ ム ・ セル に つ い て 50% の選択性が見積 も ら れ ま
し た。 そ の た め、 通常 Adaptive Server は、 こ の見積 も り に関連す る エ
ラ ー を 削減す る た め に、 文字カ ラ ム ・ ヒ ス ト グ ラ ム に多数の ヒ ス ト グ
ラ ム ・ セル を 使用す る 必要が あ り ま し た。
統計値の更新
update statistics コ マ ン ド は、 ヒ ス ト グ ラ ム や密度 と い っ た、 カ ラ ム関
連の統計値 を 更新 し ま す。 イ ン デ ッ ク ス中の キー分布に、 ク エ リ で の
イ ン デ ッ ク ス使用に影響す る よ う な変更が あ っ た カ ラ ム では、 統計値
を 更新す る 必要が あ り ま す。
update statistics コ マ ン ド の実行に は、 シ ス テ ム ・ リ ソ ー ス が必要です。
他の管理 タ ス ク と 同様、 コ マ ン ド の実行は、 サーバ の負荷が軽い時間
に ス ケ ジ ュ ールす る こ と を おすす め し ま す。 特に update statistics は イ
ン デ ッ ク ス の テーブル ・ ス キ ャ ン か リ ー フ レ ベル ・ ス キ ャ ン を 必要 と
し 、 I/O 競合が増加 し た り 、 ソ ー ト の実行の た め に CPU を 使用 し た
り 、 デー タ ・ キ ャ ッ シ ュ と プ ロ シ ー ジ ャ ・ キ ャ ッ シ ュ を 使用 し た り し
ま す。 こ れ ら の リ ソ ー ス を 使用す る と 、 サーバで実行 し て い る ク エ リ
に悪影響 を 与え る 可能性が あ り ま す。
サ ン プ リ ン グ機能 を 使用す る と 、 リ ソ ー ス要件が軽減 さ れ、 こ の作業
を 柔軟に実行で き ま す。
さ ら に、 update statistics コ マ ン ド に は、 更新 を ブ ロ ッ ク す る 共有 ロ ッ
ク が必要です。 詳細に つ い ては、 「update statistics 実行時の ス キ ャ ン ・
タ イ プ、 ソ ー ト の稼働条件、 ロ ッ ク 」 (327 ペ ー ジ ) を 参照 し て く だ
さ い。
ま た、 シ ス テ ム ・ リ ソ ー ス に与え る 影響が最 も 小 さ い と き に update
statistics を 自動的に実行す る よ う に Adaptive Server を 設定す る こ と も
で き ま す。 詳細に つ い ては、 「統計値の自動更新」 (311 ペー ジ ) を 参照
し て く だ さ い。
306
Adaptive Server Enterprise
第 10 章
パフォーマンス改善のための統計値の使用
インデックス未設定カラムへの統計値の追加
イ ンデ ッ ク ス を作成す る と き、 イ ンデ ッ ク ス内の先行カ ラ ム の ヒ ス ト グ
ラ ムが生成 さ れ ま す。 別の章では、 他の カ ラ ム の統計値がオプテ ィ マ イ
ザ統計値の正確性を ど の よ う に高め る か に つ い て説明し て い ま す。
探索引数 と し て頻繁に使用 さ れ る すべて の カ ラ ム に対 し て、 統計値の
追加 を 検討 し 、 管理ス ケ ジ ュ ール の許す限 り 、 こ れ ら の統計値 を 最新
の も の に保 っ て く だ さ い。
特に、 先行の イ ン デ ッ ク ス ・ キー と と も に複合 イ ン デ ッ ク ス の マ イ
ナー ・ カ ラ ム が探索引数や ジ ョ イ ン で使用 さ れて い る 場合、 複合 イ ン
デ ッ ク ス の マ イ ナ ー ・ カ ラ ム に統計値 を 追加す る と 、 コ ス ト 見積 も り
を 大幅に改善で き ま す。
プロキシ・テーブルとビューの統計値更新の制限
プ ロ キ シ ・ テーブル の イ ン デ ッ ク ス を 作成す る と 、 パ フ ォ ー マ ン ス が
低下す る こ と が あ り ま す。 Adaptive Server では コ マ ン ド を リ モ ー ト ・
ビ ュ ー に反映で き な い た め、 create index を 実行で き ま せん。 ただ し 、
プ ロ キ シ ・ テーブル を ユーザ ・ テーブル に マ ッ プ し た場合、 Adaptive
Server ではプ ロ キ シ ・ テーブルの ジ ョ イ ン ・ カ ラ ム の イ ン デ ッ ク ス を
作成す る こ と に よ っ て ク エ リ ・ プ ラ ン を 最適化で き ま す。
ビ ュ ー に よ っ て返 さ れ る ロ ー の数が実行に よ っ て大幅に異な る 場合、
プ ロ キ シ ・ テーブル の統計値 を 収集す る と き に パ フ ォ ー マ ン ス が低下
し ま す。
プ ロ キ シ ・ テーブル ま た は ビ ュ ー を 使用す る 場合は、 次の こ と を おす
す め し ま す。
•
ビ ュ ー に定義 さ れた プ ロ キ シ ・ テーブルで update statistics を 実行
し な い。
•
ビ ュ ー に定義 さ れた プ ロ キ シ ・ テーブルで update statistics を 実行
し た場合は、 プ ロ キ シ ・ テーブル を 削除 し て か ら 再作成す る こ と
に よ っ てパ フ ォ ー マ ン ス を 向上 さ せ る 。 systabstats では元の ロ ー ・
カ ウ ン ト が保持 さ れ る た め、 delete statistics を 使用 し て現在の統計
値 を 削除す る こ と はで き な い。
•
ビ ュ ー を 永久テーブル に変換す る 。
•
コ マ ン ド ・ ラ イ ン ・ ト レ ー ス ・ フ ラ グ 318 を 使用 し てみ る ( 再
フ ォ ー マ ッ ト の強制 )。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
307
統計値の更新
update statistics コマンド
update statistics コ マ ン ド は、 特定の カ ラ ム に統計値がな い場合は統計
値 を 作成 し 、 すで に存在す る 場合は既存の統計値 と 置き換え ま す。
統計値は、 シ ス テ ム ・ テーブル systabstats お よ び sysstatistics に格納 さ
れ ま す。
update statistics table_name
[[ partition data_partition_name ] [ (column_list ) ] |
index_name [ partition index_partition_name ] ]
[ using step values ]
[ with consumers = consumers] [, sampling=percent]
update index statistics
table_name [[ partition data_partition_name ] |
[ index_name [ partition index_partition_name ] ] ]
[ using step values ]
[ with consumers = consumers] [, sampling=percent]
update all statistics table_name
[ partition data_partition_name ]
[ sp_configure histogram tuning factor, <value>
update table statistics
table_name [partition data_partition_name ]
delete [ shared ] statistics table_name
[ partition data_partition_name ]
[( column_name[, column_name ] ...)]
•
308
update statistics の場合
•
table_name - テーブル上に あ る 各 イ ン デ ッ ク ス内の先行カ ラ
ム の統計値 を 生成。
•
table_name index_name - イ ン デ ッ ク ス の全カ ラ ム の統計値 を
生成。
•
partition_name - こ の パーテ ィ シ ョ ン の み の統計値 を 生成。
•
partition_name table_name (column_name) - こ の パーテ ィ シ ョ
ン に あ る こ の テーブルの こ の カ ラ ム の統計値 を 生成。
•
table_name (column_name) - こ の カ ラ ム の み の統計値 を 生成。
•
table_name (column_name, column_name...) - セ ッ ト 内の先行カ
ラ ム の ヒ ス ト グ ラ ム と プ レ フ ィ ク ス ・ サブセ ッ ト に対す る 複
数カ ラ ム の密度値 を 生成。
Adaptive Server Enterprise
第 10 章
パフォーマンス改善のための統計値の使用
•
using step values - 使用す る ス テ ッ プ数 を 指定。 デ フ ォ ル ト の
ス テ ッ プ数は 20。 デ フ ォ ル ト の ス テ ッ プ数 を 変更す る に は、
sp_configure を 使用す る 。
•
sampling = percent - サ ン プ リ ン グ率 を 表す数値。 5% の場合は
05、 10% の場合は 10 の よ う に指定す る 。 0 ~ 100 の範囲の数
値 を 指定す る 。
•
•
update index statistics の場合
•
table_name - テーブル上に あ る 全 イ ン デ ッ ク ス内の全カ ラ ム
の統計値 を 生成。
•
partition_name table_name - こ の パーテ ィ シ ョ ン に あ る テーブ
ルの全 イ ン デ ッ ク ス内の全カ ラ ム の統計値 を 生成。
•
table_name index_name - こ の イ ン デ ッ ク ス の全カ ラ ム の統計
値 を 生成。
update all statistics の場合
•
table_name - テーブル の全カ ラ ム の統計値 を 生成。
•
table_name partition_name - パーテ ィ シ ョ ン に あ る テーブル の
全カ ラ ム の統計値 を 生成。
•
using step values - 使用す る ス テ ッ プ数 を 指定。 デ フ ォ ル ト の
ス テ ッ プ数は 20。 デ フ ォ ル ト の ス テ ッ プ数 を 変更す る に は、
sp_configure を 使用す る 。
sp_configure 構文に は histogram tuning factor が含 ま れて お り 、 ヒ
ス ト グ ラ ム の ス テ ッ プ数 を 選択で き ま す。 histogram tuning factor
のデ フ ォ ル ト 値は 20 です。 sp_configure の詳細に つ い ては、
『シ ス テ ム管理ガ イ ド : 第 1 巻』 の 「第 5 章 設定パ ラ メ ー タ 」
を 参照 し て く だ さ い。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
309
統計値の更新
update statistics のサンプリングの使用
Adaptive Server の オプテ ィ マ イ ザは、 デー タ ベ ー ス の統計値 を 使用 し
て ク エ リ の設定 と 最適化 を 行い ま す。 最良の結果 を 得 る に は、 統計値
がで き る かぎ り 最新の も の で あ る こ と が必要です。
テーブルな ど のデー タ ・ セ ッ ト に対 し て update statistics コ マ ン ド を 実
行す る と 、 指定 し た イ ン デ ッ ク ス ま た は カ ラ ム内、 イ ン デ ッ ク ス内の
すべて の カ ラ ム、 あ る い はテーブル内の すべて の カ ラ ム の キー値の分
布に関す る 情報が更新 さ れ ま す。 ま た、 カ ラ ム レ ベル統計の ヒ ス ト グ
ラ ム と 密度値 も 更新 さ れ ま す。 オプテ ィ マ イ ザはそ の結果 を 使用 し て
最適な ク エ リ ・ プ ラ ン を 計算 し ま す。
サ ン プ リ ン グ方式 を 使用 し て update statistics を 実行 し ま す。 こ れ に
よ り 、 メ ン テナ ン ス時間が少な く 、 デー タ ・ セ ッ ト が大き い場合の
I/O と 時間 を 削減で き ま す。 常時使用 さ れ、 ト ラ ン ケ ー ト お よ び再移
植 さ れ る 大規模なデー タ ・ セ ッ ト ま た はテーブル を 更新す る 場合は、
統計的サ ン プ リ ン グ を 行 う こ と に よ っ て、 時間 と I/O サ イ ズ を 削減で
き ま す。 サ ン プ リ ン グでは密度値が更新 さ れな い た め、 サ ン プ リ ン グ
を 使用す る 前に update statistics を 実行 し て正確な密度値 を 求め ま す。
結果が十分に正確 と は限 ら な い の で、 サ ン プ リ ン グ に は注意が必要
です。 ヒ ス ト グ ラ ム値の変化 と I/O の節減の バ ラ ン ス を と っ て く だ
さ い。
サ ン プ リ ン グでは、 非サ ン プ リ ン グ update statistics コ マ ン ド で作成 さ
れた密度値が更新 さ れ ま せん。 密度は ゆ っ く り と 変化す る た め、 サ ン
プ リ ン グ に よ っ て計算 し た近似値で正確な密度 を 置き換え て も 見積 も
り 値は改善 さ れ ま せん。 サ ン プ リ ン グ update statistics コ マ ン ド に よ っ
て生成 さ れた密度値は更新 さ れ ま す。 Sybase では、 1 つ の非サ ン プ リ
ン グ update statistics コ マ ン ド を 使用 し て正確な密度値 を 設定 し た後に、
多数のサ ン プ リ ン グ update statistics コ マ ン ド を 使用す る こ と を おすす
め し ま す。 サ ン プ リ ン グ update statistics で密度 を 更新す る に は、 サ ン
プ リ ン グで update statistics を 使用す る 前に カ ラ ム統計値 を 削除 し ま す。
サ ン プ リ ン グ を 使用す る か ど う か を 判断す る と き は、 デー タ ・ セ ッ ト
の サ イ ズ、 作業時間の制約、 生成 さ れ る ヒ ス ト グ ラ ム が必要な程度に
正確で あ る か を 考慮に入れて く だ さ い。
310
Adaptive Server Enterprise
第 10 章
パフォーマンス改善のための統計値の使用
サ ン プ リ ン グで使用す る パー セ ン テー ジ は要件に応 じ て異な り ま す。
特定のデー タ ・ セ ッ ト に つ い て の情報 を 最 も 正確に反映 し た結果が得
ら れ る ま で、 さ ま ざ ま な パー セ ン テー ジ を テ ス ト し て く だ さ い。
update statistics authors(auth_id) with sampling = 5 percent
次の パ ラ メ ー タ を 使用 し て、 サーバ ワ イ ド なサ ン プ リ ン グ率 を 設定 し
ま す。
sp_configure 'sampling percent', 5
こ の コ マ ン ド は、 update statistics の サーバ ワ イ ド なサ ン プ リ ン グ率 を
5% に設定 し ま す。 こ れ に よ り 、 sampling 構文 を 使用せずに update
statistics を 実行で き る よ う に な り ま す。 0% ~ 100% ま で の任意の パー
セ ン テー ジ を 指定で き ま す。
統計値の自動更新
Adaptive Server コ ス ト ベ ー ス の ク エ リ ・ プ ロ セ ッ サは、 ク エ リ 内で指
定 さ れた テーブル、 イ ン デ ッ ク ス、 カ ラ ム に つ い て の統計値 を 使用 し
て ク エ リ の コ ス ト を 見積 も り ま す。 ク エ リ ・ プ ロ セ ッ サは、 最小 コ ス
ト で あ る と 判断 し た ア ク セ ス ・ メ ソ ッ ド を 選択 し ま す。 し か し 統計値
が正確で な い と 、 正確な コ ス ト を 見積 も れ ま せん。 update statistics を 実
行 し て統計値 を 最新の値に す る こ と がで き ま すが、 CPU 時間、 バ ッ
フ ァ ・ プール、 ソ ー ト ・ バ ッ フ ァ 、 プ ロ シ ー ジ ャ ・ キ ャ ッ シ ュ な ど の
シ ス テ ム ・ リ ソ ー ス が消費 さ れ る た め、 update statistics の実行に は コ
ス ト が伴い ま す。
update statistics を サ イ ト の最適な タ イ ミ ン グで自動的に実行す る よ う
に設定 し て、 シ ス テ ム の妨げに な ら な い よ う に で き ま す。 datachange
関数 を 使用 し て update statistics の最適な実行 タ イ ミ ン グ を 指定 し ま す。
datachange は、 update statistics を 必要以上に実行 し な い よ う に す る た め
に も 役立 ち ま す。 Job Scheduler テ ン プ レ ー ト を 使用 し て、 update
statistics を 起動す る オブ ジ ェ ク ト 、 ス ケ ジ ュ ール、 優先順位、 お よ び
datachange ス レ ッ シ ョ ル ド を 指定で き ま す。 こ れ に よ り 、 ク エ リ ・ プ
ロ セ ッ サが よ り 効果的なプ ラ ン を 生成す る 場合に の み重要な リ ソ ー ス
が使用 さ れ ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
311
統計値の自動更新
update statistics は リ ソ ー ス集約 タ ス ク な の で、 update statistics を 実行す
る か ど う かは特定の条件セ ッ ト に基づ い て決定 さ れ ま す。 次の パ ラ
メ ー タ は、 update statistics の適切な実行 タ イ ミ ン グ を 決め る 際に役立
ち ま す。
•
update statistics を 前回実行 し た後に変更 さ れたデー タ 特性の数。
こ れは datachange パ ラ メ ー タ と 呼ばれて い ま す。
•
update statistics を 実行す る た め の十分な リ ソ ー ス が あ る か ど う か。
た と えば、 CPU の ア イ ド ル ・ サ イ ク ル数な ど の リ ソ ー ス や、
update statistics の実行中に重要な オ ン ラ イ ン ・ ア ク テ ィ ビ テ ィ が発
生 し な い こ と の確認な ど が含ま れ ま す。
デー タ 変更は、 update statistics を 前回実行 し た後に変更 さ れたデー タ
の量 を 測定す る た め の重要な測定基準で、 datachange 関数に よ っ て追
跡 さ れ ま す。 こ の測定基準 と リ ソ ー ス可用性の基準 を 使用す る と 、
update statistics を 実行す る プ ロ セ ス を 自動化で き ま す。 Job Scheduler
に は update statistics を 自動的に実行す る メ カ ニズ ム が含ま れて い ま す。
ま た、 カ ス タ マ イ ズ可能な テ ン プ レ ー ト も 含ま れて お り 、 update
statistics を 実行す る タ イ ミ ン グ を 判断す る た め に使用で き ま す。 こ れ
ら の入力に は update statistics の すべて の パ ラ メ ー タ 、 datachange ス
レ ッ シ ョ ル ド 値、 update statistics を 実行す る タ イ ミ ン グが含 ま れて い
ま す。 Job Scheduler は update statistics を 低い優先度で実行す る の で、
同時実行中の重要な ジ ョ ブ に は影響 を 与え ま せん。
datachange 関数
datachange 関数は、 update statistics を 前回実行 し た後に発生 し たデー タ
分布の変化の量 を 測定 し ま す。 特に、 特定の オブ ジ ェ ク ト 、 パーテ ィ
シ ョ ン、 ま た は カ ラ ム で発生 し た inserts、 updates、 deletes の数 を 測定
し 、 update statistics の実行が ク エ リ ・ プ ラ ン に有益か ど う か を 調べ
ま す。
datachange の構文は次の と お り です。
select datachange(object_name, partition_name, colname)
312
Adaptive Server Enterprise
第 10 章
パフォーマンス改善のための統計値の使用
各パ ラ メ ー タ の意味は、 次の と お り です。
•
object_name - オブ ジ ェ ク ト 名。 こ の オブ ジ ェ ク ト は現在のデー タ
ベー ス内に存在す る と 見な さ れ る 。 object_name に は null を 指定で
き な い。
•
partition_name - デー タ ・ パーテ ィ シ ョ ン 名。 こ の値に は null を 指
定で き る 。
•
colname - datachange が要求 さ れた カ ラ ム の名前。 こ の値に は null
を 指定で き る 。
こ れ ら の パ ラ メ ー タ はすべて必須です。
datachange はテーブル ま た はパーテ ィ シ ョ ン内の ロ ー数の割合 と し て
表 さ れ ま す ( パーテ ィ シ ョ ン が指定 さ れて い る 場合 )。 特に テーブル に
対す る deletes と updates の数が非常に多い場合は、 オブ ジ ェ ク ト に対
す る 変更の数がテーブル内の ロ ー数よ り も 非常に大き く な る の で、
割合の値が 100% を 超え る こ と が あ り ま す。
次の例は、 datachange 関数の さ ま ざ ま な使用方法 を 示 し て い ま す。
例では次の よ う な記号 を 使用 し ま す。
有効なオブジェク
ト名、パーティ
ション名、カラム
名の引き渡し
•
オブ ジ ェ ク ト 名は “O”。
•
パーテ ィ シ ョ ン名は “P”。
•
カ ラ ム名は “C”。
オブ ジ ェ ク ト 名、 パーテ ィ シ ョ ン名、 カ ラ ム名 を 含め た と き に レ ポー
ト さ れ る 値は、 指定 し た パーテ ィ シ ョ ン内の指定 し た カ ラ ム の
datachange 値 を そ の パーテ ィ シ ョ ン内の ロ ー数で割 る こ と に よ っ て決
定 さ れ ま す。 結果は割合で示 さ れ ま す。
datachange = 100 * (data change value for column C/ rowcount (P))
null パーティショ
ン名の使用
null パーテ ィ シ ョ ン名 を 含め る 場合、 datachange 値は、 すべて の パー
テ ィ シ ョ ン の カ ラ ム の datachange 値の合計 を テーブルの ロ ー数で割 る
こ と に よ っ て決定 さ れ ま す。 結果は割合で示 さ れ ま す。
datachange = 100 * (Sum(data change value for (O, P(1-N) , C))/rowcount(O)
P(1-N) は、 値がすべて の パーテ ィ シ ョ ン の合計で あ る こ と を示し ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
313
統計値の自動更新
null カラム名の使用
null カ ラ ム名 を 含め る 場合、 datachange で レ ポー ト さ れ る 値は、 指定
し た パーテ ィ シ ョ ン の ヒ ス ト グ ラ ム を 持つすべて の カ ラ ム の
datachange の最大値 を パーテ ィ シ ョ ン の ロ ー数で割 る こ と に よ っ て決
定 さ れ ま す。 結果は割合で示 さ れ ま す。
datachange = 100 * (Max(data change value for (O, P, Ci))/rowcount(P)
i の値は、 ヒ ス ト グ ラ ム を 持つ カ ラ ム の数に よ っ て異な り ま す ( た と
えば、 sysstatistics では formatid 102)。
Null パーティショ
ン名とカラム名
null の パーテ ィ シ ョ ン名 と カ ラ ム名 を 含め る 場合、 datachange の値は、
すべて の パーテ ィ シ ョ ン に わ た っ て合計 さ れた ヒ ス ト グ ラ ム を 持つす
べて の カ ラ ム の datachange の最大値 を テーブルの ロ ー数で割 る こ と に
よ っ て決定 さ れ ま す。 結果は割合で示 さ れ ま す。
datachange = 100 * ( Max(data change value for (O, NULL, Ci))/rowcount(O)
i は、 1 か ら ヒ ス ト グ ラ ム を 持つ カ ラ ム の総数 ま でです ( た と えば、
sysstatistics では formatid 102)。
datachange の収集統計値は次の と お り です。
create
go
insert
go
update
go
insert
go
select
go
table matrix(col1 int, col2 int)
into matrix values (234, 560)
statistics matrix(col1)
into matrix values(34,56)
datachange ("matrix", NULL, NULL)
-----50.000000
matrix の ロ ー数は 2 です。 前回の update statistics コ マ ン ド 以降に変更 さ
れたデー タ 量は 1 な の で、 datachange の割合は 100 * 1/2 = 50% に な り
ま す。
datachange カ ウ ン タ はすべて メ モ リ に保持 さ れ ま す。 こ れ ら の カ ウ ン
タ はハ ウ ス キー ピ ン グ に よ っ て定期的に ま た は sp_flushstats を 実行 し
た と き にデ ィ ス ク に フ ラ ッ シ ュ さ れ ま す。
314
Adaptive Server Enterprise
第 10 章
パフォーマンス改善のための統計値の使用
自動 update statistics の設定
統計値 を 自動的に更新す る に は、 次の操作 を 行い ま す。
•
Job Scheduler を 使用 し て update statistics ジ ョ ブ を 定義す る 。
•
自己管理 イ ン ス ト ールの一部 と し て update statistics ジ ョ ブ を 定義
する。
•
ユーザ定義の ス ク リ プ ト を 作成す る 。
ユーザ定義の ス ク リ プ ト の作成に つ い ては、 こ の マ ニ ュ ア ルでは説明
し て い ま せん。
Job Scheduler を使用した統計値の更新
Job Scheduler に は update statistics template が あ り 、 テーブル、 イ ン デ ッ
ク ス、 カ ラ ム、 ま た はパーテ ィ シ ョ ン に対 し て update statistics を 実行
す る ジ ョ ブ を 作成す る と き に使用で き ま す。 datachange 関数は、 テー
ブル ま た はパーテ ィ シ ョ ン内の変更の量が定義済み の ス レ ッ シ ョ ル ド
値に達す る 時点 を 判定 し ま す。 こ の ス レ ッ シ ョ ル ド の値は、 テ ン プ
レ ー ト を 設定す る と き に指定 し ま す。
テンプレー ト :
•
特定の テーブル、 パーテ ィ シ ョ ン、 イ ン デ ッ ク ス、 ま た は カ ラ ム
に対 し て update statistics を 実行 し ま す。 テ ン プ レ ー ト を 使用す
る と 、 update statistics を 実行す る datachange の値 を 定義で き ま す。
•
update statistics を サーバ ・ レ ベルで実行 し ま す。 ジ ョ ブ の作成時に
指定 し た ス レ ッ シ ョ ル ド に基づ き、 サーバ上の すべて のデー タ
ベー ス内の テーブル を 検索 し て統計値 を 更新す る よ う に Adaptive
Server が設定 さ れ ま す。
update statistics の実行プ ロ セ ス を 自動化す る よ う に Job Scheduler
を 設定す る に は、 次の手順に従い ま す ( 記載 さ れて い る 章は
『Job Scheduler ユーザーズ ・ ガ イ ド 』 )。
1
Job Scheduler を イ ン ス ト ール し て設定 し ま す ( 「第 2 章 Job
Scheduler の設定 と 実行」 )。
2
テ ン プ レ ー ト に必要な ス ト ア ド ・ プ ロ シ ー ジ ャ を イ ン ス ト ール し
ま す ( 「第 4 章 ジ ョ ブ ・ ス ケ ジ ュ ー リ ン グへ の テ ン プ レ ー ト の
使用」 )。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
315
自動 update statistics の設定
3
テ ン プ レ ー ト を イ ン ス ト ール し ま す。 Job Scheduler に は、 特に
update statistics を 自動化す る た め の テ ン プ レ ー ト が あ り ま す
( 「第 4 章 ジ ョ ブ ・ ス ケ ジ ュ ー リ ン グへ の テ ン プ レ ー ト の使用」 )。
4
テ ン プ レ ー ト を 設定 し ま す。 update statistics を 自動化す る た め の テ
ン プ レ ー ト は Statistics Management フ ォ ルダ に あ り ま す。
5
ジ ョ ブ を ス ケ ジ ュ ー リ ン グ し ま す。 追跡す る イ ン デ ッ ク ス、 カ ラ
ム、 ま た はパーテ ィ シ ョ ン を 定義 し た後、 ス ケ ジ ュ ール を 作成 し
て Adaptive Server が ジ ョ ブ を 実行す る タ イ ミ ン グ を 指定 し 、 パ
フ ォ ー マ ン ス に影響与え な い場合に の み update statistics を 実行す
る よ う に設定す る こ と も で き ま す。
6
成功ま た は失敗 を 判別 し ま す。 Job Scheduler イ ン フ ラ ス ト ラ ク
チ ャ を 使用す る と 、 自動化 し た update statistic の成功 ま た は失敗 を
判別で き ま す。
こ の テ ン プ レ ー ト では、 サ ン プ リ ン グ率、 コ ン シ ュ ー マ数、 手順な
ど 、 update statistics コ マ ン ド の さ ま ざ ま な オプ シ ョ ン の値 を 指定で き
ま す。 オプ シ ョ ン で、 datachange 関数、 ペ ー ジ ・ カ ウ ン ト 、 ロ ー ・ カ
ウ ン ト の ス レ ッ シ ョ ル ド 値 を 指定す る こ と も で き ま す。 こ れ ら の オプ
シ ョ ン値 を 含め る と 、 Adaptive Server では こ れ ら の値 を 使用 し て
update statistics を 実行す る タ イ ミ ン グや こ の コ マ ン ド を 実行す る か ど
う かが決定 さ れ ま す。 テーブル、 カ ラ ム、 イ ン デ ッ ク ス、 ま た はパー
テ ィ シ ョ ン の いずれか の現在値が ス レ ッ シ ョ ル ド 値 を 超え て い る 場
合、 Adaptive Server では update statistics を 発行 し ま す。 Adaptive Server
は update statistics が カ ラ ム に対 し て実行 さ れた か ど う か を 検出 し ま す。
プ ロ シ ー ジ ャ ・ キ ャ ッ シ ュ の こ の テーブル を 参照す る ク エ リ は、 次回
実行の前に再 コ ン パ イ ル さ れ ま す。
Adaptive Server
で update
statistics が実行さ
れるタイミング
update statistics コ マ ン ド に は多数の形式が あ り ま す (update statistics、
update index statistics な ど )。 必要に応 じ て形式 を 選択 し て く だ さ い。
3 つ の ス レ ッ シ ョ ル ド rowcount、 pagecount、 datachange を 必ず指定 し
て く だ さ い。 NULL ま た は 0 の値は無視 さ れ ま すが、 こ れ ら の値が
あ っ て も コ マ ン ド は実行で き ま す。
表 10-1 は、 指定 し た パ ラ メ ー タ に基づ い て Adaptive Server が ど の よ う
な場合に update statistics を 自動的に実行す る か を 示 し て い ま す。
316
Adaptive Server Enterprise
第 10 章
パフォーマンス改善のための統計値の使用
表 10-1: Adaptive Server で update statistics が自動的に実行されるタイ
ミング
ユーザの操作
datachange ス レ ッ シ ョ ル ド を 0 ま た は NULL
に指定す る 。
テーブル に対 し て の み 0 よ り 大き い
datachange ス レ ッ シ ョ ル ド を指定 し 、 update
index 統計形式を 要求 し な い。
テーブル と イ ンデ ッ ク ス の ス レ ッ シ ョ ル ド
値は指定す る が、 update index statistics 形式を
要求 し な い。
テーブルの ス レ ッ シ ョ ル ド 値の み を指定 し 、
update index statistics 形式 を要求す る 。
テーブル と イ ンデ ッ ク ス の ス レ ッ シ ョ ル ド
値を 指定 し 、 update index statistics 形式を要求
する。
テーブル と 1 つ以上の カ ラ ム の ス レ ッ シ ョ ル
ド 値を 指定す る ( イ ンデ ッ ク ス ま たは update
index statistics 形式の要求は無視す る )。
Job Scheduler の動作
ス ケ ジ ュ ー リ ン グ さ れた時刻に update statistics を実行
す る。
テーブルの すべて の イ ン デ ッ ク ス を取得 し 、 各 イ ン
デ ッ ク ス の先行カ ラ ム を取得す る 。 先行カ ラ ム の
datachange 値が ス レ ッ シ ョ ル ド 以上の場合は、 update
statistics を実行す る 。
イ ン デ ッ ク ス の先行カ ラ ム の datachange 値を取得
す る 。 datachange 値が ス レ ッ シ ョ ル ド 以上の場合は、
update statistics を実行す る。
テーブルの すべて の イ ン デ ッ ク ス を取得 し 、 各 イ ン
デ ッ ク ス の先行カ ラ ム を取得す る 。 先行カ ラ ム の
datachange 値が ス レ ッ シ ョ ル ド を超え て い る 場合は、
update statistics を実行す る。
イ ン デ ッ ク ス の先行カ ラ ム の datachange 値を取得
す る 。 datachange 値が ス レ ッ シ ョ ル ド 以上の場合は、
update statistics を実行す る。
各カ ラ ム の datachange 値を取得す る 。 カ ラ ム の
datachange 値が ス レ ッ シ ョ ル ド 以上の場合は、 update
statistics を実行す る 。
datachange 関数は、 テーブル内の変更の数 を コ ン パ イ ル し 、 合計 ロ ー
数の割合 と し てテーブル に表示 し ま す。 こ の コ ン パ イ ル済み の情報 を
使用 し て、 Adaptive Server が update statistics を 実行す る タ イ ミ ン グ を
指定す る ルール を 作成で き ま す。 最適な実行 タ イ ミ ン グは、 オブ ジ ェ
ク ト の数に基づ き ま す。
•
テーブル内の変更の割合
•
使用可能な CPU サ イ ク ル数
•
メ ン テナ ン ス時
update statistics の実行後、 datachange カ ウ ン タ はゼ ロ に リ セ ッ ト さ れ ま
す。 datachange の カ ウ ン ト は inserts と deletes に つ い てはパーテ ィ シ ョ
ン ・ レ ベルで、 updates に つ い ては カ ラ ム ・ レ ベルで追跡 さ れ ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
317
自動 update statistics の設定
datachange を使用して統計値を更新する例
カ ラ ム、 テーブル、 ま た はパーテ ィ シ ョ ン ・ レ ベルで、 指定 し た量の
デー タ が変更 さ れた か ど う か を 調べ る ス ク リ プ ト を 記述で き ま す。
update statistics を 実行す る タ イ ミ ン グは、 CPU 使用率、 テーブル内の
変更割合、 パーテ ィ シ ョ ン 内の変更割合な ど 、 datachange 関数に よ っ
て収集 さ れ る さ ま ざ ま な変数に基づ い て指定で き ま す。
こ の例では、 authors テーブルが分割 さ れて お り 、 author_ptn2 パーテ ィ
シ ョ ン の city カ ラ ム に対す る デー タ の変更が 50% 以上に な っ た と き に
update statistics を 実行 し ま す。
select @datachange = datachange("authors","author_ptn2", "city")
if @datachange >= 50
begin
update statistics authors partition author_ptn2(city)
end
go
シ ス テ ム が ア イ ド ル状態の と き に ス ク リ プ ト を 実行す る よ う に指定 し
た り 、 他の パ ラ メ ー タ を 指定 し た り す る こ と も で き ま す。
こ の例では、 authors テーブルの city カ ラ ム に対す る デー タ の変更が
100% 以上に な っ た と き に update statistics を 実行 し ま す ( こ の例の テー
ブルは分割 さ れて い ま せん )。
select @datachange = datachange("authors",NULL, "city")
if @datachange > 100
begin
update statistics authors (city)
end
go
318
Adaptive Server Enterprise
第 10 章
パフォーマンス改善のための統計値の使用
カラム統計値と統計値管理
ヒ ス ト グ ラ ム は、 イ ン デ ッ ク ス ・ ベー ス では な く カ ラ ム ・ ベ ー ス で保
持 さ れ ま す。 こ れは、 統計値管理 と 次の よ う な関係が あ り ま す。
•
1 つ の カ ラ ム が複数の イ ン デ ッ ク ス に使用 さ れて い る 場合、 update
statistics、 update index statistics、 ま た は create index が、 カ ラ ム の ヒ
ス ト グ ラ ム と すべて の プ レ フ ィ ク ス ・ サブセ ッ ト の密度統計値 を
更新す る 。
update all statistics は、 テーブル内の全カ ラ ム の ヒ ス ト グ ラ ム を 更
新す る 。
•
イ ン デ ッ ク ス を 削除 し て も イ ン デ ッ ク ス の統計値は削除 さ れな
い。 こ れは、 イ ン デ ッ ク ス がな く て も 、 オプテ ィ マ イ ザが カ ラ ム
レ ベル の統計値 を コ ス ト の見積 も り に使用で き る た め。
イ ン デ ッ ク ス の削除後に統計値 も 削除す る に は、 delete statistics を
使用 し て明示的に削除す る 。
統計値が ク エ リ ・ プ ロ セ ッ サ に と っ て有益な場合や イ ン デ ッ ク ス
な し で統計値 を 保持す る 場合は、 時間の経過 と と も に キー値の分
布が変わ る イ ン デ ッ ク ス に対 し て、 カ ラ ム名 を 指定 し て update
statistics を 使用す る 。
•
テーブル を ト ラ ン ケ ー ト し て も sysstatistics の カ ラ ム レ ベルの統計
値は削除 さ れな い。 多 く の場合、 テーブルが ト ラ ン ケ ー ト さ れ、
同 じ デー タ が再 ロ ー ド さ れ る 。
truncate table は カ ラ ム レ ベルの統計値 を 削除 し な い の で、 デー タ
が同 じ で あ れば、 テーブル の再 ロ ー ド 後に update statistics を 実行
す る 必要は な い。
キー値の分布が異な る デー タ でテーブル を再 ロ ー ド す る 場合は、
update statistics を 実行す る 。
•
with statistics 句で ス テ ッ プ数に 0 を 指定 し て create index を 実行す る
と 、 イ ン デ ッ ク ス統計値に影響 を 与え る こ と な く イ ン デ ッ ク ス を
削除 し て再作成で き る 。 こ の create index コ マ ン ド は sysstatistics 内
の統計値に は影響 し な い。
create index title_id_ix on titles(title_id)
with statistics using 0 values
こ れ に よ り 、 optdiag を 使用 し て編集 し た統計値 を 上書き せずに、
イ ン デ ッ ク ス を 再作成で き る 。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
319
カラム統計値の作成と更新
•
2 人の ユーザが同 じ テーブル に同 じ カ ラ ム で同時に イ ン デ ッ ク ス
を 作成 し よ う と す る 場合、 sysstatistics に重複す る キー値 を 入力す
る こ と に な る た め、 ど ち ら か の コ マ ン ド が失敗す る 可能性が あ
る。
•
複数分割 さ れた テーブルの 1 つ の パーテ ィ シ ョ ン内の カ ラ ム に対
し て update statistics を 実行 し た場合、 そ の パーテ ィ シ ョ ン の統計
値だけで な く 、 そ の カ ラ ム の グ ロ ーバル ・ ヒ ス ト グ ラ ム も 更新 さ
れ る 。 こ れは、 カ ラ ム の ヒ ス ト グ ラ ム を 各パーテ ィ シ ョ ン か ら
ロ ー に重点 を 置い て マ ー ジ し 、 カ ラ ム の グ ロ ーバル ・ ヒ ス ト グ ラ
ム を 得 る こ と こ と に よ っ て行われ る 。
•
複数分割 さ れた テーブルの カ ラ ム に対 し て、 パーテ ィ シ ョ ン を 指
定せずに統計値 を 更新 し た場合、 テーブルの各パーテ ィ シ ョ ン に
つ い て該当す る カ ラ ム の統計値が更新 さ れ、 最後に カ ラ ム の パー
テ ィ シ ョ ン ・ ヒ ス ト グ ラ ム を マ ー ジ し てグ ロ ーバル ・ ヒ ス ト グ ラ
ム が作成 さ れ る 。
•
オプテ ィ マ イ ザは、 複数分割 さ れた テーブルの グ ロ ーバル ・ ヒ ス
ト グ ラ ム の み を コ ン パ イ ル時に使用 し 、 パーテ ィ シ ョ ン ・ ヒ ス ト
グ ラ ム を 読み込ま な い。 こ の方法は、 コ ン パ イ ル時に パーテ ィ
シ ョ ン ・ ヒ ス ト グ ラ ム を マ ー ジ す る こ と に よ る オーバヘ ッ ド を 回
避 し 、 DDL 実行時に マ ー ジ作業 を 実行す る 。
カラム統計値の作成と更新
イ ン デ ッ ク ス未設定カ ラ ム に統計値 を 作成す る と 、 多 く の ク エ リ の パ
フ ォ ー マ ン ス が向上 し ま す。 オプテ ィ マ イ ザは、 where 句か having 句に
指定 し た あ ら ゆ る カ ラ ム の統計値 を 使用 し て、 テーブル上の ク エ リ 句
の完全な セ ッ ト に一致す る ロ ー数 を 見積 も る こ と がで き ま す。
ま た、 イ ン デ ッ ク ス の マ イ ナー ・ カ ラ ム や探索引数で の使用頻度の高
い イ ン デ ッ ク ス未設定カ ラ ム に統計値 を 追加す る と 、 オプテ ィ マ イ ザ
の見積 も り を 改善で き ま す。
デー タ 変更中に大量の イ ン デ ッ ク ス を 管理す る に は、 コ ス ト がか か り
ま す。 テーブル に対 し て insert や delete を 実行す る たび に イ ン デ ッ ク ス
を 更新す る 必要が あ り 、 さ ら に更新に よ っ て複数の イ ン デ ッ ク ス が影
響 を 受け ま す。
320
Adaptive Server Enterprise
第 10 章
パフォーマンス改善のための統計値の使用
イ ン デ ッ ク ス を 作成せずに カ ラ ム の統計値 を 生成す る と 、 ク エ リ に読
み込 ま れ る ペ ー ジ数 を 見積 も る と き に、 オプテ ィ マ イ ザが よ り 多 く の
情報 を 使用で き ま す。 デー タ 変更中の イ ン デ ッ ク ス更新に か か る 処理
コ ス ト も 必要あ り ま せん。
オプテ ィ マ イ ザは、 where 句や having 句の探索引数に使用 さ れ る カ ラ
ム や、 ジ ョ イ ン句に指定 さ れた カ ラ ム の統計値 を 適用で き ま す。
次の コ マ ン ド を 使用 し て、 カ ラ ム統計値の作成 と 管理 を 行い ま す。
•
update statistics は、 カ ラ ム名 を 指定 し て使用す る と 、 イ ン デ ッ ク ス
を 作成せずに カ ラ ム の統計値 を 生成す る 。 構文の詳細に つ い ては、
「update statistics を 使用 し た カ ラ ム へ の統計値の追加」 (324 ペ ー ジ )
を 参照。
オプテ ィ マ イ ザは こ れ ら の カ ラ ム統計値 を 使用 し 、 カ ラ ム を 参照
す る ク エ リ の コ ス ト を よ り 正確に見積 も る こ と がで き る 。
•
update index statistics は、 イ ン デ ッ ク ス名 を 指定 し て使用す る と 、
イ ン デ ッ ク ス内の全カ ラ ム の統計値 を 作成ま た は更新す る 。 構文
の詳細に つ い ては、 「update index statistics を 使用 し た マ イ ナー ・
カ ラ ム へ の統計値の追加」 (324 ペ ー ジ ) を 参照。
テーブル名 を 指定 し て使用す る と 、 update index statistics は全 イ ン
デ ッ ク ス ・ カ ラ ム の統計値 を 更新す る 。
•
update all statistics は、 テーブル内の全カ ラ ム の統計値 を作成ま た
は更新す る 。 構文の詳細に つ い ては、 「update all statistics を 使用 し
た全カ ラ ム へ の統計値の追加」 (325 ペ ー ジ ) を 参照。
•
統計値の作成に適 し て い る の は、 次の カ ラ ム です。
•
where 句や having 句で探索引数 と し て頻繁に使用 さ れ る カ ラ ム。
•
複合 イ ン デ ッ ク ス に含ま れ る カ ラ ム で、 先行カ ラ ム で な い が、
ク エ リ に よ っ て返 さ れ る 必要が あ る デー タ ・ ロ ー数の見積 も り に
役立つ カ ラ ム。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
321
カラム統計値の作成と更新
統計値の追加が有効な場合
統計値の追加が有効な場合 を 判断す る に は、 set option コ マ ン ド と set
statistics io を 使用 し て ク エ リ を 実行 し ま す。 set コ マ ン ド に よ っ て表示
さ れ る 「返 さ れ る ロ ー」 お よ び I/O 見積 も り と 、 statistics io に よ っ て表
示 さ れ る 実際の I/O の間に大幅な相違が あ る 場合は、 ク エ リ を 調べ、
統計値の追加に よ り 見積 も り の正確 さ が向上す る 場所 を 探 し ま す。
特に、 探索引数 と ジ ョ イ ン ・ カ ラ ム に デ フ ォ ル ト の密度値 を 使 っ て い
る 場所 を 探 し ま す。
set option show_missing_stats コ マ ン ド は、 ヒ ス ト グ ラ ム を 使用で き た は
ずの カ ラ ム の名前 と 、 複数属性の密度 を 使用で き た はずの カ ラ ム の グ
ループ を 出力 し ま す。 こ れは、 統計値の追加が有効な場合 を 判断す る
と き に特に役立 ち ま す。
例1
set option show_missing_stats long
go
dbcc traceon(3604)
go
DBCC execution completed. If DBCC printed error messages,
contact a user with System Administrator (SA) role.
select * from part, partsupp
where p_partkey = ps_partkey and p_itemtype =
ps_itemtype
go
NO STATS on column part.p_partkey
NO STATS on column part.p_itemtype
NO STATS on column partsupp.pa_itemtype
NO STATS on density set for E={p_partkey, p_itemtype}
NO STATS on density set for F={ps_partkey, ps_itemtype}
- - - - - - - - - - - - - - (200 rows affected)
show_final_plan_xml オプ シ ョ ン を 使用す る と 、 同 じ 情報が得 ら れ ま す。
set plan は ク ラ イ ア ン ト ・ オプ シ ョ ン と ト レ ー ス ・ フ ラ グ 3604 を 使用
し て、 ク ラ イ ア ン ト 側の出力 を 取得 し ま す。 こ れは、 set plan の メ ッ
セ ー ジ ・ オプ シ ョ ン を 使用す る 方法 と は異な り ま す。
例2
322
dbcc traceon(3604)
DBCC execution completed. If DBCC printed error messages,
contact a user with System Administrator (SA) role.
set plan for show_final_plan_xml to client on
go
select * from part, partsupp
where p_partkey = ps_partkey and p_itemtype =
ps_itemtype
go
Adaptive Server Enterprise
第 10 章
パフォーマンス改善のための統計値の使用
<?xml version="1.0" encoding="UTF-8"?>
<query>
<planVersion> 1.0 </planVersion>
- - - - - - - - - - - - - - - - - <optimizerStatistics>
<statInfo>
<objName>part</objName>
<missingHistogram>
<column>p_partkey</column>
<column>p_itemtype</column>
</missingHistogram>
<missingDensity>
<column>p_partkey</column>
<column>p_itemtype</column>
</missingDensity>
</statInfo>
<statInfo>
<objName>partsupp</objName>
<missingHistogram>
<column>ps_partkey</column>
<column>ps_itemtype</column>
</missingHistogram>
<missingDensity>
<column>ps_partkey</column>
<column>ps_itemtype</column>
</missingDensity>
</statInfo>
</optimizerStatistics>
update statistics を part と partsupp に使用 し て、 p_partkey と p_itemtype の
統計値 を 作成す る と 、 先行カ ラ ム (p_partkey) と 密度 (p_partkey,
p_itemtype) の ヒ ス ト グ ラ ム が作成 さ れ ま す。 p_itemtype の ヒ ス ト グ ラ ム
も 作成 し ま す。 次の パ ラ メ ー タ を 使用 し ま す。
update statistics part(p_partkey, p_itemtype)
go
update statistics part(p_itemtype)
go
partsupp に は ps_partkey の ヒ ス ト グ ラ ム が あ る の で、 ps_itemtype の ヒ ス
ト グ ラ ム と (ps_itemtype, ps_partkey) の密度 を 作成で き ま す。 密度に使用
す る カ ラ ム は番号順で な く て も か ま い ま せん。
update statistics partsupp(ps_itemtype, ps_partkey)
こ の プ ロ シ ー ジ ャ が正常に終了す る と 、 ク エ リ を 再度実行 し た と
き に、 例 1 に示す “NO STATS” メ ッ セ ー ジ は表示 さ れ ま せん。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
323
カラム統計値の作成と更新
update statistics を使用したカラムへの統計値の追加
titles テーブルの price カ ラ ム に統計値 を 追加す る に は、 次の よ う に入
力 し ま す。
update statistics titles (price)
カ ラ ム に ヒ ス ト グ ラ ム の ス テ ッ プ数 を 指定す る に は、 次の コ マ ン ド を
使用 し ま す。
update statistics titles (price)
using 50 values
こ の コ マ ン ド は、 titles.pub_id カ ラ ム に ヒ ス ト グ ラ ム を 追加 し 、
「pub_id」、 「pub_id」、 「 pubdate」、 「pub_id」、 「pubdate」、 「title_id」 と い
う プ レ フ ィ ク ス ・ サブセ ッ ト の密度値 を 生成 し ま す。
update statistics titles(pub_id, pubdate, title_id)
ただ し 、 ヒ ス ト グ ラ ム を 追加す る すべて の カ ラ ム に は別の update
statistics コ マ ン ド が必要に な る た め、 こ の コ マ ン ド では、 pubdate と
title_id の ヒ ス ト グ ラ ム は作成 さ れ ま せん。
注意 テーブル名 を 指定 し て update statistics を 実行す る と 、 イ ン デ ッ ク
ス に対 し て の み、 先行カ ラ ム の ヒ ス ト グ ラ ム と 密度が更新 さ れ ま す。
イ ン デ ッ ク ス未設定カ ラ ム の統計値は更新 さ れ ま せん。 こ れ ら の統計
値 を 管理す る に は、 update statistics を 実行 し て カ ラ ム名 を 指定す る か、
update all statistics を 実行 し ま す。
update index statistics を使用したマイナー・カラムへの統計値の追加
イ ン デ ッ ク ス中の全カ ラ ム の統計値 を 作成ま た は更新す る に は、
update index statistics を 使用 し ま す。 構文は次の と お り です。
update index statistics
table_name [[ partition data_partition_name ] |
[ index_name [ partition index_partition_name ] ] ]
[ using step values ]
[ with consumers = consumers ] [, sampling = percent]
324
Adaptive Server Enterprise
第 10 章
パフォーマンス改善のための統計値の使用
update all statistics を使用した全カラムへの統計値の追加
テーブル上の全カ ラ ム の統計値 を 作成 ま た は更新す る に は、 update all
statistics を 使用 し ま す。 構文は次の と お り です。
update all statistics table_name
[partition data_partition_name]
ヒストグラムのステップ数の選択
デ フ ォ ル ト では、 ヒ ス ト グ ラ ム の ス テ ッ プ数は 20 です。 こ れは、
値が均一に分布 し て い る カ ラ ム の場合、 パ フ ォ ー マ ン ス と モデ リ ン グ
が と も に良好に な る ス テ ッ プ数です。 ス テ ッ プ数 を 多 く す る と 、 次の
カ ラ ム に対す る I/O の見積 も り が よ り 正確に な り ま す。
•
重複度の高い値が多い カ ラ ム。
•
値の分布が均一で な い、 ま た は偏 り が生 じ て い る カ ラ ム。
•
like ク エ リ の先頭に ワ イ ル ド カ ー ド を 使用 し て ク エ リ さ れ る
カ ラ ム。
histogram tuning factor を デ フ ォ ル ト 値の 20 に設定す る と 、 現在要求 さ
れて い る ス テ ッ プ値 ( デ フ ォ ル ト は 20) と 係数に よ っ て増加 し た ス
テ ッ プ (20 * 20 = 400) の間で ス テ ッ プ値が自動的に選択 さ れ、Adaptive
Server に よ っ て上記の ケ ー ス を 補正す る た め に最適な ス テ ッ プ値が自
動的に選択 さ れ ま す。 ス テ ッ プ値 を 上書き す る 場合、 histogram tuning
factor に よ っ て多数の ス テ ッ プが導入 さ れて い る こ と を 考慮す る 必要
が あ り ま す。
注意 デー タ ベ ー ス を バー ジ ョ ン 11.9 よ り 前のサーバか ら 更新 し た
場合、 デ ィ ス ト リ ビ ュ ー シ ョ ン ・ ペー ジ で使用 さ れた ス テ ッ プ数がデ
フ ォ ル ト に な り ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
325
ヒストグラムのステップ数の選択
ス テ ッ プ数 を ク エ リ 最適化に必要な数以上に増やす と 、 Adaptive
Server の パ フ ォ ー マ ン ス が低下 し ま す。 こ れは主に、 統計値の保管 と
使用に必要な領域が増加す る た め です。 ス テ ッ プ数 を 増やす と 、 次の
こ と が発生 し ま す。
•
sysstatistics に必要なデ ィ ス ク 記憶領域が増加す る 。
•
ク エ リ 最適化中の統計値読み込み に必要な キ ャ ッ シ ュ 領域が増加
する。
•
ス テ ッ プ数が非常に多い場合は、 必要な I/O が増加す る 。
ク エ リ 最適化中、 ヒ ス ト グ ラ ム はプ ロ シ ー ジ ャ ・ キ ャ ッ シ ュ か ら 借 り
た領域 を 使用 し ま す。 こ の領域は、 ク エ リ 最適化が終わ り し だ い解放
さ れ ま す。
ステップ数の選択
テーブル に ロ ーが 5,000 あ り 、 1 つ の ロ ーだけ に一致す る 値が カ ラ ム
中に 1 つ の場合、 各値ご と に頻度セル を 含む ヒ ス ト グ ラ ム を 得 る に は
5,000 ス テ ッ プ を 要求す る 必要が あ り ま す。 実際の ス テ ッ プ数は 5,000
では あ り ま せん。 異な る 値の数に 1 を 足 し た も の ( 密度の高い頻度セ
ルの場合 ) か、 値の数の 2 倍に 1 を 足 し た も の ( まば ら な頻度セル の
場合 ) に な り ま す。
重複度の高い値が多数あ る 場合、 sp_configure オプ シ ョ ン の histogram
tuning factor はパ ラ メ ー タ 内で多数の ス テ ッ プ を 自動的に選択 し ま す。
Adaptive Server バー ジ ョ ン 15.0 以降では、 histogram tuning factor のデ
フ ォ ル ト 値は 20 です。 要求ス テ ッ プ ・ カ ウ ン ト が 50 の場合、 update
statistics では最大 20 * 50 = 1000 の ス テ ッ プ を 作成で き ま す。 こ の多数
の ス テ ッ プは、 重複度の高い多数の ド メ イ ン値で ヒ ス ト グ ラ ム の分布
が偏 っ た場合に の み使用 さ れ ま す。 ただ し 、 ユニー ク ・ カ ラ ム の場
合、 update statistics は ス テ ッ プ を 50 だけ使用 し て ヒ ス ト グ ラ ム を 表 し
ま す。 ヒ ス ト グ ラ ム を 最 も 効率的に使用す る に は、 比較的少な い ス
テ ッ プ数 を 指定 し て、 ス テ ッ プ数 を 増やす こ と が最適化に役立つ か ど
う か を histogram tuning factor で判断で き る よ う に し ま す。 た と えば、
デ フ ォ ル ト の ス テ ッ プ ・ カ ウ ン ト を 1000 に指定 し て、 すべて の ヒ ス
ト グ ラ ム で 1000 ス テ ッ プ を 使用す る よ り も 、 デ フ ォ ル ト の ス テ ッ プ ・
カ ウ ン ト を 50 に、 histogram tuning factor を 20 に指定す る 方が賢明で
す。 こ れ に よ っ て、 Adaptive Server は、 50 ~ 1000 ス テ ッ プ の範囲内
で分布 を 表す最適な ス テ ッ プ ・ カ ウ ン ト を 指定で き ま す。
326
Adaptive Server Enterprise
第 10 章
パフォーマンス改善のための統計値の使用
update statistics 実行時のスキャン・タイプ、ソートの稼
働条件、ロック
表 10-2 は、 update statistics 実行中に実行 さ れ る ス キ ャ ン の タ イ プ、 取
得 さ れ る ロ ッ ク の タ イ プ、 お よ び ソ ー ト が必要な時期 を 示 し て い
ま す。
表 10-2: update statistics 実行中のスキャン、ソート、ロック
update statistics
での指定内容
テーブル名
全ペー ジ ロ ッ ク ・
テーブル
実行されるスキャンとソート
ロック
各 ノ ン ク ラ ス タ ー ド ・ イ ンデ ッ ク ス の テーブ
ル ・ ス キ ャ ン と リ ー フ ・ レ ベル ・ ス キ ャ ン
レ ベル 1 ( 現在の ペー ジ に対
す る 意図的共有テーブル ・
ロ ッ ク 、 共有 ロ ッ ク )
レ ベル 0 ( ダーテ ィ ・ リ ー ド )
デー タ オ ン リ ー ロ ッ
ク ・ テーブル
各 ノ ン ク ラ ス タ ー ド ・ イ ンデ ッ ク ス と 、 も し
あ ればそ の ク ラ ス タ ー ド ・ イ ンデ ッ ク ス の
テーブル ・ ス キ ャ ン と リ ー フ ・ レ ベル ・ ス
キャ ン
テーブル名 と ク ラ ス タ ー ド ・ イ ンデ ッ ク ス名
全ペー ジ ロ ッ ク ・
テーブル ・ ス キ ャ ン
テーブル
デー タ オ ン リ ー ロ ッ
リ ー フ ・ レ ベル ・ イ ンデ ッ ク ス ・ ス キ ャ ン
ク ・ テーブル
テーブル名 と ノ ン ク ラ ス タ ー ド ・ イ ンデ ッ ク ス名
全ペー ジ ロ ッ ク ・
リ ー フ ・ レ ベル ・ イ ンデ ッ ク ス ・ ス キ ャ ン
テーブル
デー タ オ ン リ ー ロ ッ
ク ・ テーブル
テーブル名 と カ ラ ム名
全ペー ジ ロ ッ ク ・
テーブル
リ ー フ ・ レ ベル ・ イ ンデ ッ ク ス ・ ス キ ャ ン
テーブル ・ ス キ ャ ン ( ワ ー ク ・ テーブル を 作
成 し て ワ ー ク ・ テーブル を ソ ー ト す る )
デー タ オ ン リ ー ロ ッ
ク ・ テーブル
テーブル ・ ス キ ャ ン ( ワ ー ク ・ テーブル を 作
成 し て ワ ー ク ・ テーブル を ソ ー ト す る )
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
レ ベル 1 ( 現在の ペー ジ に対
す る 意図的共有テーブル ・
ロ ッ ク 、 共有 ロ ッ ク )
レ ベル 0 ( ダーティ ・ リ ード )
レ ベル 1 ( 現在の ペー ジ に対
す る 意図的共有テーブル ・
ロ ッ ク 、 共有 ロ ッ ク )
レ ベル 0 ( ダーティ ・ リ ード )
レ ベル 1 ( 現在の ページ に 対
する 意図的共有テーブル・
ロ ッ ク 、 共有ロ ッ ク )
レ ベル 0 ( ダーティ ・ リ ード )
327
update statistics 実行時のスキャン・タイプ、ソートの稼働条件、ロック
インデックス未設定カラムまたは非先行カラムのソート
イ ン デ ッ ク ス未設定カ ラ ム と イ ン デ ッ ク ス内の非先行カ ラ ム に対 し
て、 Adaptive Server は逐次テーブル ・ ス キ ャ ン を 実行 し ま す。 まず、
ワ ー ク ・ テーブル に カ ラ ム値 を コ ピ ー し て か ら 、 そ の ワ ー ク ・ テーブ
ル を ソ ー ト し て ヒ ス ト グ ラ ム を 作成 し ま す。 with consumers 句が指定 さ
れな い かぎ り 、 ソ ー ト は逐次実行 さ れ ま す。
詳細に つ い ては、 「第 5 章 並列 ク エ リ 処理」 を 参照 し て く だ さ い。
update statistics 実行中のロック、スキャン、およびソート
update index statistics コ マ ン ド に よ っ て生成 さ れ る 一連の統計更新オペ
レ ー シ ョ ン では、 同等の イ ン デ ッ ク ス ・ レ ベルお よ び カ ラ ム ・ レ ベル
の コ マ ン ド と 同 じ ロ ッ ク 、 ス キ ャ ン、 お よ び ソ ー ト が使用 さ れ ま す。
た と えば、 salesdetail テーブルの salesdetail(stor_id, ord_num, title_id) に ノ
ン ク ラ ス タ ー ド ・ イ ン デ ッ ク ス sales_det_ix が あ る 場合に、 次の コ マ
ン ド を 実行 し た と し ま す。
update index statistics salesdetail
こ の コ マ ン ド では、 次の update statistics オ ペ レ ー シ ョ ン が実行 さ れ
ま す。
update statistics salesdetail sales_det_ix
update statistics salesdetail (ord_num)
update statistics salesdetail (title_id)
update all statistics 実行中のロック、スキャン、およびソート
update all statistics コ マ ン ド は、 テーブルの各 イ ン デ ッ ク ス に対 し て一
連の update statistics オ ペ レ ー シ ョ ン を 実行 し 、 イ ン デ ッ ク ス さ れて い
な い カ ラ ム すべて に対 し て一連の update statistics オ ペ レ ー シ ョ ン を 実
行 し ま す。
328
Adaptive Server Enterprise
第 10 章
パフォーマンス改善のための統計値の使用
with consumers 句の使用
update statistics の with consumers 句は、 RAID (Redundant Array of
Independent Disks) デバ イ ス上の分割 さ れた テーブルで の使用 を 意図 し
て設計 さ れて い ま す。 こ のデバ イ ス は、 Adaptive Server では単一の
I/O デバ イ ス の よ う に見え ま すが、 並列 ソ ー ト に必要な高い ス ルー
プ ッ ト を 実現 し ま す。 詳細に つ い ては、 「第 5 章 並列 ク エ リ 処理」
を 参照 し て く だ さ い。
update statistics が同時処理に与える影響を小さくする方法
デー タ オ ン リ ー ロ ッ ク ・ テーブル の場合、 update statistics はダーテ ィ ・
リ ー ド を 使用す る た め ( ト ラ ン ザ ク シ ョ ン の独立性 レ ベル 0)、 サーバ
上で他の タ ス ク が ア ク テ ィ ブで も 実行で き、 テーブルや イ ン デ ッ ク ス
へ の ア ク セ ス を ブ ロ ッ ク し ま せん。 イ ン デ ッ ク ス内の先行カ ラ ム の
場合、 統計値の更新に は イ ン デ ッ ク ス の リ ー フ レ ベル ・ ス キ ャ ン だけ
が必要で、 ソ ー ト は必要あ り ま せん。 し たが っ て、 カ ラ ム の統計値 を
更新 し て も 同時処理の パ フ ォ ー マ ン ス に は さ ほ ど 影響 し ま せん。
し か し 、 イ ン デ ッ ク ス未設定カ ラ ム や非先行カ ラ ム の統計値 を 更新す
る 場合は、 テーブル ・ ス キ ャ ン、 ワ ー ク ・ テーブル、 ソ ー ト が必要に
な り 、 同時処理に影響 し ま す。
•
ソ ー ト は、 CPU 集約。 CPU 使用率 を 最小化す る 場合は、 逐次 ソ ー
ト を 使用す る か、 ワ ー カ ー ・ プ ロ セ ス数 を 少な く す る 。 ま た は、
実行 ク ラ ス を 使 っ て update statistics に優先度 を 設定す る 。
『パ フ ォ ー マ ン ス & チ ュ ーニ ン グ ・ シ リ ーズ : 基本』 の 「第 3 章
エ ン ジ ン と CPU の使用方法」 を 参照 し て く だ さ い。
•
ソ ー ト 実行の マ ー ジ に必要な キ ャ ッ シ ュ 領域は、 デー タ ・ キ ャ ッ
シ ュ か ら 取 ら れ る 。 さ ら に、 プ ロ シ ー ジ ャ ・ キ ャ ッ シ ュ 領域 も 必
要に な る 。 number of sort buffers を 低い値に設定す る と 、 バ ッ フ ァ ・
キ ャ ッ シ ュ で使用 さ れ る 領域が減少す る 。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
329
delete statistics コマンドの使用
number of sort buffers に大き な値 を 設定す る と 、 デー タ ・ キ ャ ッ
シ ュ か ら 取 る 領域が増え る 。 ま た、 ソ ー ト さ れた値の マ ー ジ に プ
ロ シ ー ジ ャ ・ キ ャ ッ シ ュ 領域が使用 さ れ る た め、 プ ロ シ ー ジ ャ ・
キ ャ ッ シ ュ か ら ス ト ア ド ・ プ ロ シ ー ジ ャ が フ ラ ッ シ ュ さ れ る 場合
も あ る 。 各 ロ ー に必要なプ ロ シ ー ジ ャ ・ キ ャ ッ シ ュ は約 100 バ イ
ト で、 指定 し た ソ ー ト ・ バ ッ フ ァ に収め る こ と がで き ま す。 た と
えば、 500 2K の ソ ー ト ・ バ ッ フ ァ が指定 さ れ、 各 2K バ ッ フ ァ に
約 200 ロ ーが収容 さ れ る 場合、 ソ ー ト を サポー ト す る た め に 200 *
100 * 500 バ イ ト の プ ロ シ ー ジ ャ ・ キ ャ ッ シ ュ が必要に な り ま す。
ソ ー ト の実行で 500 のデー タ ・ キ ャ ッ シ ュ ・ バ ッ フ ァ が満杯に な
る と す る と 、 こ の例では約 5000 の 2K プ ロ シ ー ジ ャ ・ キ ャ ッ
シ ュ ・ バ ッ フ ァ が必要に な り ま す。
ソ ー ト の た め の ワ ー ク ・ テーブル作成に も tempdb の領域が使用 さ れ
ま す。
delete statistics コマンドの使用
11.9 よ り 前の バー ジ ョ ン の Adaptive Server では、 イ ン デ ッ ク ス を 削除
す る と イ ン デ ッ ク ス のデ ィ ス ト リ ビ ュ ー シ ョ ン ・ ペ ー ジ が削除 さ れ ま
し た。 バー ジ ョ ン 11.9.2 では、 カ ラ ム レ ベルの統計値 を 、 ユーザが明
示的に管理 し ま す。 オプテ ィ マ イ ザは、 イ ン デ ッ ク ス が存在 し な い場
合で も カ ラ ム レ ベルの統計値 を 使用で き ま す。 delete statistics コ マ ン ド
を 使用す る と 、 特定の カ ラ ム の統計値 を 削除で き ま す。
作成 し た イ ン デ ッ ク ス がデー タ ・ ア ク セ ス に有用で な い、 ま た はデー
タ 変更時の イ ン デ ッ ク ス管理に コ ス ト がか か る と い う 理由で、 後か ら
イ ン デ ッ ク ス を 削除す る 場合、 次の こ と を 確認 し て く だ さ い。
•
イ ン デ ッ ク ス の統計値がオプテ ィ マ イ ザに と っ て有益で あ る 。
•
対象 と す る イ ン デ ッ ク ス で カ ラ ム の キー値の分布が、 ロ ー の挿入
と 削除に よ っ て時間 と と も に変わ る こ と が多い。
キー値の分布が変わ る 場合、 update statistics を 定期的に実行 し て統
計値 を 有益な も の に保つ必要が あ る 。
330
Adaptive Server Enterprise
第 10 章
パフォーマンス改善のための統計値の使用
次の コ マ ン ド は、 titles テーブル の price カ ラ ム の統計値 を 削除 し ま す。
delete statistics titles(price)
注意 delete statistics は sysstatistics か ら の み ロ ー を 削除 し ま す。
systabstats か ら は ロ ー を 削除 し ま せん。 パーテ ィ シ ョ ン ・ ロ ー ・ カ ウ
ン ト 、 ク ラ ス タ 率、 ペー ジ ・ カ ウ ン ト な ど を 記述 し た systabstats 内の
ロ ーは削除で き ま せん。 ただ し 、 optdiag simulate statistics を 使用 し て、
シ ミ ュ レ ー ト し た systabstats ロ ー を sysstatistics に追加 し た場合、 追加
し た ロ ーは削除 さ れ ま す。
ロー・カウントが不正確な場合
特に ク エ リ 処理に rollback コ マ ン ド が多い場合、 ロ ー数、 転送 さ れた
ロ ー数、 削除 さ れた ロ ー数の ロ ー ・ カ ウ ン ト 値が不正確に な る こ と が
あ り ま す。 作業負荷が極端に大き く 、 ハ ウ ス キー ピ ン グ ・ ウ ォ ッ
シ ュ ・ タ ス ク が あ ま り 実行 さ れな い場合、 こ れ ら の統計値は さ ら に不
正確に な る 傾向が あ り ま す。
update statistics を 実行す る と 、 systabstats 内の こ れ ら の カ ウ ン ト が訂正
さ れ ま す。 ハ ウ ス キー ピ ン グ ・ ウ ォ ッ シ ュ ・ タ ス ク や sp_flushstats を 実
行す る と 、 ロ ー ・ カ ウ ン ト 値は systabstats に保管 さ れ ま す。
注意 ハ ウ ス キー ピ ン グ統計値の フ ラ ッ シ ュ を 有効に す る に は、 設定
パ ラ メ ー タ housekeeper free write percent を 1 以上に設定 し て く だ さ い。
dbcc checktable ま た は dbcc checkdb を 実行す る と 、 メ モ リ 内の統計値が
更新 さ れ ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
331
ロー・カウントが不正確な場合
332
Adaptive Server Enterprise
第
1 1
章
抽象プランの概要
トピック
概要
抽象プ ラ ン の管理
ク エ リ ・ テキ ス ト と ク エ リ ・ プ ラ ン の関係
完全なプ ラ ン と 部分プ ラ ン
抽象プ ラ ン ・ グループ
抽象プ ラ ン の ク エ リ へ の関連づけ
ページ
333
335
335
336
339
340
概要
Adaptive Server は ク エ リ の抽象プ ラ ン を 生成 し て、 テキ ス ト と そ
れ に関連づけ ら れた抽象プ ラ ン を sysqueryplans シ ス テ ム ・ テーブ
ル に保存で き ま す。 高速な ハ ッ シ ュ ・ メ ソ ッ ド を 使用す る と 、 受
信 し た SQL ク エ リ と 保存 さ れて い る ク エ リ ・ テキ ス ト を 比較 し 、
一致す る も の が あ っ た場合に、 対応す る 保存 さ れた抽象プ ラ ン を
使用 し て ク エ リ が実行 さ れ ま す。
抽象プ ラ ン は、 専用の言語 を 使用 し て ク エ リ の実行プ ラ ン を 記述
し ま す。 そ の言語に は、 オプテ ィ マ イ ザに よ っ て生成 さ れ る 選択
や動作 を 指定す る 演算子が含ま れ ま す。 た と えば、 イ ン デ ッ ク ス
title_id_ix を 使用 し て titles テーブルの イ ン デ ッ ク ス ・ ス キ ャ ン を 指
定す る に は、 抽象プ ラ ン を 次の よ う に記述 し ま す。
( i_scan title_id_ix titles)
こ の抽象プ ラ ン で ク エ リ を 使用す る た め に、 次の よ う に ク エ リ ・
テキ ス ト を 修正 し 、 PLAN 句 を 追加で き ま す。
select * from titles where title_id = “On Liberty”
plan
“(i_scan title_id_ix titles)”
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
333
概要
こ の代替方法に は SQL テキ ス ト の変更が必要です。 ただ し 、
最初に説明 し た方法、 つ ま り ク エ リ の抽象プ ラ ン を 指定す る
sysqueryplans ベー ス の方法に は、 ク エ リ ・ テキ ス ト の変更は含ま
れ ま せん。
抽象プ ラ ン に よ っ て、 シ ス テ ム管理者 と パ フ ォ ー マ ン ス管理者
は、 ク エ リ ・ プ ラ ン の変更がサーバ の全体的な パ フ ォ ー マ ン ス に
影響す る の を 防ぐ こ と がで き ま す。 ク エ リ ・ プ ラ ン に対す る 変更
は、 次の よ う な原因で発生 し ま す。
•
オプテ ィ マ イ ザの選択や ク エ リ ・ プ ラ ン に影響す る よ う な
Adaptive Server ソ フ ト ウ ェ ア の ア ッ プグ レ ー ド
•
ク エ リ ・ プ ラ ン を 変更す る よ う な新 し い Adaptive Server 機能
•
並列度、 テーブル分割、 ま た は イ ン デ ッ ク ス な ど の チ ュ ーニ
ン グ ・ オプ シ ョ ン の変更
抽象プ ラ ン は、 主 と し て シ ス テ ム の大がか り な変更の前後に ク エ
リ ・ プ ラ ン を 取得す る こ と を 目的 と し て作成 し ま す。 変更前 と 後
の ク エ リ ・ プ ラ ン の セ ッ ト を 比較す る こ と に よ り 、 行 っ た変更が
ク エ リ に ど の よ う な効果 を 及ぼすか を 知 る こ と がで き ま す。 次の
よ う な機能 も あ り ま す。
•
テーブル ・ ス キ ャ ン や再 フ ォ ー マ ッ ト な ど 、 特別な タ イ プ の
プ ラ ン を 検索す る 。
•
特定の イ ン デ ッ ク ス を 使用す る プ ラ ン を 検索す る 。
•
効果的では な い ク エ リ の全部ま た は一部の プ ラ ン を 指定す る 。
•
最適化に時間がか か る ク エ リ の プ ラ ン を 保存す る 。
抽象プ ラ ン は、 バ ッ チ ま た は ク エ リ の中でオプテ ィ マ イ ザの判断
を 操作す る た め に オプ シ ョ ン を 指定す る 代わ り に使用 し ま す。 抽
象プ ラ ン を 使用す る と 、 構文 を 変更せずに、 SQL 文の最適化結果
を 変更で き ま す。 ク エ リ ・ テキ ス ト を 格納 し て い る テキ ス ト と 比
較 し て一致 を 見つ け る 作業に は処理の た め の オ ーバヘ ッ ド がか か
り ま すが、 保存 さ れて い る プ ラ ン を 使 う こ と に よ り ク エ リ 最適化
の た め の オ ーバヘ ッ ド が減 り ま す。
334
Adaptive Server Enterprise
第 11 章
抽象プランの概要
抽象プランの管理
シ ス テ ム管理者 と デー タ ベ ー ス所有者は、 シ ス テ ム ・ プ ロ シ ー
ジ ャ の完全な セ ッ ト を 使用 し て、 プ ラ ン、 お よ びプ ラ ン ・ グルー
プ を 管理で き ま す。 個々の ユーザは、 実行 し た ク エ リ の プ ラ ン を
表示、 削除、 お よ び コ ピ ーで き ま す。
詳細に つ い ては、 「第 14 章 シ ス テ ム ・ プ ロ シ ー ジ ャ を 使用 し た抽
象プ ラ ン の管理」 を 参照 し て く だ さ い。
クエリ・テキストとクエリ・プランの関係
多 く の SQL ク エ リ に は、 い く つ も の実行プ ラ ン が可能です。 SQL
では希望す る 結果セ ッ ト を 記述で き ま すが、 そ の結果セ ッ ト を
デー タ ベー ス か ら 取得す る 方法は記述 し ま せん。 た と えば、 次の
よ う な 3 つ の テーブル を ジ ョ イ ン す る ク エ リ を 想定 し てみ ま す。
select t1.c11, t2.c21
from t1, t2, t3
where t1.c11 = t2.c21
and t1.c11 = t3.c31
ジ ョ イ ン は さ ま ざ ま な順序で実行で き、 さ ら に テーブル に あ る イ
ン デ ッ ク ス に よ り 、 テーブル ・ ス キ ャ ン、 イ ン デ ッ ク ス ・ ス キ ャ
ン、 再 フ ォ ー マ ッ ト 方式な ど 多 く の ア ク セ ス ・ メ ソ ッ ド が考え ら
れ ま す。 個々の ジ ョ イ ン で、 ネ ス ト ループ ・ ジ ョ イ ン か マ ー ジ ・
ジ ョ イ ン が使われ る 可能性 も あ り ま す。 こ の よ う な多 く の ジ ョ イ
ン方法か ら 、 オプテ ィ マ イ ザの ク エ リ ・ コ ス ト 計算ア ルゴ リ ズム
に よ っ て選択 さ れ ま すが、 ど れが選択 さ れ る かが ク エ リ 自体に記
述 さ れて い る わ けでは あ り ま せん。
抽象プ ラ ン を 取得す る と 、 ク エ リ は通常の方法で最適化 さ れ ま す
が、 オプテ ィ マ イ ザが抽象プ ラ ン を 生成 し て ク エ リ ・ テキ ス ト と
抽象プ ラ ン を sysqueryplans に保存す る 場合 も あ り ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
335
完全なプランと部分プラン
クエリ・プランに影響するオプションの制約
Adaptive Server は、 オプテ ィ マ イ ザに よ る 選択に影響 を 与え る 次
の よ う な オプ シ ョ ン を 提供 し て い ま す。
•
特定の ジ ョ イ ン順序 を 実行す る た め の set forceplan、 ま た は ク
エ リ に使用す る ワ ー カ ー ・ プ ロ セ ス の最大数を 指定す る た め
の set parallel_degree の よ う な セ ッ シ ョ ン ・ レ ベルの オプ シ ョ ン
•
ク エ リ ・ テキ ス ト に含ま れて い る 、 イ ン デ ッ ク ス の選択、
キ ャ ッ シ ュ 方式、 お よ び並列度に影響 を 及ぼすオプ シ ョ ン
ク エ リ ・ テキ ス ト に対す る set コ マ ン ド の使用や ヒ ン ト の追加
に は、 次の よ う な制限が あ り ま す。
•
サブ ク エ リ 付加な ど の一部の ク エ リ ・ プ ラ ン に は、 効果が
な い。
•
ク エ リ 作成ツ ールの中に は、 ク エ リ 内オプ シ ョ ン を サポー ト
し て い な か っ た り 、 ど の ク エ リ も ベ ン ダ に依存 し な い こ と を
要件 と し て い る も の が あ る 。
完全なプランと部分プラン
抽象プ ラ ン は、 ク エ リ 処理ス テ ッ プ と オプ シ ョ ン を すべて記述 し
た完全なプ ラ ン に も 、 一部の み を 記述 し た部分プ ラ ン に も で き
ま す。 部分プ ラ ン では、 他の ア ク セ ス ・ メ ソ ッ ド を 指定せずに、
単に イ ン デ ッ ク ス を 特定の テーブルの ス キ ャ ン に の み使用す る
よ う に指定で き ま す。 次に例 を 示 し ま す。
select t1.c11, t2.c21
from t1, t2, t3
where t1.c11 = t2.c21
and t1.c11 = t3.c31
plan
“(i_scan t3_c31_ix t3)”
完全な抽象プ ラ ン に は、 次の よ う な項目 を 記述 し ま す。
336
•
ジ ョ イ ン型。 ネ ス ト ループ ・ ジ ョ イ ン用の nl_join、 マ ー ジ ・
ジ ョ イ ン用の m_join、 ま た はハ ッ シ ュ ・ ジ ョ イ ン用の h_join。
•
ジ ョ イ ン順。
Adaptive Server Enterprise
第 11 章
抽象プランの概要
•
ス キ ャ ン ・ タ イ プ。 テーブル ・ ス キ ャ ン用の t_scan ま た は イ
ン デ ッ ク ス ・ ス キ ャ ン用の i_scan。
•
そ の テーブル用に選択 さ れた イ ン デ ッ ク ス名で、 イ ン デ ッ ク
ス ・ ス キ ャ ン に よ り ア ク セ ス さ れ る も の。
•
ス キ ャ ン ・ プ ロ パテ ィ で、 ク エ リ 内の各テーブルの並列度、
I/O サ イ ズ、 お よ びキ ャ ッ シ ュ 方式。
上記の ク エ リ 用抽象プ ラ ン に、 ジ ョ イ ン順、 ク エ リ 内の各テーブ
ルへ の ア ク セ ス ・ メ ソ ッ ド 、 各テーブル の ス キ ャ ン ・ プ ロ パテ ィ
を 指定 し ま す。
sselect t1.c11, t2.c21
from t1, t2, t3
where t1.c11 = t2.c21
and t1.c11 = t3.c31
plan
“(i_scan t3_c31_ix t3)”
(nl_join ( nl_join
( t_scan t2 )
( i_scan t1_c11_ix t1 )
)
( i_scan t3_c31_ix t3 )
)
( prop t3
( parallel 1 )
( prefetch 16 )
( lru )
)
( prop t1
( parallel 1 )
( prefetch 16 )
( lru )
)
( prop t2
( parallel 1 )
( prefetch 16 )
( lru )
)
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
337
完全なプランと部分プラン
抽象プ ラ ン の ダ ン プ ・ モ ー ド がオ ン の場合、 ク エ リ ・ テキ ス ト と
抽象プ ラ ン の組み合わせは sysqueryplans に保存 さ れ ま す。
select t1.c11, t2.c21
from t1, t2, t3
where t1.c11 = t2.c21
and t1.c11 = t3.c31
plan
“(i_scan t3_c31_ix t3)”
部分プランの作成
抽象プ ラ ン を 取得す る と 、 完全な抽象プ ラ ン が生成 さ れ、 格納 さ
れ ま す。 オプテ ィ マ イ ザに よ る 選択のサブセ ッ ト の み を 対象 と す
る 部分プ ラ ン を 記述す る こ と も で き ま す。 上記の ク エ リ が、 t3 上
の イ ン デ ッ ク ス を 使用せず、 それ以外の すべて の ク エ リ ・ プ ラ ン
が最適化 さ れた状態で あ れば、 create plan コ マ ン ド を 使用 し て こ
の ク エ リ の部分プ ラ ン を 作成 し て も か ま い ま せん。 次の部分プ ラ
ン では、 t3 上の イ ン デ ッ ク ス の選択の み を 指定 し て い ま す。
create plan
"select t1.c11, t2.c21
from t1, t2, t3
where t1.c11 = t2.c21
and t1.c11 = t3.c31"
"( i_scan t3_c31_ix t3 )"
ま た、 select、 delete、 update な ど の最適化可能な コ マ ン ド に plan 句
を 使用 し て抽象プ ラ ン を 作成す る こ と も で き ま す。 抽象プ ラ ン の
ダ ン プ ・ モ ー ド がオ ン の場合、 ク エ リ ・ テキ ス ト と AP の組み合
わせは sysqueryplans に保存 さ れ ま す。
詳細に つ い ては、 「第 12 章 抽象プ ラ ン の作成 と 使用」 を 参照 し て
く だ さ い。
338
Adaptive Server Enterprise
第 11 章
抽象プランの概要
抽象プラン・グループ
Adaptive Server を イ ン ス ト ールす る と 、 次の 2 つ の抽象プ ラ ン ・
グループが準備 さ れ ま す。
•
ap_stdout - デ フ ォ ル ト でプ ラ ン の取得に使用 さ れ る 。
•
ap_stdin - デ フ ォ ル ト でプ ラ ン の関連づけ に使用 さ れ る 。
シ ス テ ム管理者は、 ap_stdout に サーバ ワ イ ド なプ ラ ン の取得 を 設
定で き ま す。 こ れ に よ り 、 各 ク エ リ の ク エ リ ・ プ ラ ン を すべて取
得で き ま す。 サーバ ワ イ ド なプ ラ ン の関連づけ に は、 ap_stdin に あ
る ク エ リ と プ ラ ン が使用 さ れ ま す。 一部の ク エ リ が特別に チ ュ ー
ニ ン グ を し た プ ラ ン を 必要 と す る 場合は、 そ の プ ラ ン を サーバ全
体で使え る よ う に で き ま す。
シ ス テ ム管理者ま た はデー タ ベ ー ス所有者は、 別の プ ラ ン ・ グ
ループ を 作成 し 、 既存の グループ の プ ラ ン を そ の新 し い グループ
に コ ピ ー し 、 そ の 2 つ の グループ の プ ラ ン を 比較で き ま す。
抽象プ ラ ン の取得 と 、 抽象プ ラ ン と ク エ リ の関連づけ は、 現在ア
ク テ ィ ブなプ ラ ン ・ グループ の コ ン テキ ス ト で の み発生 し ま す。
ユーザは、 プ ラ ン の取得 と 関連づけ を セ ッ シ ョ ン ・ レ ベルの set
コ マ ン ド を 使用 し て行い ま す。
抽象プ ラ ン ・ グループは、 次の よ う に使用で き ま す。
•
ク エ リ の チ ュ ーニ ン グ を 行 う と き に、 テ ス ト 用に作成 し た グ
ループ に抽象プ ラ ン を 作成す る と 、 同 じ シ ス テ ム上の ほ か の
ユーザに影響 を 与えずに済む。
•
プ ラ ン ・ セ ッ ト の 「前後」 に プ ラ ン ・ グループ を 使用す る と 、
シ ス テ ム の変更ま た は更新に よ る 変更の ク エ リ の最適化に対
す る 効果 を 決定で き る 。
プ ラ ン の取得お よ び関連づけ を 可能に す る 方法に つ い ては、
「第 12 章 抽象プ ラ ン の作成 と 使用」 を 参照 し て く だ さ い。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
339
抽象プランのクエリへの関連づけ
抽象プランのクエリへの関連づけ
抽象プ ラ ン を 保存す る と 、 そ の ク エ リ 内の空白部 ( タ ブ、 複数の
空白文字、 改行、 ただ し -- ス タ イ ルの コ メ ン ト を 終了す る 改行 を
除 く ) は 1 つ の空白部に ま と め ら れ、 空白部が切 り つ め ら れた
SQL 文の ハ ッ シ ュ ・ キー値が計算 さ れ ま す。 切 り つ め ら れた SQL
文 と そ の ハ ッ シ ュ ・ キーは、 抽象プ ラ ン 、 ユニー ク なプ ラ ン ID、
ユーザ ID、 現在の抽象プ ラ ン ・ グループ の ID と と も に
sysqueryplans に格納 さ れ ま す。
抽象プ ラ ン の関連づけ を 有効に す る と 、 受け取 っ た SQL 文の ハ ッ
シ ュ ・ キーが計算 さ れ、 こ の値 と 対応す る ユーザ ID を 使用 し て
現在の関連グループ内で の ク エ リ と 抽象プ ラ ン の一致の検索が行
われ ま す。 抽象プ ラ ン の完全な関連づけ キーは、 次の要素で構成
さ れ ま す。
•
現在の ユーザの ユーザ ID
•
現在の関連づけグループ の グループ ID
•
ク エ リ ・ テキ ス ト 全体
一致す る ハ ッ シ ュ ・ キーが見つ か る と 、 そ の保存 さ れた ク エ リ の
テキ ス ト 全体が実行予定の ク エ リ と 比較 さ れ、 完全に一致すれば
そ の ク エ リ が実行 さ れ ま す。
関連づけ キーがユーザ ID、 グループ ID、 お よ び ク エ リ ・ テキ ス
ト の組み合わせで構成 さ れ る と い う こ と は、 指定 し たユーザに つ
い て、 1 つ の抽象プ ラ ン ・ グループ に ク エ リ ・ テキ ス ト が同 じ で
ク エ リ ・ プ ラ ン が異な る ク エ リ が 2 つ存在す る こ と は あ り 得な い
こ と を 意味 し ま す。
340
Adaptive Server Enterprise
第
1 2
章
抽象プランの作成と使用
set コ マ ン ド を 使用 し て、 抽象プ ラ ン を 取得 し 、 受け取 っ た SQL
ク エ リ を 保存 さ れて い る プ ラ ン と 関連づけ ま す。 すべて の ユーザ
は、 セ ッ シ ョ ン ・ レ ベルの コ マ ン ド を 使用 し て セ ッ シ ョ ン中に プ
ラ ン を 取得 し 、 ロ ー ド す る こ と がで き ま す。 シ ス テ ム管理者は、
サーバ全体で の抽象プ ラ ン の取得 と 関連づけ を 行 う こ と がで き ま
す。 こ の章では、 SQL を 使 っ て抽象プ ラ ン を 指定す る 方法に つ い
て も 説明 し ま す。
トピック
set コ マ ン ド を使用 し たプ ラ ン の取得 と 関連づけ
set plan exists check オプ シ ョ ン
抽象プ ラ ン で の他の set オプ シ ョ ン の使用
サーバ全体で の抽象プ ラ ン の取得 と 関連づけ モ ー ド
SQL に よ る プ ラ ン の作成
ページ
341
348
349
352
353
set コマンドを使用したプランの取得と関連づけ
セ ッ シ ョ ン ・ レ ベルでは、 すべて の ユーザは set plan dump コ マ ン
ド と set plan load コ マ ン ド を 使用 し て、 抽象プ ラ ン を 取得お よ び
使用す る 機能 を 有効ま た は無効に す る こ と がで き ま す。 set plan
replace コ マ ン ド を 使用す る と 、 既存の プ ラ ン を 変更後の プ ラ ン で
上書き す る か ど う か を 指定で き ま す。
抽象プ ラ ン の各モ ー ド の有効/無効の指定は、 こ の コ マ ン ド が含
ま れて い る バ ッ チ の最後に有効 と な り ま す (showplan の場合 と 同
様 )。 次の よ う な独立 し たバ ッ チで モ ー ド を 切 り 換え て か ら 、
ク エ リ を 実行 し ま す。
set plan dump on
go
/*queries to run*/
go
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
341
set コマンドを使用したプランの取得と関連づけ
ス ト ア ド ・ プ ロ シ ー ジ ャ で ど の set plan コ マ ン ド を 使用 し て も 、
そ の コ マ ン ド が含ま れて い る プ ロ シ ー ジ ャ に は影響 し ま せん が (
遅延 コ ン パ イ ルの影響 を 受け る 文は除 く )、 そ の プ ロ シ ー ジ ャ を
終了 し て も そ の効果は有効です。
set plan dump を使用したプラン取得モードの有効化
set plan dump コ マ ン ド を 使用す る と 、 抽象プ ラ ン の取得機能 を 有
効 ま た は無効に す る こ と がで き ま す。 グループ名 を 指定せずに set
plan dump を 実行す る と 、 デ フ ォ ル ト ・ グループ の ap_stdout に プ
ラ ン を 保存で き ま す。
set plan dump on
プ ラ ン を 取得 し て、 特定の プ ラ ン ・ グループ に入れ る に は、
グループ名 を 指定 し ま す。 下の例では、 グループ dev_plans を
取得先グループ と し て設定 し て い ま す。
set plan dump dev_plans on
指定す る グループは、 set コ マ ン ド を 実行す る 前に存在 し な けれ
ばな り ま せん。 シ ス テ ム ・ プ ロ シ ー ジ ャ sp_add_qpgroup を 使用す
る と 、 抽象プ ラ ン ・ グループ を 作成で き ま すが、 こ の コ マ ン ド を
実行で き る の は シ ス テ ム管理者かデー タ ベー ス所有者だけです。
抽象プ ラ ン ・ グループがすで に存在すれば、 ユーザはだれで も プ
ラ ン を そ の グループ に ダ ン プで き ま す。
プ ラ ン ・ グループ の作成に つ い ては、 「グループ の作成」
(399 ペー ジ ) を 参照 し て く だ さ い。
プラ ン の 取得機能を 無効に する に は、 次の コ マ ン ド を 実行し ま す。
set plan dump off
取得モ ー ド を 終了す る と き に は、 グループ名 を 指定す る 必要は あ
り ま せん。 保存ま た は比較す る に は、 一度に つ き 1 つ の抽象プ ラ
ン ・ グループ し か ア ク テ ィ ブ に で き ま せん。 あ る グループ に プ ラ
ン を 保存中の場合は、 次に示す よ う に プ ラ ン の plan dump モ ー ド
を い っ た ん無効に し 、 新 し い グループ の た め に再度有効に し
ま す。
set plan dump on /*save to the default group*/
go
/*some queries to be captured */
go
set plan dump off
342
Adaptive Server Enterprise
第 12 章
抽象プランの作成と使用
go
set plan dump dev_plans on
go
/*additional queries*/
go
set plan dump コ マ ン ド が有効な間に use database コ マ ン ド を 実行す
る と 、 plan dump モ ー ド は結果的に無効に さ れ ま す。
格納されているプランへのクエリの関連づけ
set plan load コ マ ン ド を 使用す る と 、 格納 さ れて い る 抽象プ ラ
ン と ク エ リ を 関連づけ る 機能 を 有効ま た は無効に す る こ と がで
き ま す。
デ フ ォ ル ト ・ グループ の ap_stdin を 使用す る 関連づけ モ ー ド に す
る に は、 次の コ マ ン ド を 使用 し ま す。
set plan load on
別の抽象プ ラ ン ・ グループ を 使用す る 関連づけ モ ー ド を 有効に す
る に は、 次の よ う に グループ名 を 指定 し ま す。
set plan load test_plans on
プ ラ ン の関連づけ を 行 う に は、 一度に 1 つ の抽象プ ラ ン ・ グルー
プ し か ア ク テ ィ ブ に で き ま せん。 あ る グループ に対 し てプ ラ ン関
連づけ機能 を ア ク テ ィ ブ に し て い る 場合は、 次の よ う に現在の グ
ループ を 非ア ク テ ィ ブ に し 、 新 し い グループ に対 し てプ ラ ン関連
づけ機能 を ア ク テ ィ ブ に し ま す。
set plan load test_plans on
go
/*some queries*/
go
set plan load off
go
set plan load dev_plans on
go
set plan load コ マ ン ド が有効な間に use database コ マ ン ド を 実行す
る と 、 plan load モ ー ド は結果的に無効に さ れ ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
343
set コマンドを使用したプランの取得と関連づけ
プラン取得中の plan replace モードの使用
プ ラ ン取得モ ー ド が ア ク テ ィ ブ な間に、 set plan replace コ マ ン ド を
有効ま た は無効に す る こ と に よ り 、 同 じ ク エ リ に対 し て既存の プ
ラ ン を 別の プ ラ ン と 置き換え る か ど う か を 指定で き ま す。 plan
replace モ ー ド を ア ク テ ィ ブ に す る に は、 次の コ マ ン ド を 使用 し
ま す。
set plan replace on
set plan replace を 実行す る と き は、 グループ名 を 指定 し な い で く だ
さ い。 現在ア ク テ ィ ブ な取得グループ に影響 し ま す。
プ ラ ン の置換機能 を 無効に す る に は、 次の コ マ ン ド を 実行 し
ま す。
set plan replace off
set plan replace コ マ ン ド が有効な間に use database コ マ ン ド を 実行
す る と 、 plan replace モ ー ド は結果的に無効に さ れ ま す。
どのような場合に plan replace モードを使用するか
プ ラ ン の取得中に、 ク エ リ に すで に保存 さ れて い る プ ラ ン と 同 じ
ク エ リ ・ テキ ス ト が あ る 場合は、 replace モ ー ド が有効で な い かぎ
り 既存の プ ラ ン は置換 さ れ ま せん。 特定の ク エ リ に抽象プ ラ ン を
取得 し 、 か つデー タ ベー ス に オプテ ィ マ イ ザに よ る 選択に影響す
る よ う な物理的な変更 を 行 う 場合は、 既存の プ ラ ン を 置換 し て、
変更 を 保存 し ま す。
プ ラ ン の置換が必要 と な る よ う な動作に は、 次の よ う な も の が あ
り ま す。
•
イ ン デ ッ ク ス の追加ま た は削除、 あ る い は イ ン デ ッ ク ス内の
キー ま た はキー順の変更
•
テーブル上の分割の変更
•
バ ッ フ ァ ・ プールの追加ま た は削除
•
ク エ リ ・ プ ラ ン に影響す る よ う な設定パ ラ メ ー タ の変更
ほ と ん ど の場合、 plan load を 有効に し な い で く だ さ い。 プ ラ ン の
関連づけが有効だ と 、 プ ラ ン の指定がオプテ ィ マ イ ザに入力 さ れ
ま す。 た と えば、 ク エ リ の完全プ ラ ン に prefetch プ ロ パテ ィ と 2K
の I/O サ イ ズが含ま れて い て、 ユーザが 16K プール を 作成 し 、
プ ラ ン に あ る プ リ フ ェ ッ チ の指定 を 置換 し よ う と す る 場合は、
plan load モ ー ド を 有効に し な い で く だ さ い。
344
Adaptive Server Enterprise
第 12 章
抽象プランの作成と使用
テーブル内のデー タ の分布が変更 さ れた場合、 イ ン デ ッ ク ス の
再構築、 統計の更新、 あ る い は ロ ッ ク ・ ス キー ム の変更後に ク エ
リ ・ プ ラ ン を チ ェ ッ ク し 、 一部の抽象プ ラ ン を 置換す る 必要が あ
る 場合が あ り ま す。
plan dump、plan load、および plan replace モードの同時使用
plan dump モ ー ド と plan load モ ー ド は同時に ア ク テ ィ ブ に で き ま
す。 こ の と き、 plan replace モ ー ド は ア ク テ ィ ブ と 非ア ク テ ィ ブ の
ど ち ら で も か ま い ま せん。
同じグループに対する plan dump と plan load の使用
同 じ グループ に対 し て plan dump と plan load を 有効に し 、 plan
replace モ ー ド が無効な場合、 次の よ う に な り ま す。
•
そ の ク エ リ に対 し て有効なプ ラ ン が あ る 場合は、 そ の プ ラ ン
は ロ ー ド さ れ、 ク エ リ の最適化に使用 さ れ る 。
•
無効なプ ラ ン が あ る と ( た と えば、 イ ン デ ッ ク ス が削除 さ れ
な か っ た な ど )、 新 し い プ ラ ン が生成 さ れ、 ク エ リ の最適化
に使用 さ れ る が保存 さ れな い。
•
部分プ ラ ン の みが存在す る 場合は、 完全な プ ラ ン が生成 さ れ
る が、 既存の部分プ ラ ン は置換 さ れな い。
•
そ の ク エ リ 用の プ ラ ン がな い場合は、 プ ラ ン が生成 さ れ、
保存 さ れ る 。
replace モ ー ド も 有効に し た場合、 次の よ う に な り ま す。
•
そ の ク エ リ に対 し て有効なプ ラ ン が あ る 場合は、 そ の プ ラ ン
は ロ ー ド さ れ、 ク エ リ の最適化に使用 さ れ る 。
•
そ の プ ラ ン が有効では な い場合、 新 し い プ ラ ン が生成 さ れ、
ク エ リ の最適化に使用 さ れ、 既存の プ ラ ン は置換 さ れ る 。
•
そ の プ ラ ン が部分プ ラ ン の場合は、 完全プ ラ ン が生成 さ れて
使用 さ れ、 既存の部分プ ラ ン は置換 さ れ る 。 部分プ ラ ン の指
定内容は、 オプテ ィ マ イ ザの入力に使用 さ れ る 。
•
そ の ク エ リ 用の プ ラ ン がな い場合は、 プ ラ ン が生成 さ れ、
保存 さ れ る 。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
345
set コマンドを使用したプランの取得と関連づけ
異なるグループに対する plan dump と plan load の使用
あ る グループ に対 し て plan dump を 有効に し 、 別の グループか ら
plan load を 有効に し 、 replace モ ー ド が無効な場合、 次の よ う に な
り ま す。
•
そ の ロ ー ド ・ グループ内で ク エ リ に対 し 既存の有効なプ ラ ン
が あ る 場合、 そ の プ ラ ン が ロ ー ド さ れ、 使用 さ れ る 。 そ の ダ
ン プ ・ グループ に既存の ク エ リ 用の プ ラ ン がな い と 、 そ の プ
ラ ン はそ の ダ ン プ ・ グループ に保存 さ れ る 。
•
ロ ー ド ・ グループ に あ る プ ラ ン が無効な場合、 新 し い プ ラ ン
が生成 さ れ る 。 そ の ダ ン プ ・ グループ に既存の ク エ リ 用の プ
ラ ン がな い と 、 そ の新 し い プ ラ ン がそ の ダ ン プ ・ グループ に
保存 さ れ る 。
•
ロ ー ド ・ グループ に あ る プ ラ ン が部分プ ラ ン の場合は、 既存
の プ ラ ン がな い かぎ り 、 完全プ ラ ン が生成 さ れ、 そ の ダ ン
プ ・ グループ に保存 さ れ る 。 部分プ ラ ン の指定内容は、 オプ
テ ィ マ イ ザの入力に使用 さ れ る 。
•
ロ ー ド ・ グループ に そ の ク エ リ 用の プ ラ ン がな い場合は、
そ の ダ ン プ ・ グループ に そ の ク エ リ 用の プ ラ ン がな い かぎ り 、
そ の プ ラ ン が生成 さ れ、 そ の ダ ン プ ・ グループ に保存 さ れ る 。
replace モ ー ド を ア ク テ ィ ブ に し た場合、 次の よ う に な り ま す。
346
•
そ の ロ ー ド ・ グループ内で ク エ リ に対 し 既存の有効なプ ラ ン
が あ る 場合、 そ の プ ラ ン が ロ ー ド さ れ、 使用 さ れ る 。
•
ロ ー ド ・ グループ に あ る プ ラ ン が無効な場合、 新 し い プ ラ ン
が生成 さ れ、 ク エ リ の最適化に使用 さ れ る 。 新 し い プ ラ ン は、
そ の ダ ン プ ・ グループ に保存 さ れ る 。
•
ロ ー ド ・ グループ に あ る プ ラ ン が部分プ ラ ン の場合は、 完全
なプ ラ ン が生成 さ れ、 そ の ダ ン プ ・ グループ に保存 さ れ る 。
部分プ ラ ン の指定内容は、 オプテ ィ マ イ ザの入力に使用 さ
れる。
•
そ の ク エ リ の プ ラ ン がそ の ロ ー ド ・ グループ に な い場合は、
新 し い プ ラ ン が生成 さ れ る 。 新 し い プ ラ ン は、 そ の ダ ン プ ・
グループ に保存 さ れ る 。
Adaptive Server Enterprise
第 12 章
抽象プランの作成と使用
コンパイル時の set パラメータの変更点
15.0.2 よ り 前の Adaptive Server リ リ ー ス では、 set パ ラ メ ー タ は、
ス ト ア ド ・ プ ロ シ ー ジ ャ の実行後ま た は再 コ ン パ イ ル後に有効に
な っ て い ま し た。 Adaptive Server リ リ ー ス 15.0.2 以降では、 コ ン パ
イ ル時に set オプテ ィ マ イ ザ ・ パ ラ メ ー タ を 使用す る こ と に よ っ
て、 ス ト ア ド ・ プ ロ シ ー ジ ャ やバ ッ チ内の オプテ ィ マ イ ザに影響
を 与え る こ と がで き ま す。
注意 こ の動作変更は、 結果セ ッ ト の構成に影響 を 与え る 場合が あ
り ま す。 15.0.2 バー ジ ョ ン の set パ ラ メ ー タ で生成 さ れた結果セ ッ
ト を 見直 し て か ら 、 運用シ ス テ ム でそれ ら を 使用す る よ う に おす
す め し ま す。
ス ト ア ド ・ プ ロ シ ー ジ ャ か ら 戻 る 前に、 set パ ラ メ ー タ を リ セ ッ ト
し て く だ さ い。 そ う し な い と 、 そ の後の ス ト ア ド ・ プ ロ シ ー ジ ャ
の実行に影響 を 与え る 可能性が あ り ま す。 こ の変更 を 後の ス ト ア
ド ・ プ ロ シ ー ジ ャ に反映 さ せ る に は、 export_options パ ラ メ ー タ を
使用 し ま す。
Adaptive Server では、 次の パ ラ メ ー タ の コ ン パ イ ル時動作が変更
さ れて い ま す。
•
distinc_sorted
•
distinct_sorting
•
distinct_hashing
•
group_sorted
•
group_hashing
•
bushy_space_search
•
parallel_query
•
order_sorting
•
nl_join
•
merge_join
•
hash_join
•
append_union_all
•
merge_union_all
•
merge_union_distinct
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
347
set plan exists check オプション
•
hash_union_distinct
•
store_index
•
index_intersection
•
index_union
•
multi_table_store_ind
•
opportunistic_distict_view
•
advanced_aggregation
•
replicated_partition
•
group_inserting
•
basic_optimization
•
auto_query_tuning
•
query_tuning_mem_limit
•
query_tuning_time_limit
•
set plan optgoal
set plan exists check オプション
ク エ リ ・ プ ラ ン の関連づけ時に exists check モ ー ド を 使用す る と 、
ユーザが抽象プ ラ ン ・ グループか ら 20 個未満の ク エ リ の抽象プ
ラ ン を 要求す る 際の パ フ ォ ー マ ン ス を 向上 さ せ る こ と がで き
ま す。 少数の ク エ リ に最適化の効率 を ア ッ プす る た め の プ ラ ン が
必要な場合は、 exists check モ ー ド を 有効に す る と 、 抽象プ ラ ン が
な い ク エ リ は sysqueryplans でプ ラ ン を チ ェ ッ ク す る 必要がな い の
で、 そ の実行速度が向上 し ま す。
set plan load と set exists check の 2 つ の コ マ ン ド を 有効に す る と 、
ロ ー ド ・ グループ内で最大 20 個 ま で の ク エ リ の ハ ッ シ ュ ・ キー
を キ ャ ッ シ ュ に入れて、 ユーザが利用で き る よ う に な り ま す。 そ
の ロ ー ド ・ グループ に ク エ リ が 20 以上あ る 場合は、 exists check
モ ー ド は無効に な り ま す。 送 ら れて く る すべて の ク エ リ がハ ッ
シ ュ さ れ ま す。 ハ ッ シ ュ ・ キーが抽象プ ラ ン ・ キ ャ ッ シ ュ に入 っ
て い な い場合は、 そ の ク エ リ が使用で き る プ ラ ン は な く 、 検索は
行われ ま せん。 こ れ に よ り 、 プ ラ ン が保存 さ れて い な い ク エ リ 全
部 を よ り 速 く コ ン パ イ ルで き ま す。
348
Adaptive Server Enterprise
第 12 章
抽象プランの作成と使用
構文は次の と お り です。
set plan exists check { on | off }
プ ラ ン の ハ ッ シ ュ ・ キー の キ ャ ッ シ ュ 機能 を 有効に す る 前に、
ロ ー ド ・ モ ー ド を 有効に す る 必要が あ り ま す。
シ ス テ ム管理者は、 設定パ ラ メ ー タ abstract plan cache を 使用 し て
プ ラ ン の ハ ッ シ ュ ・ キー の キ ャ ッ シ ン グ を サーバ全体に設定で き
ま す。 プ ラ ン の キ ャ ッ シ ン グ を サーバ全体で有効に す る に は、 次
の コ マ ン ド を 実行 し ま す。
sp_configure "abstract plan cache", 1
抽象プランでの他の set オプションの使用
他の set チ ュ ーニ ン グ ・ オプ シ ョ ン を set plan dump、
show_abstract_plan、 お よ び set plan load に組み合わせ る
こ と がで き ま す。
show_abstract_plan を使用したプランの表示
set option show_abstract_plan は、 TDS 接続で現在実行中の最適な抽
象プ ラ ン を 表示 し ま す。 こ の コ マ ン ド は最適化後 と 実行前に プ ラ
ン を 表示す る 、 ト レ ー ス ・ フ ラ グ 3604 ま た は 3605 に依存 し な い
唯一の set option show_ コ マ ン ド です。
最終プ ラ ン の抽象プ ラ ン の表示は、 showplan 出力の表示に似て い
ま す。 こ の出力はユーザに情報 を 提供 し ま すが、 抽象プ ラ ン は
sysqueryplans に保存 さ れず、 抽象プ ラ ン の load モ ー ド を 使用す る
場合は使用 さ れ ま せん。
次の例は、 TDS 接続で現在実行中の最適な抽象プ ラ ン を 示 し て い
ま す。
1> set option show_abstract_plan on
2> go
1> select r1, sum(s1)
2> from r, s
3> where r2=s2
4> group by r1
The Abstract Plan (AP) of the final query execution plan:
( group_sorted ( nl_join ( i_scan ir12 r ) ( i_scan is21 s ) ) ) ( prop r
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
349
抽象プランでの他の set オプションの使用
(parallel 1 ) ( prefetch 2 ) ( lru ) ) ( prop s ( parallel 1 ) ( prefetch 2 )
(lru ) )
To experiment with the optimizer behavior, this AP can be modified and then
passed to the optimizer using the PLAN clause:
SELECT/INSERT/DELETE/UPDATE ...
PLAN '( ... )'.
r1
----------- ----------1
2
2
4
(2 rows affected)
showplan の使用
set plan load を 使用 し て抽象プ ラ ン関連づけ モ ー ド を 有効に し て い
る と き に showplan を 有効に す る と 、 showplan は次の文の showplan
出力の先頭に、 一致す る 抽象プ ラ ン の プ ラ ン ID を 表示 し ま す。
文 1 (1 行目 ) の ク エ リ ・ プ ラ ン。
Optimized using an Abstract Plan (ID : 832005995).
plan 句 を SQL 文に追加 し て ク エ リ を 実行す る と 、 showplan の出力
結果は次の よ う に な り ま す。
PLAN 句の Abstract Plan を使用 し て最適化 し ま し た。
noexec の使用
noexec モ ー ド では、 実際に ク エ リ を 実行せずに抽象プ ラ ン を 取得
で き ま す。 noexec モ ー ド を 有効に す る と 、 ク エ リ の最適化が行わ
れ、 抽象プ ラ ン が保存 さ れ ま すが、 ク エ リ の結果は返 さ れ ま
せん。
noexec モ ー ド を 使用 し て、 か つ抽象プ ラ ン を 取得す る に は、
noexec モ ー ド を 有効に す る 前に必要なプ ロ シ ー ジ ャ
(sp_add_qpgroup な ど ) と 他の set オプ シ ョ ン (set plan dump な ど )
を 実行 し ま す。 こ の ス テ ッ プ の典型的な例 を 示 し ま す。
sp_add_qpgroup pubs_dev
go
set plan dump pubs_dev on
go
set noexec on
350
Adaptive Server Enterprise
第 12 章
抽象プランの作成と使用
go
select type, sum(price) from titles group by type
go
fmtonly の使用
fmtonly set を 使用す る と 、 実際に ス ト ア ド ・ プ ロ シ ー ジ ャ を 実行 し
な く て も 、 ス ト ア ド ・ プ ロ シ ー ジ ャ でプ ラ ン を 取得す る た め の同
様の動作が得 ら れ ま す。
sp_add_qpgroup pubs_dev
go
set plan dump pubs_dev on
go
set fmtonly on
go
exec stored_proc(...)
go
forceplan の使用
set forceplan on が有効に な っ て い る セ ッ シ ョ ン で ク エ リ の関連づけ
を 有効に す る と 、 完全な抽象プ ラ ン を 使用 し て ク エ リ の最適化 を
行 う 場合に forceplan は無視 さ れ ま す。 部分プ ラ ン で ジ ョ イ ン順 を
完全に指定 し て い な い場合は、 次の よ う に な り ま す。
•
ま ず、 抽象プ ラ ン内の テーブルが指定に従 っ て順序付け ら
れる。
•
次に、 残 り の テーブルが from 句の指定 ど お り に順序付け ら
れる。
•
2 つ の テーブル ・ リ ス ト が結合 さ れ る 。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
351
サーバ全体での抽象プランの取得と関連づけモード
サーバ全体での抽象プランの取得と関連づけモード
シ ス テ ム管理者は、 サーバ全体に対 し て、 以下の設定パ ラ メ ー タ
を 使用 し てプ ラ ン の取得、 関連づけ、 お よ び置換モ ー ド を 有効に
で き ま す。
•
abstract plan dump - デ フ ォ ル ト の抽象プ ラ ン 取得グループ の
ap_stdout へ の ダ ン プ を 可能に す る 。
•
abstract plan load - デ フ ォ ル ト の抽象プ ラ ン ・ ロ ー ド ・ グルー
プ の ap_stdin か ら の ロ ー ド を 可能に す る 。
•
abstract plan replace - plan dump モ ー ド も 有効で あ れば、 プ ラ
ン の置換 を 有効に す る 。
•
abstract plan cache - 抽象プ ラ ン ・ ハ ッ シ ュ ID の キ ャ ッ シ ン グ
を 有効に す る 。 同時に abstract plan load も 有効に し て お く 必要
が あ る 。 詳細に つ い ては、 「set plan exists check オプ シ ョ ン」
(348 ペー ジ ) を 参照 し て く だ さ い。
デ フ ォ ル ト で、 上の設定パ ラ メ ー タ はすべて 0、 つ ま り 取得モ ー
ド と 関連づけ モ ー ド がオ フ に設定 さ れて い ま す。 いずれか の モ ー
ド を 有効に す る に は、 次の よ う に し てそ の設定値 を 1 に設定 し
ま す。
sp_configure "abstract plan dump", 1
サーバ全体に対 し て抽象プ ラ ン の各モ ー ド を 有効に し た場合、 動
的に切 り 換え が行われ る の で、 サーバ を 再起動す る 必要は あ り ま
せん。
サーバ全体に対 し て抽象プ ラ ン の取得お よ び関連づけ を 有効に す
る と 、 シ ス テ ム管理者は、 そ の サーバ上の すべて の ユーザの すべ
て の プ ラ ン を 取得で き ま す。 サーバ全体 を 対象 と し た モ ー ド を
セ ッ シ ョ ン ・ レ ベルで上書き す る こ と はで き ま せん。
352
Adaptive Server Enterprise
第 12 章
抽象プランの作成と使用
SQL によるプランの作成
ク エ リ の抽象プ ラ ン は、 次の方法で直接指定で き ま す。
•
create plan コ マ ン ド を 使用す る 。
•
plan 句 を select、 insert...select、 update、 delete、 return の各 コ マ
ン ド 、 お よ び if 句 と while 句に追加す る 。
プ ラ ン の記述方法に つ い ては、 「第 13 章 ク エ リ の抽象プ ラ ン の
ユーザーズ ・ ガ イ ド 」 を 参照 し て く だ さ い。
create plan の使用
create plan コ マ ン ド は、 ク エ リ の テキ ス ト と そ の ク エ リ 用に保存
す る 抽象プ ラ ン の指定に使用 し ま す。
次の例では、 抽象プ ラ ン を 作成 し ま す。
create plan
“select avg(price) from titles”
“(scalar_agg
(i_scan type_price_ix titles)
)”
こ の プ ラ ン は、 現在ア ク テ ィ ブ なプ ラ ン ・ グループ に保存 さ れ
ま す。 次の よ う に、 グループ名 を 指定す る こ と も で き ま す。
create plan
“select avg(price) from titles”
“(scalar_agg
(i_scan type_price_ix titles)
)”
into dev_plans
現在の プ ラ ン ・ グループ、 あ る い は指定 し た プ ラ ン ・ グループ
に、 すで に指定 し た ク エ リ 用の プ ラ ン が存在す る 場合は、 あ ら か
じ め replace モ ー ド を 有効に し て お か な い と 既存の プ ラ ン を 上書き
で き ま せん。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
353
SQL によるプランの作成
作成す る プ ラ ン の プ ラ ン ID を 確認す る に は、 create plan を 実行す
る と ID が変数 と し て返 さ れ ま す。 こ の変数は、 最初に宣言 し て
お く 必要が あ り ま す。 次の例では、 プ ラ ン ID が返 さ れ ま す。
create plan
“select avg(price) from titles”
“(scalar_agg
(i_scan type_price_ix titles)
)”
into dev_plans
and set @id
select @id
create plan を 使用す る と 、 そ の プ ラ ン の中の ク エ リ は実行 さ れ ま
せん。 こ れは次の こ と を 意味 し ま す。
•
ク エ リ の テキ ス ト の解析が行われな い た め、 そ の ク エ リ が
SQL 構文に準拠 し て い る か の チ ェ ッ ク が行われな い。
•
そ の プ ラ ン が抽象プ ラ ン構文に準拠 し て い る かチ ェ ッ ク が行
われな い。
•
そ の プ ラ ン が、 SQL テキ ス ト と 互換性が あ る かチ ェ ッ ク が行
われな い。
エ ラ ーや ト ラ ブルの発生 を 避け る に は、 showplan を 有効に し て指
定 し た ク エ リ を ただ ち に実行 し ま す。
plan 句の使用
plan 句 を 次の SQL 文で使用す る と 、 次の ク エ リ を 実行す る た め に
使用す る プ ラ ン を 指定で き ま す。
354
•
select
•
insert...select
•
delete
•
update
•
if
•
while
•
return
Adaptive Server Enterprise
第 12 章
抽象プランの作成と使用
次の例は、 ク エ リ を 実行す る た め に使用す る プ ラ ン を 指定 し て い
ま す。
select avg(price) from titles
plan
“(scalar_agg
(i_scan type_price_ix titles
)”
ク エ リ に抽象プ ラ ン を 指定す る と 、 そ の ク エ リ の実行に指定 し た
プ ラ ン が使用 さ れ ま す。 showplan を 有効に し て お く と 、 次の メ ッ
セ ー ジ が出力 さ れ ま す。
PLAN 句の Abstract Plan を使用 し て最適化 し ま し た。
ク エ リ に plan 句 を 使用す る と 、 SQL テキ ス ト の エ ラ ー、 プ ラ ン の
構文の エ ラ ー、 プ ラ ン と SQL テキ ス ト の誤 っ た組み合わせがエ
ラ ー と し て レ ポー ト さ れ ま す。 た と えば、 次の プ ラ ン では ク エ リ
に誤 っ た抽象プ ラ ン演算子が使用 さ れて い ま す。
/* wrong operator! */
select * from t1,t2
where c11 = c21
plan
“(union
(t_scan t1)
(t_scan t2)
)"
こ の プ ラ ン では次の メ ッ セ ー ジ が返 さ れ ま す。
Abstract Plan (AP) Warning: An error occurred while applying the AP:
(union (t_scan t1) (t_scan2))
to the SQL query:
select * from t1, t2
where c11 = c21
Failed to apply the top operator 'union' of the following AP fragment:
(union (t_scan t1) (t_scan t2))
The query contains no union that matches the 'union' AP operator at this point.
The following template can be used as a basis for a valid AP:
(also_enforce (join (also_enforce (scan t1)) (also_enforce (scan t2)))
)
The optimizer will complete the compilation of this query; the query will be
executed normally.
plan 句で指定 し たプ ラ ン は、 プ ラ ン の取得機能が有効な場合に の
み sysqueryplans に保存 さ れ ま す。 そ の ク エ リ の プ ラ ン がすで に現
在の取得グループ に あ る 場合は、 replace モ ー ド を 有効に し て既存
の プ ラ ン を 置換 し ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
355
SQL によるプランの作成
356
Adaptive Server Enterprise
第
1 3
章
クエリの抽象プランのユーザーズ・
ガイド
こ の章では、 抽象プ ラ ン を 記述す る 場合のガ イ ド ラ イ ン に つ い て
説明 し ま す。
トピック
概要
抽象プ ラ ン を記述す る た め の ヒ ン ト
ク エ リ ・ レ ベルで抽象プ ラ ン を使用す る
プ ラ ン の実行前後を比較す る
ス ト ア ド ・ プ ロ シ ー ジ ャ の抽象プ ラ ン
ア ド ホ ッ ク ・ ク エ リ と 抽象プ ラ ン
ページ
357
388
389
393
395
397
概要
抽象プ ラ ン では、 希望す る ク エ リ 実行プ ラ ン を 指定で き ま す。 抽
象プ ラ ン を 使 う と 、 セ ッ シ ョ ン レ ベルお よ び ク エ リ レ ベルの オプ
シ ョ ン を 使 っ て、 ジ ョ イ ン順 を 強制 し た り 、 イ ン デ ッ ク ス、 I/O
サ イ ズ、 ま た は ほ か の ク エ リ 実行オプ シ ョ ン を 指定す る 必要が あ
り ま せん。 セ ッ シ ョ ン レ ベルお よ び ク エ リ レ ベルの オプシ ョ ン に つ
い ては、 「第 12 章 抽象プ ラ ン の作成 と 使用」 を参照 し て く だ さ い。
最適化に必要な要素で、 set コ マ ン ド や ク エ リ ・ テキ ス ト に含ま
れ る 句で指定で き な い も の が い く つ か あ り ま す。 以下はそ の例
です。
•
NLJ、 MJ、 お よ び HJ の関係、 ま た は GroupSorted、
GroupHashing、 お よ び GroupInserting の関係の よ う な、 関係演
算子実装ア ルゴ リ ズ ム
•
サブ ク エ リ の付加
•
フ ラ ッ ト 化 さ れたサブ ク エ リ の ジ ョ イ ン順
•
再 フ ォ ー マ ッ ト 方式
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
357
概要
多 く の場合、 T-SQL コ マ ン ド を 発行 し て も 、 set コ マ ン ド を 含め
た り 、 ク エ リ ・ テキ ス ト を 変更 し た り す る こ と はで き ま せん。
抽象プ ラ ン を 使 う こ と に よ っ て、 オプテ ィ マ イ ザの決定に影響 を
与え る 、 よ り 優れた代替手段が提供 さ れ ま す。
抽象プ ラ ン は、 ク エ リ ・ テキ ス ト に含ま れな い関係代数式です。
こ れ ら は シ ス テ ム ・ カ タ ロ グ に格納 さ れ、 受け取 っ た ク エ リ の テ
キ ス ト に基づ い て、 ク エ リ に関連づけ ら れ ま す。
抽象プラン言語
抽象プ ラ ン言語に は、 以下の演算子 を 使用す る 関係代数が使われ
ま す。
•
distinct – 重複削除 を 表す論理演算子。
•
distinct_sorted – 使用可能な順序ベ ー ス の重複削除 を 表す物
理演算子。
•
•
distinct_sorting – ソ ー ト ベー ス の重複削除を表す物理演算子。
distinct_hashing – ハ ッ シ ン グベー ス の重複削除 を 表す物理
演算子。
•
group – ベ ク ト ル集合 を 表す論理演算子。
•
group_sorted – 使用可能な順序ベ ー ス の ベ ク ト ル集合 を 表
す物理演算子。
•
group_hashing – ハ ッ シ ン グベ ー ス の ベ ク ト ル集合 を 現す物
理演算子。
•
group_inserting – ク ラ ス タ ー ド ・ イ ン デ ッ ク ス挿入ベ ー ス
の ベ ク ト ル集合 を 表す物理演算子。
358
Adaptive Server Enterprise
第 13 章
•
クエリの抽象プランのユーザーズ・ガイド
join – ネ ス ト ループ ・ ジ ョ イ ン、 マ ー ジ ・ ジ ョ イ ン、 ま た は ハ ッ
シ ュ ・ ジ ョ イ ン を 使 っ た内部、 外部、 ま た は存在ジ ョ イ ン を 表
す、 一般的ジ ョ イ ン お よ び高 レ ベル論理ジ ョ イ ン演算子。
•
nl_join – すべて の内部、 外部、 お よ び存在ジ ョ イ ン を 含
む、 ネ ス ト ループ ・ ジ ョ イ ン を 指定す る 。
•
m_join – 内部ジ ョ イ ン お よ び外部ジ ョ イ ン を 含む、 マ ー ジ ・
ジ ョ イ ン を 指定す る 。
•
h_join – すべて の内部、 外部、 お よ び存在ジ ョ イ ン を 含む、
ハ ッ シ ュ ・ ジ ョ イ ン を 指定す る 。
•
union – 論理共用体演算子。 union お よ び union all SQL 構造体の
両方 を 表す。
•
append_union_all – union all を 実装す る 物理演算子。 子結果
セ ッ ト を 順次追加す る 。
•
merge_union_all – union all を 実装す る 物理演算子。 子単位で
順序付け し た射影のサブセ ッ ト に子結果セ ッ ト を マ ー ジ
し 、 そ の順序 を 保存す る 。
•
merge_union_distinct – union [distinct] を 実装す る 物理演算子。
マ ー ジ ベー ス の重複除去ア ルゴ リ ズム です。
•
hash_union_distinct – union [distinct] を 実装す る 物理演算子。
マ ー ジ ベー ス の重複除去ア ルゴ リ ズム です。
•
scalar_agg – ス カ ラ 集合 を 表す論理演算子。
•
scan – ロ ー の流れ形式で格納 さ れて い る テーブル を 抽象プ ラ
ン の抽出テーブル に変換す る 論理演算子。 ア ク セ ス ・ メ ソ ッ
ド を 制限 し な い部分プ ラ ン を 許可す る 。
•
i_scan – scan を 実装す る 物理演算子。 オプテ ィ マ イ ザに、
指定 さ れた テーブルで イ ン デ ッ ク ス ・ ス キ ャ ン を 行 う よ
う に指示す る 。
•
t_scan – scan を 実装す る 物理演算子。 オプテ ィ マ イ ザに、
指定 さ れた テーブルで完全な テーブル ・ ス キ ャ ン を 実行
す る よ う に指示す る 。
•
m_scan – scan を 実装す る 物理演算子。 オプテ ィ マ イ ザに、
index union、 index intersection、 ま た は両方 を 使用 し て、 指
定 し た テーブル に対 し て マルチ イ ン デ ッ ク ス ・ テーブル ・
ス キ ャ ン を 行 う よ う 指示す る 。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
359
概要
•
store – 抽象プ ラ ン の抽出テーブル を ス ト ア ド ・ ワ ー ク テーブ
ル に マ テ リ ア ラ イ ズす る こ と を 表す物理演算子。
•
store_index – 抽象プ ラ ン の抽出テーブル を ク ラ ス タ ー ド ・ イ ン
デ ッ ク ス ・ ス ト ア ド ・ ワ ー ク テーブル に マ テ リ ア ラ イ ズす る
こ と を 表す物理演算子。 オプテ ィ マ イ ザが有用な キー ・ カ ラ
ム を 選択す る 。
•
sort – 抽象プ ラ ン の抽出テーブルの ソ ー ト を 表す物理演算子。
オプテ ィ マ イ ザが有用な キー ・ カ ラ ム を 選択す る 。
•
nested – ネ ス ト し たサブ ク エ リ の配置 と 構造 を 表す フ ィ ル タ 。
•
xchg – 抽象プ ラ ン の抽出テーブル を す ぐ に再分割す る こ と を
表す物理演算子。 抽象プ ラ ン で目標値 を 設定 し て も 、 オプ
テ ィ マ イ ザが有用な分割 を 選択 し ま す。
以下の抽象プ ラ ン の キー ワ ー ド はグループ化や識別に利用 し
ま す。
•
sequence – シ ー ケ ン ス が複数の ス テ ッ プ を 必要 と す る 場合に
要素 を グループ化す る 。
•
hints – 部分プ ラ ン の ヒ ン ト の セ ッ ト を グループ化す る 。
•
prop – prefetch、 lru|mru、 お よ び parallel の よ う な、 テーブルの検
索プ ロ パテ ィ の セ ッ ト を 提示す る 。
•
table – サブ ク エ リ ま た は ビ ュ ーで相関名 を 使用 し た場合の
テーブル を 識別す る 。
•
work_t – ワ ー ク テーブル を 識別す る 。
•
in – table と 併用 し 、 サブ ク エ リ (subq) ま た は ビ ュ ー (view) で名
前 を 付け た テーブル を 識別す る 。
•
subq – ネ ス ト し た演算子の下で使用 さ れ、 ネ ス ト し たサブ ク
エ リ の ア タ ッ チ メ ン ト ・ ポ イ ン ト を 指示 し た り 、 サブ ク エ リ
の抽象プ ラ ン を 提示 し た り す る 。
g_join の よ う な従来の抽象プ ラ ン演算子はすべて、 対応す る 新 し
い演算子の代わ り に使用で き ま す。
360
Adaptive Server Enterprise
第 13 章
クエリの抽象プランのユーザーズ・ガイド
クエリ、アクセス・メソッド、抽象プラン
個々の テーブルでは、 特定の ク エ リ へ ア ク セ ス す る 方法は、 い く
つ か の イ ン デ ッ ク ス を 使用す る イ ン デ ッ ク ス ・ ス キ ャ ン 、 テーブ
ル ・ ス キ ャ ン、 OR 方式、 再 フ ォ ー マ ッ ト な ど が あ り ま す。
次の簡単な ク エ リ では ア ク セ ス ・ メ ソ ッ ド を い く つ か選択 し
ま す。
select * from t1
where c11 > 1000 and c12 < 0
以下の抽象プ ラ ン は 3 つ の異な る ア ク セ ス ・ メ ソ ッ ド を 指定 し
ま す。
•
i_c11 を 使用 :
(i_scan i_c11 t1)
•
i_c12 を 使用 :
(i_scan i_c12 t1)
•
フ ル ・ テーブル ・ ス キ ャ ン を 実行 :
(t_scan t1)
•
マルチ ス キ ャ ン、 すな わ ち 、 複雑な句 ( こ の例では最 も 複雑
な ク エ リ ) を 使 っ て、 テーブルの い く つ か の イ ン デ ッ ク ス の
共用体ま た は積 を 実行 し ま す。
select * from t1
where (c11 > 1000 or c12 < 0) and (c12 > 1000 or c112 < 0)
plan
“(m_scan t1)”
抽象プ ラ ン に は、 ク エ リ に オプテ ィ マ イ ザの すべて の選択肢 を 指
定す る 完全プ ラ ン と 、 ク エ リ で 1 つ の テーブル に使用す る イ ン
デ ッ ク ス な ど のサブセ ッ ト の選択 を 指定す る が、 テーブルの ジ ョ
イ ン順は指定 し な い よ う な部分プ ラ ン が あ り ま す。 た と えば、 部
分抽象プ ラ ン を 使用す る と 、 フ ル ・ テーブル ・ ス キ ャ ン を 行 う の
では な く 、 上記の ク エ リ が イ ン デ ッ ク ス を い く つ か使い、 オプ
テ ィ マ イ ザに、 i_c11 か i_c12 の いずれか を 選択 さ せ る よ う に指定
す る こ と がで き ま す。 イ ン デ ッ ク ス名の代わ り に、 次の よ う に空
の カ ッ コ を 使用 し ま す。
(i_scan () t1)
さ ら に、 ク エ リ は 2K ま た は 16K の いずれか の I/O を 使用で き、
逐次 ま た は並列で実行で き ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
361
概要
抽出テーブル
抽出テーブルは ク エ リ 式の評価に よ っ て定義 さ れ ま す。 こ れは、
シ ス テ ム ・ カ タ ロ グ に も 記述 さ れず、 デ ィ ス ク に も 格納 さ れな い
と い う 点で、 通常の テーブル と は異な り ま す。 Adaptive Server で
は、 抽出テーブルは、 SQL 抽出テーブル の場合 と 、 抽象プ ラ ン の
抽出テーブルの場合が あ り ま す。
•
SQL 抽出テーブル - ク エ リ 式の評価に よ っ て、 1 つ以上の
テーブル に基づ い て定義 さ れ る 。 SQL 抽出テーブルは定義 さ
れた ク エ リ 式の中で使用 さ れ、 ク エ リ の実行中の み存在 し
ま す。 『Transact-SQL ユーザーズ ・ ガ イ ド 』 を 参照 し て く だ
さ い。
•
抽象プ ラ ン の抽出テーブル - ク エ リ の処理、 最適化、 実行の
過程で使用 さ れ る 抽出テーブル。 抽象プ ラ ン の抽出テーブル
は抽象プ ラ ン の一部で あ り 、 エ ン ド ・ ユーザに は表示 さ れな
い点で、 SQL 抽出テーブル と 異な り ま す。
テーブルの識別
抽象プ ラ ン では、 抽象プ ラ ン の中で名前 を 付け た テーブル を SQL
ク エ リ 内の テーブルの オ カ レ ン ス に リ ン ク で き る よ う に、 ク エ リ
の テーブルの すべて に明確に名前 を 付け る 必要が あ り ま す。 ほ と
ん ど の場合、 必要な の はテーブル名だけ です。 ク エ リ がデー タ
ベー ス と 所有者名 を 使用 し てテーブル名 を 修飾 し て い る 場合は、
抽象プ ラ ン でテーブル を 完全に識別す る た め に こ の 2 つ の要素 も
必要です。 た と えば、 次の例では修飾 さ れて い な い テーブル名が
使用 さ れて い ま す。
select * from t1
抽象プ ラ ン は修飾 さ れて い な い名前 も 使用 し ま す (t_scan t1)。 ク エ
リ に デー タ ベー ス名ま た はオー ナ ー名 を 使用す る 場合は次の よ う
に な り ま す。
select * from pubs2.dbo.t1
抽象プ ラ ン では修飾 を 使用す る 必要が あ り ま す (t_scan
pubs2.dbo.t1)。 ただ し 、 こ の例に示す よ う に、 一つ の ク エ リ に
同 じ テーブルが何度 も 現れ る こ と が あ り ま す。
select * from t1 a, t1 b
362
Adaptive Server Enterprise
第 13 章
クエリの抽象プランのユーザーズ・ガイド
上記の例で、 相関名 a お よ び b は、 SQL 内の 2 つ の テーブル を 表
し て い ま す。 抽象プ ラ ン では、 次の よ う に、 table 演算子に よ っ て
各相関名 を そ の つ ど テーブル に関連づけ ま す。
(join
(t_scan (table (a t1)))
(t_scan (table (b t1)))
)
相関名の み を 使用 し て、 よ り 短い抽象プ ラ ン を 使用す る こ と も で
き ま す。
(join
(t_scan a)
(t_scan b)
)
ビ ュ ー と サブ ク エ リ の中でテーブル名が あ い ま い な こ と が あ り
ま す。 そ の よ う な場合に も table 演算子 を ビ ュ ー と サブ ク エ リ で
テーブルの識別に使用す る こ と がで き ま す。
サブ ク エ リ では、 in と subq 演算子が、 サブ ク エ リ に よ る 構文的な
包含関係でテーブル名 を 修飾 し ま す。 次の例では、 同 じ テーブル
が外部 ク エ リ と サブ ク エ リ に使用 さ れて い ま す。
select *
from t1
where c11 in (select c12 from t1 where c11 > 100)
抽象プ ラ ン はテーブル を 明確に識別 し ま す。
(join
(t_scan t1)
(i_scan i_c11_c12 (table t1 (in (subq 1))))
)
ビ ュ ーでは、 in と view 演算子が識別 を 行い ま す。 次の例の ク エ
リ は、 ビ ュ ーで使用 さ れ る テーブル を 参照 し ま す。
create view v1
as
select * from t1 where c12 > 100
select t1.c11 from t1, v1
where t1.c12 = v1.c11
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
363
概要
次に抽象プ ラ ン を 示 し ま す。
(join
(t_scan t1)
(i_scan i_c12 (table t1 (in (view v1))))
)
Adaptive Server で生成 さ れた抽象プ ラ ン では、 名前の あ い ま い さ
を な く す必要が あ る テーブル に つ い て の み、 ビ ュ ー ま た はサブ ク
エ リ で修飾 し た テーブル名が生成 さ れ ま す。 そ の他の テーブル に
つ い ては、 名前だけが生成 さ れ ま す。
ユーザーが作成 し た抽象プ ラ ン では、 あ い ま い な場合に ビ ュ ー ま
た はサブ ク エ リ で修飾 し た テーブル名が必要ですが、 それ以外で
は両方の構文が受け付け ら れ ま す。
インデックスの識別
i_scan 演算子は、 次に示す よ う に、 イ ン デ ッ ク ス名 と テーブル名
の 2 つ の オ ペ ラ ン ド が必要です。
(i_scan i_c12 t1)
イ ン デ ッ ク ス を 指定 し な い で、 何か イ ン デ ッ ク ス が必要で あ る こ
と を 指定す る に は、 イ ン デ ッ ク ス名の代わ り に空の カ ッ コ を 使用
し ま す。
(i_scan () t1)
ジョイン順の指定
Adaptive Server は、 3 つ以上の テーブルの ジ ョ イ ン では、 2 つ の
テーブル を ジ ョ イ ン し 、 次に そ の ジ ョ イ ン か ら 、 抽象プ ラ ン の抽
出テーブル を 次の ジ ョ イ ン 順の テーブル に ジ ョ イ ン し ま す。 こ の
抽象プ ラ ン の抽出テーブルは、 ク エ リ の実行で前に あ る ネ ス ト
ループ ・ ジ ョ イ ン か ら の も の と 同様に、 ロ ー の流れです。
次の ク エ リ では 3 つ の テーブル を ジ ョ イ ン し て い ま す。
select *
from t1, t2, t3
where c11 = c21
and c12 = c31
and c22 = 0
and c32 = 100
364
Adaptive Server Enterprise
第 13 章
クエリの抽象プランのユーザーズ・ガイド
次の例では、 ジ ョ イ ン演算子 を 使用 し て、 ジ ョ イ ン ・ ア ルゴ リ ズ
ム の バ イ ナ リ 性 を 示 し ま す。 こ の プ ラ ン は、 ジ ョ イ ン順 と し て t2、
t1、 t3 を 指定 し ま す。
(join
(join
(scan t2)
(scan t1)
)
(scan t3)
)
t2-t1 ジ ョ イ ン の結果は、 次に t3 に ジ ョ イ ン さ れ ま す。 こ の例の
scan 演算子は、 テーブル ・ ス キ ャ ン ま た は イ ン デ ッ ク ス ・ ス キ ャ
ン の選択 を オプテ ィ マ イ ザに委ね ま す。
ジョインの省略形の表記
一般的に は、 深 さ が N 段で順序が t1、 t2、 t3..., tN-1、 tN の ネ ス ト ・
ループ ・ ジ ョ イ ン は次の よ う に記述 さ れ ま す。
(join
(join
...
(join
(join
(scan t1)
(scan t2)
)
(scan t3)
)
...
(scan tN-1)
)
(scan tN)
)
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
365
概要
こ の表記は、 nl_join 演算子 を 使用す る と 、 次の よ う に短 く で き
ま す。
(nl_join
(scan
(scan
(scan
...
(scan
(scan
)
t1)
t2)
t3)
tN-1)
tN)
ジョイン順の例
オプテ ィ マ イ ザは、 次の 3 方向の ジ ョ イ ン ・ ク エ リ に対す る プ ラ
ン を い く つ か の プ ラ ン か ら 選択で き ま す。
select *
from t1, t2, t3
where c11 = c21
and c12 = c31
and c22 = 0
and c32 = 100
以下に例 を い く つ か示 し ま す。
•
c22 を t2 に対す る 探索引数 と し 、 c11 で t1 に ジ ョ イ ン し 、 最後
に c31 で t3 に ジ ョ イ ン す る 。
(nl_join
(i_scan i_c22 t2)
(i_scan i_c11 t1)
(i_scan i_c31 t3)
)
•
t3 に対す る 探索引数 を 使用 し 、 ジ ョ イ ン順 を t3、 t1、 t2
と する。
(nl_join
(i_scan i_c32 t3)
(i_scan i_c12 t1)
(i_scan i_c21 t2)
)
366
Adaptive Server Enterprise
第 13 章
•
クエリの抽象プランのユーザーズ・ガイド
t2 がキ ャ ッ シ ュ に収ま る 程度に小 さ い場合は、 ジ ョ イ ン順は
t3、 t1、 t2 の ま ま で、 それ を フ ル ・ テーブル ・ ス キ ャ ン す る 。
(nl_join
(i_scan i_c32 t3)
(i_scan i_c12 t1)
(t_scan t2)
)
•
t1 が非常に大き く 、 t2 と t3 は個別に は t1 の大部分 を 満たすが、
両方の条件 を 満たす部分が小 さ い場合は、 こ の プ ラ ン は
STAR ジ ョ イ ン を 指定す る 。
(nl_join
(i_scan i_c22 t2)
(i_scan i_c32 t3)
(i_scan i_c11_c12 t1)
)
ジ ョ イ ン 演算子は、 内部 ジ ョ イ ン 、 外部ジ ョ イ ン、 存在ジ ョ イ ン
の いずれ も 実行で き る と い う 点で汎用的ですが、 適切な ジ ョ イ ン ・
セ マ ン テ ィ ッ ク は ク エ リ ・ セ マ ン テ ィ ッ ク に 従 っ て、 オ プ テ ィ マ
イ ザが選択 し ま す。
実行方法と抽象プランの照合
ク エ リ の種類に よ っ て、 ジ ョ イ ン順 と ジ ョ イ ン の種類に い く つ
か の制約が あ り ま す。 例 と し て次の よ う な外部ジ ョ イ ン が あ り
ま す。
select *
from t1 left join t2
on c11 = c21
Adaptive Server に は、 ジ ョ イ ン処理時に外部テーブル と な る 、 外
部ジ ョ イ ン の外部 メ ン バーが必要です。 そ の た め、 次の抽象プ ラ
ン は無効です。
(join
(scan t2)
(scan t1)
)
こ の プ ラ ン を 使用 し よ う と す る と エ ラ ー ・ メ ッ セー ジ が表示 さ れ
て AP ア プ リ ケ ー シ ョ ン がエ ラ ー に な り 、 オプテ ィ マ イ ザは ク エ
リ の コ ン パ イ ル を 終了 さ せ る た め の最良の方法 を 試み ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
367
概要
ビューを使用してクエリにジョイン順を指定する
抽象プ ラ ン を 使用 し て、 結合 さ れ る ビ ュ ー の ジ ョ イ ン 順 を 設定で
き ま す。 次の例では、 t2 と t3 の ジ ョ イ ン を 実行す る ビ ュ ー を 作成
し ま す。
create view v2
as
select *
from t2, t3
where c22 = c32
次の ク エ リ は、 ビ ュ ーで t2 と の ジ ョ イ ン を 実行 し ま す。
select * from t1, v2
where c11 = c21
and c22 = 0
こ の抽象プ ラ ン は、 ジ ョ イ ン順 と し て t2、 t1、 t3 を 指定 し ま す。
(nl_join
(scan t2)
(scan t1)
(scan t3)
)
テーブル名が あ い ま い では な い の で、 ビ ュ ー の修飾は必要あ り ま
せん。 ただ し 、 以下の抽象プ ラ ン も 正 し く 、 同 じ 意味 を 持 ち ま す。
(nl_join
(scan (table t2(in(view v2))))
(scan t1)
(scan (table t3 (in (view v2))))
)
次の例では、 ビ ュ ーで t3 に ジ ョ イ ン し ま す。
select * from t1, v2
where c11 = c31
and c32 = 100
次の プ ラ ン は、 ジ ョ イ ン順 と し て t3、 t1、 t2 を 指定 し ま す。
(join
(scan t3)
(scan t1)
(scan t2)
)
こ れは、 set forceplan を 使用で き な い と き に、 ク エ リ に ジ ョ イ ン順
を 指定す る た め に、 必要に応 じ て抽象プ ラ ン を 使用す る 例です。
368
Adaptive Server Enterprise
第 13 章
クエリの抽象プランのユーザーズ・ガイド
ジョイン型の指定
Adaptive Server は ネ ス ト ループ ・ ジ ョ イ ン、 マ ー ジ ・ ジ ョ イ ン、 ま
た は ハ ッ シ ュ ・ ジ ョ イ ン を 実行で き ま す。 ジ ョ イ ン演算子は、 コ ス
ト ・ ベ ー ス の最良の ジ ョ イ ン ・ ア ルゴ リ ズ ム の選択 を オ プ テ ィ マ
イ ザに委ね ま す。 ネ ス ト ループ ・ ジ ョ イ ン を 指定す る に は、 nl_join
演算子 を 、 マ ー ジ ・ ジ ョ イ ン に は m_join 演算子 を 、 ハ ッ シ ュ ・ ジ ョ
イ ン に は h_join 演 算 子 を そ れ ぞ れ 使 用 し て く だ さ い。 Adaptive
Server が取得す る 抽象プ ラ ン に は、 ジ ョ イ ン演算子では な く 、 常に
ア ルゴ リ ズ ム を 指定す る 演算子が含ま れ ま す。
次の ク エ リ は、 t1 と t2 の ジ ョ イ ン を 指定 し て い ま す。
select * from t1, t2
where c12 = c21 and c11 = 0
次の抽象プ ラ ン は、 ネ ス ト ループ ・ ジ ョ イ ン を 指定 し て い ま す。
(nl_join
(i_scan i_c11 t1)
(i_scan i_c21 t2)
)
こ の ネ ス ト ループ ・ プ ラ ン は、 search 句 を 使用 し て検索 を 制限す
る た め に イ ン デ ッ ク ス i_c11 を 使用 し 、 次に ジ ョ イ ン ・ カ ラ ム を
イ ン デ ッ ク ス と し て t2 の ジ ョ イ ン を 実行 し ま す。
次の マ ー ジ ・ ジ ョ イ ン ・ プ ラ ン では別々の イ ン デ ッ ク ス を 使用 し
て い ま す。
(m_join
(i_scan i_c12 t1)
(i_scan i_c21 t2)
)
こ の マ ー ジ ・ ジ ョ イ ン は、 マ ー ジ ・ キー と し て、 i_c12 と i_c21 の 2
つ の ジ ョ イ ン ・ カ ラ ム の イ ン デ ッ ク ス を 使用 し ま す。 こ の ク エ リ
は完全な マ ー ジ ・ ジ ョ イ ン を 実行 し 、 ソ ー ト は必要あ り ま せん。
マ ー ジ ・ ジ ョ イ ン では、 一致す る ロ ー の み を 選択す る た め に i_c11
を イ ン デ ッ ク ス と し て使用す る こ と も で き ま すが、 こ の場合は必
要な順序 を 確保す る た め に ソ ー ト が必要 と な り ま す。
(m_join
(sort
(i_scan i_c11 t1)
)
(i_scan i_c21 t2)
)
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
369
概要
最後に、 こ の プ ラ ン がハ ッ シ ュ ・ ジ ョ イ ン と 内部に対す る フ ル ・
テーブル ・ ス キ ャ ン を 行い ま す。
(h_join
(i_scan i_c11 t1)
(t_scan t2)
)
部分プランとヒントの指定
フ ル ・ プ ラ ン は不必要の場合が あ り ま す。 た と えば、 ク エ リ ・ プ
ラ ン の唯一の問題点が、 オプテ ィ マ イ ザは ノ ン ク ラ ス タ ー ド ・ イ
ン デ ッ ク ス を 使用す る 代わ り に テーブル ・ ス キ ャ ン を 選択す る こ
と で あ る 場合、 抽象プ ラ ン は イ ン デ ッ ク ス の選択の み を 指定 し 、
そ の ほ か の判断はオプテ ィ マ イ ザに委ね る こ と がで き ま す。
オプテ ィ マ イ ザは、 次の ク エ リ に i_c31 を 使用す る 代わ り に、
t3 の テーブル ・ ス キ ャ ン を 選択す る こ と も で き ま す。
select *
from t1, t2, t3
where c11 = c21
and c12 < c31
and c22 = 0
and c32 = 100
オプテ ィ マ イ ザに よ っ て生成 さ れた次の プ ラ ン は、 t2、 t1、 t3 の
ジ ョ イ ン順 を 指定 し ま す。 ただ し 、 プ ラ ン は t3 の テーブル ・
ス キ ャ ン を 指定 し ま す。
(nl_join
(i_scan i_c22 t2)
(i_scan i_c11 t1)
(t_scan t3)
)
こ の フ ル ・ プ ラ ン は、 次の よ う に i_c31 を 使用す る よ う に変更す
る こ と も で き ま す。
(nl_join
(i_scan i_c22 t2)
(i_scan i_c11 t1)
(i_scan i_c31 t3)
)
370
Adaptive Server Enterprise
第 13 章
クエリの抽象プランのユーザーズ・ガイド
ただ し 、 部分抽象プ ラ ン の み を 指定す る 方が、 解決法 と し て よ り
柔軟性が あ り ま す。 そ の ク エ リ の ほ か の テーブルのデー タ が変化
す る の に従 っ て、 最適な ジ ョ イ ン順が変化す る 可能性が あ り ま
す。 部分プ ラ ン では、 1 つ の部分プ ラ ン項目 し か指定で き ま せん。
t3 の イ ン デ ッ ク ス ・ ス キ ャ ン に つ い て の部分プ ラ ン は、 次の よ う
に す る だけです。
(i_scan i_c31 t3)
t1 と t2 の ジ ョ イ ン順 と ア ク セ ス ・ メ ソ ッ ド はオプテ ィ マ イ ザが選
択 し ま す。
抽象プ ラ ン は、 物理演算子の代わ り に論理演算子 を 使用す る と 部
分的に な り ま す。 た と えば、 次の抽象プ ラ ン は、 ク エ リ 全体 を 対
象 と し て い る に も か か わ ら ず部分的です。 と い う の も 、 こ の プ ラ
ン はオプテ ィ マ イ ザに ジ ョ イ ン ・ ア ルゴ リ ズ ム と ア ク セ ス ・ メ
ソ ッ ド を 選択 さ せて い る か ら です。
(join
(scan t1)
(scan t2)
(scan t3)
)
抽象プ ラ ン のルー ト が ク エ リ の一部の み を 対象に す る と い う 点で
は、 部分プ ラ ン が最初か ら 不完全で あ る 場合 も あ り ま す。 こ の よ
う な場合、 オプテ ィ マ イ ザがプ ラ ン を 完了 さ せ ま す。
(nl_join
(t_scan t1)
(t_scan t2)
)
し か し 、 抽象プ ラ ン内の プ ラ ン ・ フ ラ グ メ ン ト は、 細部ま で完成
さ せ る 必要が あ り ま す。 た と えば、 次の よ う な “ な に か の外側に あ
る t1 に ハ ッ シ ュ ・ ジ ョ イ ン す る ” と 解釈で き る 抽象プ ラ ン は不正
です。
(h_join
(t_scan t1)
()
)
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
371
概要
複数ヒントをグループ化する
複数の プ ラ ン ・ フ ラ グ メ ン ト が必要に な る 場合が よ く あ り ま す。
た と えば、 ク エ リ の各テーブル に特定の イ ン デ ッ ク ス を 使用す る
よ う に指定 し 、 ジ ョ イ ン順はオプテ ィ マ イ ザに委ね る 場合な ど で
す。 複数の ヒ ン ト が必要な場合、 hints 演算子 を 使 っ てそれ ら を グ
ループ化す る こ と がで き ま す。
(hints
(i_scan () t1)
(i_scan () t2)
(i_scan () t3)
)
こ の場合、 hints 演算子は単に構文上必要なだけで、 ス キ ャ ン の順
序に は影響 を 与え ま せん。
何 を ヒ ン ト と し て使用で き る か に つ い ては特に決ま り は あ り ま せ
ん。 部分的な ジ ョ イ ン順は、 部分的な ア ク セ ス ・ メ ソ ッ ド と 混在
し て も か ま い ま せん。 こ の ヒ ン ト は、 ジ ョ イ ン順で t2 が t1 の外側
に あ り 、 t3 の ス キ ャ ン が イ ン デ ッ ク ス を 使用す る べ き で あ る こ と
を 示 し て い ま すが、 オプテ ィ マ イ ザは、 t3 の イ ン デ ッ ク ス、 t1 お
よ び t2 の ア ク セ ス ・ メ ソ ッ ド 、 お よ び ジ ョ イ ン順で の t3 の配置 を
選択で き ま す。
(hints
(join
(scan t2)
(scan t1)
)
(i_scan () t3)
)
372
Adaptive Server Enterprise
第 13 章
クエリの抽象プランのユーザーズ・ガイド
ヒントを使用する整合性のない無効なプラン
次の プ ラ ン の よ う に、 矛盾す る ジ ョ イ ン順 を 指定す る ヒ ン ト を
使用 し た結果、 整合性の な い プ ラ ン と な っ て し ま う こ と も あ り
ま す。
(hints
(join
(scan
(scan
)
(join
(scan
(scan
)
)
t2)
t1)
t1)
t2)
こ の プ ラ ン と 関連づけ さ れて い る ク エ リ を 実行す る と 、 ク エ リ の
コ ン パ イ ル に失敗 し 、 エ ラ ーが発生 し ま す。
ほ か の整合性の な い ヒ ン ト では例外が発生 し な い か も し れ ま せん
が、 指定 し た ア ク セ ス ・ メ ソ ッ ド は、 ど れ も 使用 さ れ る 可能性が
あ り ま す。 次の プ ラ ン は、 同 じ テーブル に イ ン デ ッ ク ス ・ ス キ ャ
ン と テーブル ・ ス キ ャ ン を 指定 し ま す。
(hints
(t_scan t3)
(i_scan () t3)
)
こ の場合、 ど ち ら の ア ク セ ス ・ メ ソ ッ ド も 選択 さ れ る 可能性が あ
る た め、 動作は不定に な り ま す。
サブクエリの抽象プランの作成
サブ ク エ リ は Adaptive Server に よ り い く つ か の方法で解析 さ れ、
抽象プ ラ ン に は次の ク エ リ 実行ス テ ッ プが反映 さ れ ま す。
•
マ テ リ ア ラ イ ズ - サブ ク エ リ が実行 さ れ、 結果が ワ ー ク テー
ブル ま た は内部変数に格納 さ れ る 。 詳細に つ い ては、 「実体化
さ れたサブ ク エ リ 」 (374 ペ ー ジ ) を 参照 し て く だ さ い。
•
フ ラ ッ ト 化 - ク エ リ が フ ラ ッ ト 化 さ れ、 メ イ ン ・ ク エ リ の
テーブル と ジ ョ イ ン さ れ る 。 詳細に つ い ては、 「サブ ク エ リ の
フ ラ ッ ト 化」 (374 ペ ー ジ ) を 参照 し て く だ さ い。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
373
概要
•
ネ ス テ ィ ン グ - サブ ク エ リ は外部 ク エ リ ・ ロ ー ご と に一度
実行 さ れ る 。 詳細に つ い ては、 「ネ ス ト さ れたサブ ク エ リ 」
(376 ペ ー ジ ) を 参照 し て く だ さ い。
抽象プ ラ ン では、 基本的なサブ ク エ リ の解決方法 を 選択す る こ と
はで き ま せん。 こ の選択はルール に基づ い て決定 さ れ、 ク エ リ の
最適化中に は変更で き ま せん。 し か し 、 抽象プ ラ ン を 外部お よ び
内部 ク エ リ に あ る プ ラ ン を 変更す る た め に使用で き ま す。 ネ ス ト
さ れたサブ ク エ リ では、 抽象プ ラ ン を 使用 し て、 そ のサブ ク エ リ
を 外部 ク エ リ の ど こ に ネ ス ト す る か も 指定で き ま す。
実体化されたサブクエリ
次の ク エ リ に は、 実体化可能な非相関サブ ク エ リ が含ま れ ま す。
select *
from t1
where c11 = (select count(*) from t2)
こ の抽象プ ラ ン の最初の ス テ ッ プでは、 サブ ク エ リ で ス カ ラ 集合
関数 を 実体化 し ま す。 2 番目の ス テ ッ プでは結果 を 使用 し て t1 を
ス キ ャ ン し ま す。
( sequence
(scalar_agg
(i_scan i_c21 t2)
)
(i_scan i_c11 t1)
)
サブクエリのフラット化
サブク エ リ の 中に は、 ジ ョ イ ン に フ ラ ッ ト 化で き る も の も あ り ま
す。 ジ ョ イ ン 、 nl_join、 m_join、 お よ び h_join 演算子は 、 い つ 存在
ジ ョ イ ン が必要と な る か の 判断を オ プテ ィ マ イ ザに 委ねま す。 た
と え ば、 次の ク エ リ は exists で 説明し た サブク エ リ が含ま れて い
ま す。
select * from t1
where c12 > 0
and exists (select * from t2
where t1.c11 = c21 and c22 < 100)
374
Adaptive Server Enterprise
第 13 章
クエリの抽象プランのユーザーズ・ガイド
ク エ リ の セ マ ン テ ィ ッ ク に よ れば、 t1 と t2 の存在ジ ョ イ ン が必要
と な り ま す。 ジ ョ イ ン順 t1、 t2 はオプテ ィ マ イ ザに よ っ て セ ミ
ジ ョ イ ン と 解釈 さ れ、 条件 を 満たす t1 の ロ ー ご と に、 最初に一致
し た t2 の ロ ーで t2 の ス キ ャ ン が停止 し ま す。
(join
(scan t1)
(scan t2)
)
t2、 t1 の ジ ョ イ ン順は、 重複部分 を 確実に削除す る ほ か の手段が
必要です。
(join
(distinct
(scan t2)
)
(scan t1)
)
こ の抽象プ ラ ン を 使用す る と 、 オプテ ィ マ イ ザは以下の使用 を 決
定で き ま す。
•
ユニー ク ・ イ ン デ ッ ク ス が あ る 場合は、 t2.c21 に、 通常の ジ ョ
イ ン でユニー ク ・ イ ン デ ッ ク ス を 作成す る 。
•
ユニー ク ・ イ ン デ ッ ク ス がな い場合、 ユニー ク な再 フ ォ ー
マ ッ ト 方式。 こ の場合、 ク エ リ は c22 に対す る イ ン デ ッ ク ス を
使用 し て ワ ー ク テーブルへ の ロ ー を 選択す る 可能性が あ り
ま す。
•
重複削除 ソ ー ト 最適化方式。 通常の ジ ョ イ ン を 実行 し 、 そ の
結果 を 選択 し て ワ ー ク テーブル に入れた後、 ワ ー ク テーブル
を ソ ー ト する。
抽象プ ラ ン では、 最後の 2 つ の オプ シ ョ ン に必要な ワ ー ク テーブ
ルの作成 と ス キ ャ ン を 指定す る 必要が あ り ま せん。
フラット化されたサブクエリでジョイン順を変更する例
次の よ う に、 ク エ リ は フ ラ ッ ト 化 し て存在ジ ョ イ ン に す る こ と が
で き ま す。
select *
from t1, t2
where c11 = c21
and c21 > 100
and exists (select * from t3 where c31 != t1.c11)
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
375
概要
“!=” の相関 を 使用 し て t3 を ス キ ャ ン す る と か な り 高 コ ス ト に な
る 可能性が あ り ま す。 ジ ョ イ ン順が t1、 t2 の場合、 ジ ョ イ ン順で t3
の最適な配置場所は、 t1 と t2 を ジ ョ イ ン し た結果、 ロ ー の数が増
加す る か、 減少す る か に よ っ て異な る た め、 コ ス ト の高い テーブ
ル ・ ス キ ャ ン を 実行 し な ければな ら な い回数に よ っ て決ま り ま
す。 オプテ ィ マ イ ザが t3 の正 し い ジ ョ イ ン位置 を 見つ け ら れな い
場合は、 ジ ョ イ ン に よ り t3 を ス キ ャ ン し な ければな ら な い回数が
減少す る 場合に次の抽象プ ラ ン を 使用で き ま す。
(nl_join
(scan t1)
(scan t2)
(scan t3)
)
ジ ョ イ ン に よ り t3 を ス キ ャ ン し な ければな ら な い回数が増加す
る と 、 こ の抽象プ ラ ン は ジ ョ イ ン の前に t3 の ス キ ャ ン を 実行 し
ま す。
(nl_join
(scan t1)
(scan t3)
(scan t2)
)
ネストされたサブクエリ
ネ ス ト さ れたサブ ク エ リ は、 次の場合に、 抽象プ ラ ン で明示的に
記述で き ま す。
•
そ の サブ ク エ リ の抽象プ ラ ン を 提供す る 。
•
メ イ ン ・ ク エ リ に そ のサブ ク エ リ を 付加す る ロ ケ ー シ ョ ン を
指定す る 。
抽象プ ラ ン を 使用す る と 、 サブ ク エ リ の ク エ リ ・ プ ラ ン に影響 を
与え、 外部 ク エ リ でサブ ク エ リ の付加ポ イ ン ト を 変更で き ま す。
nested 演算子は、 外部 ク エ リ で の サブ ク エ リ の位置 を 指定 し ま す。
サブ ク エ リ は、 特定の抽象プ ラ ン の抽出テーブル に対 し て 「ネ ス
ト 」 さ れ ま す。 オプテ ィ マ イ ザは、 そ の外部 ク エ リ の すべて の相
関カ ラ ム を 利用で き る 場所、 お よ びサブ ク エ リ の実行回数が最 も
少な く て済む と 予想 さ れ る 位置 を 選択 し ま す。
次の SQL 文に は相関式のサブ ク エ リ が含ま れて い ま す。
select *
from t1, t2
376
Adaptive Server Enterprise
第 13 章
クエリの抽象プランのユーザーズ・ガイド
where c11 = c21
and c21 > 100
and c12 = (select c31 from t3
where c32 = t1.c11)
次の抽象プ ラ ン は t1 の ス キ ャ ン に ネ ス ト し たサブ ク エ リ を 示 し て
い ま す。
(nl_join
(nested
(i_scan i_c12 t1)
(subq
(scalar_agg
(scan t3)
)
)
)
(i_scan i_c21 t2)
)
集合に つ い ては 「第 2 章 showplan の使用」 で説明 し て い ま す。
すべて の抽象プ ラ ン は、 それが部分プ ラ ン で あ っ て も 、 細部ま で
完全で あ る 必要が あ る の で、 scalar_agg 抽象プ ラ ン 演算子が必要
です。
サブクエリの識別と付加
SQL ク エ リ のサブ ク エ リ は、 基本テーブル を 使用 し た抽象プ ラ ン
のサブ ク エ リ と 競合 し ま す。 テーブルが明確に定義 さ れて いれば、
サブ ク エ リ も 明確 と な り ま す。 次に例 を 示 し ま す。
select
(select c11 from t1 where c12 = t3.c32), c31
from t3
where
c32 > (select c22 from t2 where c21 = t3.c31)
plan
“(nested
(nested
(t_scan t3)
(subq
(i_scan i_c11_c12 t1)
)
)
(subq
(i_scan i_c21 t2)
)
)”
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
377
概要
ただ し 、 テーブル名が あ い ま い な場合に テーブル名の あ い ま い さ
を 解消 し よ う と す る と 、 サブ ク エ リ の ID が必要 と な り ま す。
サブ ク エ リ は、 左開き カ ッ コ “(“ か ら の順番に従 っ て、 番号で識
別 さ れ ま す。
次の例では、 2 つ の サブ ク エ リ が両方 と も テーブル t1 を 参照 し
ま す。
select 1
from t1
where
c11 not in (select c12 from t1)
and c11 not in (select c13 from t1)
次の抽象プ ラ ン では、 c12 か ら 射影 を 抽出す る サブ ク エ リ を “1”
と 名付け、 c13 か ら 射影 を 抽出す る サブ ク エ リ を “2” と 名付け て
い ま す。
( nested
(nested
(t_scan t1)
(subq
(scalar_agg
(i_scan i_c11_c12 (table t1 (in (subq 1))))
)
)
)
(subq
(scalar_agg
(i_scan i_c13 (table t1 (in (subq 2))))
)
)
)
次の ク エ リ では、 2 番目の サブ ク エ リ が最初の サブ ク エ リ に ネ ス
ト さ れて い ま す。
select * from t1
where c11 not in
(select c12 from t1
where c11 not in
(select c13 from t1)
378
Adaptive Server Enterprise
第 13 章
クエリの抽象プランのユーザーズ・ガイド
次の例で も 、 c12 の射影 を 抽出す る サブ ク エ リ に “1” と 名付け、
c13 の射影 を 抽出す る サブ ク エ リ に “2” と 名付け て い ま す。
( nested
(t_scan t1
(subq
(scalar_agg
(nested
(i_scan i_c12 (table t1 (in (subq 1))))
(subq
(scalar_agg
(i_scan i_c21 (table t1 (in (subq 2))))
)
)
)
)
)
)
サブクエリの例 : 読み込み順と付加
nested 演算子は、 第 1 オ ペ ラ ン ド に抽象プ ラ ン の抽出テーブル を 、
第 2 オ ペ ラ ン ド に ネ ス ト し たサブ ク エ リ を と り ま す。 こ の た め、
縦に見て い けばジ ョ イ ン順 と サブ ク エ リ の配置 を 容易に理解で き
ま す。
select *
from t1, t2, t3
where c12 = 0
and c11 = c21
and c22 = c32
and 0 < (select c21 from t2 where c22 = t1.c11)
抽象プ ラ ン では、 ジ ョ イ ン順が t1、 t2、 t3 で、 サブ ク エ リ が t1 の
ス キ ャ ン に ネ ス ト し て い ま す。
(nl_join
(nested
(i_scan i_c11 t1)
(subq
(t_scan (table t2 (in (subq 1)))
)
)
(i_scan i_c21 t2)
(i_scan i_c32 t3)
)
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
379
概要
サブクエリのネストの修正
サブ ク エ リ の付加ポ イ ン ト を 修正す る 場合は、 すべて の相関カ ラ
ム を 利用で き る ポ イ ン ト を 選択す る 必要が あ り ま す。 こ の ク エ
リ は、 外部 ク エ リ の 2 つ の テーブル と 相関関係が あ り ま す。
select *
from t1, t2, t3
where c12 = 0
and c11 = c21
and c22 = c32
and 0 < (select c31 from t3 where c31 = t1.c11
and c32 = t2.c22)
次の プ ラ ン では、 ジ ョ イ ン 順が t1、 t2、 t3 で、 サブ ク エ リ は t1-t2
ジ ョ イ ン に ネ ス ト し て い ま す。
(nl_join
(nested
(nl_join
(i_scan i_c11_c12 t1)
(i_scan i_c22 t2)
)
(subq
(t_scan (table t3 (in (subq 1))))
)
)
(i_scan i_c32 t3)
)
こ の サブ ク エ リ は、 両方の外部テーブル の カ ラ ム を 必要 と す る の
で、 サブ ク エ リ を t1 の ス キ ャ ン や t2 の ス キ ャ ン に ネ ス ト す る の は
間違い ですが、 こ の よ う な エ ラ ーは、 最適化の段階で メ ッ セ ー ジ
を 表示せずに解決 さ れ ま す。
380
Adaptive Server Enterprise
第 13 章
クエリの抽象プランのユーザーズ・ガイド
ただ し 、 次の よ う な抽象プ ラ ン の場合は、 3 つ の テーブル ・ ジ ョ
イ ン に対 し てサブ ク エ リ を ネ ス ト さ せ る 要求が正 し く 出 さ れ
ま す。
( nested
(nl_join
(i_scan
(i_scan
(i_scan
)
(subq
(t_scan
)
)
i_c11_c12 t1)
i_c22 t2)
i_c32 t3)
(table t3 (in (subq 1))))
実体化されたビューの抽象プラン
ほ と ん ど の場合、 ビ ュ ー処理は ビ ュ ー の定義 を メ イ ン ・ ク エ リ に
組み込む こ と で実現 し て い ま す。 し か し 、 次の セル フ ジ ョ イ ン の
よ う に、 ビ ュ ー を 実体化す る 必要が あ る 場合が あ り ま す。
create view v3(cc31, sum_c32)
as
select c31, sum(c32)
from t3
group by c31
select *
from v3 a, v3 b
where a.c31 = b.c31
こ の よ う な場合、 抽象プ ラ ン は ワ ー ク テーブル と 、 それ を 実体化
す る store 演算子 を 公開 し ま す。 ワ ー ク テーブルの 2 つ の ス キ ャ ン
は相関名で識別 さ れ ま す。
(sequence
(store
(group_sorted
(i_scan i_c31 t3)
)
)
(m_join
(sort
(t_scan (work_t (a Worktable)))
( sort
(t_scan (work_t (b Worktable)))
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
381
概要
)
)
)
抽象プ ラ ン に お け る ベ ク ト ル集合関数の扱い に つ い ては、 次の項
で説明 し ま す。
集合関数を含むクエリの抽象プラン
次の ク エ リ は ス カ ラ 集合 を 返 し ま す。
select max(c11) from t1
ス カ ラ 集合 を 実装す る 物理演算子が あ る の で、 オプテ ィ マ イ ザに
は選択の余地が あ り ま せん。 ただ し 、 c11 の イ ン デ ッ ク ス を 選択 し
た場合は、 次の よ う な max() 最適化が可能です。
(scalar_agg
(i_scan ic11 t1)
)
ス カ ラ 集合は最上位の抽象プ ラ ン 演算子な の で、 それ を 取 り 除い
て次の よ う な部分プ ラ ン を 使用 し て も 同 じ 結果が得 ら れ ま す。
(i_scan ic11 t1)
scalar_agg 抽象プ ラ ン は通常、 それがサブ ク エ リ の一部で あ っ て、
抽象プ ラ ン が親 ク エ リ も 処理の対象 と し な ければな ら な い場合に
必要 と さ れ ま す。
ベ ク ト ル集合に は、 グループ論理演算子 を 実装す る 物理演算子が
い く つ か あ る と い う 点で ス カ ラ 集合 と は異な り ま す。 こ れ に よ っ
てオプテ ィ マ イ ザに選択の余地がで き ま す。 し たが っ て、 抽象プ
ラ ン は選択 を 強制で き ま す。
select max(c11)
from t1
group by c12
次の抽象プ ラ ン の例はそれぞれ、 3 つ の ベ ク ト ル集合ア ルゴ リ ズ
ム を 強制 し ま す。
注意 group_sorted はグループ化カ ラ ム に よ る 順序付け を 必要 と し
ま す。 し たが っ て、 イ ン デ ッ ク ス を 使用す る 必要が あ り ま す。
(group_sorted
(i_scan i_c12 t1)
382
Adaptive Server Enterprise
第 13 章
クエリの抽象プランのユーザーズ・ガイド
)
(group_hashing
(t_scan t1)
)
(group_inserting
(t_scan t1)
)
共用体を含むクエリの抽象プラン
union 抽象プ ラ ン演算子は、 共用体 を 含む SQL ク エ リ の プ ラ ン を
表 し ま す。
select*
from
t1,
(select * from t2
union
select * from t3
) u(u1, u2)
where c11=u1
plan
“(nl_join
(union
(t_scan t2)
(t_scan t3)
)
(i_scan i_c11 t1)
)”
SQL に は 2 つ の タ イ プ の union が あ り ま す。 union distinct と union [all]
で、 union [all] がデ フ ォ ル ト です。
m_union_distinct お よ び h_union_distinct 抽象プ ラ ン演算子は、 強制
的に マ ー ジ ベ ー ス ま た は ハ ッ シ ュ ベー ス の UNION DISTINCT の重
複 を 除去 し ま す。 こ れ ら の演算子 を UNION ALL と 一緒に使用す る
こ と はで き ま せん。 マ ー ジ ベ ー ス の ア ルゴ リ ズ ム では、 共用体の
各子か ら 、 すべて の共用体射影カ ラ ム を 対象 と す る 順序付けが必
要です。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
383
概要
次の例では、 最初の子に つ い ては (c11, c12) 複合 イ ン デ ッ ク ス
に よ っ て、 2 番目の子に つ い ては ソ ー ト に よ っ て、 必要な順序付
けが行われて い ま す。
select c11, c12 from t1
union distinct
select c21, c22 from t2
plan
“(m_union distinct
(i_scan i_c11_c12 t1)
(sort
(t_scan t2)
)
)”
union_all お よ び m_union_all 抽象プ ラ ン演算子は、 ア ペ ン ド ベー ス
ま た は マ ー ジ ベー ス の UNION ALL を 強制 し ま す。 こ れ ら の演算子
を UNION DISTINCT と 一緒に使用す る こ と はで き ま せん。 マ ー ジ
ベー ス の ア ルゴ リ ズム はそれ自体順序付け を 必要 と し ま せん が、
子の順序付けが有用で親が使用可能で あ ればそれ を 作成 し ま す。
次の例では、 2 つ の i_scan 演算子に よ る 順序付け を 、 それ ら の
m_union_all 親が、 上の m_join に対 し て使用可能に し ま す。
select *
from
t1,
(select c21, c22 from t2
union
select c31, c32 from t3
) u(u1, u2)
where c11=u1
plan
“(m_join
(m_union_all
(i_scan i_c21 t2)
(i_scan i_c31 t3)
)
(i_scan i_c11 t1)
)”
384
Adaptive Server Enterprise
第 13 章
クエリの抽象プランのユーザーズ・ガイド
クエリが順序付けを必要とする場合に抽象プランを使用する
順序付けは、 ORDER BY 句 を 使用 し て ク エ リ で明示的に指定す
る か、 m_join、 m_union_distinct、 お よ び group_sorted の よ う な マ ー
ジ ベ ー ス の演算子 を 使用 し て暗黙的に指定す る 必要が あ り ま す。
順序付けは、 sort 抽象プ ラ ン 演算子 を 使用 し て明示的に行 う か
( オプテ ィ マ イ ザは、 順序付け に必要 と 見込ま れ る すべて の カ ラ
ム に ソ ー ト ・ キー を 作成す る )、 イ ン デ ッ ク ス が付け ら れた カ ラ
ム に i_scan を 適用 し て暗黙的に行い ま す。
順序付け を 必要 と す る マ ー ジ ベ ー ス の演算子はすべて、 順序付け
を 必要 と す る 親の た め に、 マ ー ジ結果に順序 を 保持 し ま す。
次の例では、 t1 の i_scan が m_join に よ っ て必要 と さ れ る 順序付け
を 提供 し ま す。 t2 の i_scan、 お よ び t3 の ス キ ャ ン の ソ ー ト に よ っ
て、 m_union_distinct が必要 と す る 順序付けが提供 さ れ ま す。 こ の順
序付け は、 m_join が必要 と す る 順序付けで も あ り ま す。 最後に、
ORDER BY で必要 と す る 順序付けは m_join が提供す る の で、 ト ッ
プ ・ レ ベルの ソ ー ト は必要あ り ま せん。
select *
from
t1,
(select c21, c22 from t2
union distinct
select c31, c32 from t3
) u(u1, u2)
where c11=u1
order by c11, u2
plan
“(m_join
(m_union_distinct
(i_scan i_c21_c22 t2)
(sort
(t_scan t3)
)
)
(i_scan i_c11 t1)
)”
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
385
概要
再フォーマット方式の指定
次の ク エ リ では、 t2 が非常に大き く 、 イ ン デ ッ ク ス がな い も の と
し ま す。
select *
from t1, t2
where c11 > 0
and c12 = c21
and c22 = 0
t2 の再 フ ォ ー マ ッ ト 方式 を 指定す る 抽象プ ラ ン は、 次の よ う に な
り ま す。
(nl_join
(t_scan t1)
(store_ind
(t_scan t2)
)
)
store_ind 抽象プ ラ ン演算子は、 nl_join の内側に配置す る 必要が あ
り ま す。 こ の演算子は ど の抽象プ ラ ン に も 配置で き ま すが、 そ の
場合に はテーブル ・ ス キ ャ ン は 1 回だけ と い う 制限は な く な り
ま す。 従来の (scan (store... )) 構文 も 使用可能です。
OR 方式を指定する
OR 方式は一連の イ ン デ ッ ク ス ・ ス キ ャ ン を 使用 し て、 各 OR 項で
ス キ ャ ン に制限 を 加え て か ら 、 UnionDistinct 演算子 を 介 し て結果の
ロ ー ID を 渡 し 、 テーブルの RidJoin で、 ユニー ク ・ ロ ー ID に対応
す る タ プル を 取得 し ま す。
m_scan ( マルチ ス キ ャ ン ) 抽象プ ラ ン演算子は イ ン デ ッ ク ス共用
体 を 強制す る こ と で、 OR 方式 を 実現 し ま す。
select * from t1
where c11 > 10 or c12 > 100
plan
“(m_scan t1)”
386
Adaptive Server Enterprise
第 13 章
クエリの抽象プランのユーザーズ・ガイド
store 演算子が指定されない場合
ア ルゴ リ ズ ム ( ソ ー ト 、 グループ挿入な ど ) の内部的要求に応 じ
て一連の タ プル を ワ ー ク テーブル に保存す る こ と は、 ア ルゴ リ ズ
ム の実装に か か わ る こ と と 見な さ れ る の で、 抽象プ ラ ン では公開
さ れて い ま せん。
抽象プ ラ ン は、 セル フ ジ ョ イ ン の実体化 さ れた ビ ュ ー の よ う な、
内部的な事情に よ っ て作成 さ れた ワ ー ク テーブルの み を 公開 し
ま す。 こ の よ う な場合、 演算子は ワ ー ク テーブル を 必要 と し ま
せん。 理由はむ し ろ 、 中間抽出テーブル の計算 を 1 回行い、 2 回使
用す る と い う 、 プ ラ ン の全体的な性質に よ り ま す。
並列処理の抽象プラン
分割 さ れた テーブル を 並列ス キ ャ ン す る と 、 生成 さ れ る タ プルの
ス ト リ ー ム も 分割 さ れ ま す。 並列処理特有の ニーズ を 持つ演算子
が別に あ り ま す。 た と えば、 すべて の ジ ョ イ ン に お い て、 両方の
子 を 等価パーテ ィ シ ョ ン に すべ き か、 ま た は一方の子 を 複製す る
べ き か な ど です。
抽象プ ラ ン xchg 演算子は、 オプテ ィ マ イザを強制し て、 子抽出テー
ブルを すぐ に n 個に再分割さ せます。 抽象プ ラ ン は分割数を与え る
だけです。 オプテ ィ マ イザは、 最も 有益な分割カ ラ ム と 種類 ( ハ ッ
シ ュ 、 範囲、 リ ス ト 、 ま たは ラ ウ ン ド ロ ビ ン ) を選びます。
次の 例では、 t1 と t2 を ハ ッ シ ュ 分割で 2 分割し 、 ジ ョ イ ン ・ カ ラ
ム で 3 分割、 そ し て i_c21 は ロ ー カ ル・ イ ン デッ ク ス で あ る と し
ま す。
select *
from t1, t2
where c11=c21
次の抽象プ ラ ン では、 t1 を 3 つ に再分割 し 、 3 並列 nl_join を 実行 し
て結果 を シ リ ア ル化 し 、 最後にデー タ ・ ス ト リ ー ム を 一本化 し て
ク ラ イ ア ン ト に返 し ま す。
(xchg 1
(nl_join
(xchg 3
(t_scan t1)
)
(i_scan i_c21 t2)
)
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
387
抽象プランを記述するためのヒント
)
t2 の並列ス キ ャ ン を 指定す る 必要は あ り ま せん。 ハ ッ シ ュ 分割で 3
つ に分割 さ れ、 xchg-3 で結合 さ れて い る の で、 ほ か の プ ラ ン は不
要です。
次の抽象プ ラ ン では、 t1 と t2 を それぞれ分割 し て ス キ ャ ン と ソ ー
ト を 並列 し て行い、 次に、 m_join でそれ ら を シ リ ア ル化 し ま す。
(m_join
(xchg 1
(sort
(t_scan t1)
)
)
(xchg 1
(sort
(t_scan t2)
)
)
)
(prop t1 (parallel 2))
(prop t2 (parallel 3))
並列抽象プ ラ ン の構造 を 使用す る と 、 オプテ ィ マ イ ザに ネ イ テ ィ
ブ な並列度の並列ス キ ャ ン を 選択 さ せ る こ と がで き ま す。
抽象プランを記述するためのヒント
以下に抽象プ ラ ン を 記述 し て使用す る 上で の ヒ ン ト を 紹介 し
ま す。
•
ク エ リ の現在の プ ラ ン と 、 記述す る 必要が あ る プ ラ ン と 同 じ
ク エ リ 実行ス テ ッ プ を 持つ プ ラ ン を 見つ け ま す。 新 し い プ ラ
ン を 最初か ら 記述す る よ り も 、 既存の プ ラ ン を 修正す る 方が
簡単な場合が多い。
•
ク エ リ の プ ラ ン を 取得す る 。
•
sp_help_qplan を 使用 し て SQL テキ ス ト と プ ラ ン を 表示す
る。
•
こ の出力 を 編集 し て create plan コ マ ン ド を 作成す る か、
plan 句 を 使用 し て SQL ク エ リ に編集 し た プ ラ ン を 付加
する。
388
Adaptive Server Enterprise
第 13 章
•
クエリの抽象プランのユーザーズ・ガイド
オプテ ィ マ イ ザの ほ と ん ど の選択が適切だが、 た と えば イ ン
デ ッ ク ス の選択の み を 改善す る 必要が あ る よ う な場合は、 ク
エ リ の チ ュ ーニ ン グ に部分プ ラ ン を 指定す る の が最善の方法
で あ る こ と が多い。
部分プ ラ ン を 使用す る と 、 オプテ ィ マ イ ザは、 ほ か の テーブ
ルのデー タ の変化に合わせて、 ほ か の テーブルへ の別の パ ス
を 選択で き る 。
•
一旦保存 さ れた抽象プ ラ ン は静的で あ る 。 デー タ 量や分散状
態が変化す る と 、 保存 さ れて い る 抽象プ ラ ン が最適で な く な
る 場合が あ る 。
イ ン デ ッ ク ス の付加、 テーブルの分割、 ま た はバ ッ フ ァ ・
プール の追加に よ る そ の後の チ ュ ーニ ン グ の変更に よ り 、 保
存 さ れたプ ラ ン の中に現在の条件で十分機能 し な く な る プ ラ
ン が出て く る 場合が あ る 。 多 く の場合、 特定の問題 を 解決す
る 少数の抽象プ ラ ン を 使用す る こ と が望ま し い。
定期的に プ ラ ン を 確認 し て、 オプテ ィ マ イ ザが選択す る プ ラ
ン よ り も 保存 さ れて い る プ ラ ン の方が優れて い る こ と を 確認
する。
クエリ・レベルで抽象プランを使用する
抽象プ ラ ン を 使用す る と 、 強制的に、 ク エ リ ・ プ ロ セ ッ サが選択
し た ク エ リ ・ プ ラ ン に い く つ か の ク エ リ レ ベルの設定 を 許可 さ せ
る こ と がで き ま す。 ク エ リ ・ レ ベルで使用す る 抽象プ ラ ン の詳細
に つ い ては、 「第 7 章 最適化の制御」 を 参照 し て く だ さ い。
最適化基準は、 以下の set 文に よ っ て セ ッ シ ョ ン ・ レ ベルで処理
さ れ ま す。
set
nl_join|merge_join|hash_join|...
on | off
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
389
クエリ・レベルで抽象プランを使用する
use ... 抽象プ ラ ン構文は、 抽象プ ラ ン の抽出テーブルの前に use
形式 を 任意の数だけ記述で き る こ と を 意味 し ま す。 Adaptive Server
15.0 以前の バー ジ ョ ン では、 optgoal と opttimeout は抽出テーブル を
伴 う 同 じ 抽象プ ラ ン の中で同時に使用す る こ と はで き ま せん で
し た。 た と えば、 次の文は ク エ リ 中の optgoal 文か ら 分離 さ れて い
る 必要が あ り ま し た。
select ...
plan
"(use opttimeoutlimit 10) (i_scan r)"
し か し 、 次の方法で い く つ か の文 を 同 じ 抽象プ ラ ン に含め る こ と
がで き ま す。
•
use 文 を い く つ か使用す る 。 次に例 を 示 し ま す。
select ...
plan
"(use optgoal allrows_dss) (use nl_join off)
(...)"
•
1 つ の use 形式内に複数の項目 を 配置す る 。 次に例 を 示 し
ま す。
select ...
plan
"(use (optgoal allrows_dss) (nl_join off))
(...)"
ク エ リ ・ レ ベルでは、 最適化目標 (opt_goal) ま た は タ イ ム ア ウ ト
(opttimeout) 設定 を use ... 抽象プ ラ ン構文 と 共に使用 し ま す。 セ ッ
シ ョ ン ・ レ ベルでは、 こ れ ら の設定 を set plan ... 構文 と 共に使用 し
ま す。
•
最適化目標
•
最適化 タ イ ム ア ウ ト
た と えば、 r outer を s に結合 し 、 最適化目標 (opt_goal) な し で
hash_join を 有効に し ま す。
select ...
>
>
>
plan
"(use hash_join on)
>
>
390
(join (scan r) (scan s))"
Adaptive Server Enterprise
第 13 章
クエリの抽象プランのユーザーズ・ガイド
次の例では、 opt_goal 文 と allrows_oltp 文 を 使用 し ま すが、 hash_join
は有効の ま ま です。
select ...
>
>
plan
>
>
"(use opt_goal allrows_oltp)(use hash_join
on)"
ク エ リ ・ レ ベルで最適化目標 と 最適化基準 を 設定す る 場合は、 use
文の順序は結果に影響 を 与え ま せん。
•
抽象プ ラ ン最適化目標 を 最初に設定 し 、 最適化基準に は最適
化目標のデ フ ォ ル ト を 設定 し ま す。
•
最適化目標のデ フ ォ ル ト 基準よ り も 優先 さ れ る 抽象プ ラ ン の
最適化は、 最適化目標 を 設定 し た後に設定で き ま す。
抽象プランおよびオプティマイザ条件の演算子名の調整
ア ルゴ リ ズ ム の名前は、 抽象プ ラ ン の中お よ び set コ マ ン ド の中
で の使い方に よ っ て変わ り ま す。 た と えば、 ハ ッ シ ュ ・ ジ ョ イ ン
は抽象プ ラ ン の中では h_join と 呼ばれ ま すが、 set コ マ ン ド の中で
は hash_join と 呼ばれ ま す。 Adaptive Server は、 拡張抽象プ ラ ン構
文では両方の キー ワ ー ド を 受け付け ま す。 次に例 を 示 し ま す。
select ...
plan
"(h_join (t_scan r) (t_scan s))"
は次の いずれか と 等価です。
select ...
plan
"(hash_join (t_scan r) (t_scan s))"
および
select ...
plan
"(use h_join on)"
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
391
クエリ・レベルで抽象プランを使用する
お よび
select ...
plan
"(use hash_join on)"
テーブル抽象プ ラ ン が あ る 場合はそれが優先 さ れ ま す。
select ..
from r, s, t
...
plan
"(use hash_join off)
(h_join (t_scan r) (t_scan s))"
ク エ リ は、 r ス キ ャ ン と s ス キ ャ ン に つ い ては hash_join を 使用 し ま
すが、 t と 結合す る 場合は、 use 抽象プ ラ ン 形式で指定 し た よ う な
hash_join は使用 し ま せん。 なぜな ら ば、 テーブル抽象プ ラ ン に そ
れが指定 さ れて い な か っ た か ら です。
オプティマイザ条件設定の set 構文を拡張する
set opt criteria 文は、 on/off/default を 受け付け ま す。 default は、 こ の
最適化基準 (set 構文の詳細に つ い ては、 『 リ フ ァ レ ン ス ・ マ ニ ュ
ア ル : コ マ ン ド 』 を 参照 ) に現在の最適化目標設定 を 使用す る こ
と を 示 し て い ま す。
392
Adaptive Server Enterprise
第 13 章
クエリの抽象プランのユーザーズ・ガイド
プランの実行前後を比較する
抽象 ク エ リ ・ プ ラ ン を 使用 し て、 Adaptive Server ソ フ ト ウ ェ ア の
ア ッ プグ レ ー ド ま た は ク エ リ ・ プ ラ ン に対す る シ ス テ ム の チ ュ ー
ニ ン グ変更の影響 を 評価 し ま す。 変更 を 行 う 前に プ ラ ン を 保存 し 、
ア ッ プグ レ ー ド やチ ュ ーニ ン グ の変更 を 行 っ た後、 も う 一度プ ラ
ン を 保存 し て、 2 つ の プ ラ ン を 比較 し ま す。 基本的な手順は次の
と お り です。
1
設定パ ラ メ ー タ abstract plan dump を 1 に設定 し て、 サーバ ワ イ
ド の取得モ ー ド を 有効に す る 。 こ れ に よ っ て、 すべて の プ ラ
ン はデ フ ォ ル ト ・ グループ の ap_stdout に取得 さ れ る よ う に
な る。
2
取得 さ れた プ ラ ン が、 シ ス テ ム上で実行 さ れ る ほ と ん ど の ク
エ リ を 表せ る よ う に十分時間 を お く 。 追加の プ ラ ン が生成 さ
れて い る か ど う かは、 次の よ う に し て、 sysqueryplans の
ap_stdout グループ に あ る ロ ー の カ ウ ン ト が安定 し て い る か ど
う か を 調べればわ か り ま す。
select count(*) from sysqueryplans where gid = 2
3
sp_copy_all_qplans を 使用 し て、 すべて の プ ラ ン を ap_stdout
か ら ap_stdin へ コ ピ ーす る ( ま た は、 サーバ ワ イ ド の プ ラ ン ・
ロ ー ド ・ モ ー ド を 使用 し た く な い場合は、 ほ か の グルー
プへ )。
4
sp_drop_all_qplans を 使用 し て、 ap_stdout か ら すべて の ク エ リ ・
プ ラ ン を 削除す る 。
5
ア ッ プグ レ ー ド ま た はチ ュ ーニ ン グ の変更 を 行 う 。
6
十分時間 を か け て、 プ ラ ン が ap_stdout に取得 さ れ る の を
待つ。
7
sp_cmp_all_qplans の diff モ ー ド ・ パ ラ メ ー タ を 使用 し て、
ap_stdout と ap_stdin の プ ラ ン を 比較す る 。 た と えば、 次の
ク エ リ では ap_stdout と ap_stdin の すべて の プ ラ ン を 比較 し て
い ま す。
sp_cmp_all_qplans ap_stdout, ap_stdin, diff
2 つ の グループで異な る プ ラ ン に つ い て の情報だけが表示 さ
れる。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
393
プランの実行前後を比較する
サーバワイドな取得モードの影響
サーバ ワ イ ド の取得モ ー ド を 有効に す る と 、 最適化可能なすべて
の ク エ リ の プ ラ ン が、 サーバ上の すべて のデー タ ベ ー ス に保存 さ
れ ま す。 こ れ に よ り 、 シ ス テ ム管理上、 次の よ う な影響が考え ら
れ ま す。
•
プ ラ ン の取得が完了す る と 、 各プ ラ ン は sysqueryplans に保存
さ れ、 ロ グ ・ レ コ ー ド が生成 さ れ る 。 プ ラ ン と ロ グ ・ レ コ ー
ド に必要な ス ペー ス は、 SQL 文 と ク エ リ ・ プ ラ ン の サ イ ズ と
複雑 さ に よ っ て異な る 。 各デー タ ベー ス の ユーザが操作す る
ため の ス ペース を チ ェ ッ ク す る。
特に、 多 く の新 し い プ ラ ン が生成 さ れて い る サーバ ワ イ ド な
取得の初期段階では、 ト ラ ン ザ ク シ ョ ン ・ ロ グ を 頻繁に ダ ン
プ し な ければな ら な い場合が あ る 。
•
ユーザが master デー タ ベー ス か ら シ ス テ ム ・ プ ロ シ ー ジ ャ を
実行 し た時点で、 サーバ ワ イ ド の プ ラ ン 取得が有効の状態で
installmaster が ロ ー ド さ れて い れば、 シ ス テ ム ・ プ ロ シ ー ジ ャ
で最適化可能な文の プ ラ ン が master.sysqueryplans に保存 さ
れる。
こ れは、 プ ラ ン の取得 を 有効に し て い る と き に作成 さ れた
ユーザ定義の プ ロ シ ー ジ ャ の場合 も 同様で あ る 。 master の ス
ペー ス が限 ら れて い る 場合は、 シ ス テ ム管理者 を 含むすべて
の ユーザが ロ グ イ ン す る と き に デ フ ォ ル ト ・ デー タ ベ ー ス を
提供で き る 。
•
sysqueryplans テーブルは、 ロ ッ ク の競合 を 減 ら すた め に、
デー タ ロ ー の ロ ッ ク を 使用す る 。 し か し 、 特に大量の新 し い
プ ラ ン を 保存 し て い る と き は、 パ フ ォ ー マ ン ス に多少の影響
が あ る 場合が あ る 。
•
394
サーバ ワ イ ド の取得モ ー ド が有効の間は、 bcp を 使用す る と
ク エ リ ・ プ ラ ン が master デー タ ベ ー ス に保存 さ れ る 。
多 く の テーブルや ビ ュ ー を 使用 し た bcp を 実行す る 場合は、
sysqueryplans と master 内の ト ラ ン ザ ク シ ョ ン ・ ロ グ を チ ェ ッ
ク し て く だ さ い。
Adaptive Server Enterprise
第 13 章
クエリの抽象プランのユーザーズ・ガイド
プランをコピーするための時間と領域
ap_stdout に多数の ク エ リ ・ プ ラ ン が あ る 場合は、 コ ピ ー を 開始す
る 前に、 system セグ メ ン ト 上に十分な ス ペー ス が あ る こ と を 確認
し て く だ さ い。 sysqueryplans のサ イ ズ を チ ェ ッ ク す る 場合は
sp_spaceused を 使用 し 、 シ ス テ ム ・ セ グ メ ン ト の サ イ ズ を
チ ェ ッ ク す る 場合は sp_helpsegment を 使用 し て く だ さ い。
プ ラ ン を コ ピ ーす る 場合 も 、 ト ラ ン ザ ク シ ョ ン ・ ロ グ に領域が必
要です。
sp_copy_all_qplans は、 コ ピ ーす る グループ内の プ ラ ン ご と に
sp_copy_qplan を 呼び出 し ま す。 sp_copy_all_qplans が領域の不足や
ほ か の問題で失敗 し た場合、 正常に コ ピ ー さ れた プ ラ ン は タ ー
ゲ ッ ト の ク エ リ ・ プ ラ ン ・ グループ に残 り ま す。
ストアド・プロシージャの抽象プラン
ス ト ア ド ・ プ ロ シ ー ジ ャ 内の最適化可能な SQL 文の た め に取得す
る 抽象プ ラ ン に つ い て、 次の点に注意 し ま す。
•
プ ロ シ ー ジ ャ は、 プ ラ ン取得モ ー ド ま た はプ ラ ン結合モ ー ド
が有効に な っ て い る と き に作成す る 必要が あ る ( こ れ に よ っ
て、 sysprocedures 内の プ ロ シ ー ジ ャ の テキ ス ト が保存 さ
れ る )。
•
プ ロ シ ー ジ ャ を 実行す る に は、 プ ラ ン取得モ ー ド を 有効に し 、
プ ロ シ ー ジ ャ はプ ロ シ ー ジ ャ ・ キ ャ ッ シ ュ か ら では な く デ ィ
ス ク か ら 読み込む必要が あ る 。
こ の一連の ス テ ッ プ に よ り 、 次の プ ロ シ ー ジ ャ 内の すべて の最適
化可能な文に ク エ リ ・ テキ ス ト と 抽象プ ラ ン が取得 さ れ ま す。
set plan dump dev_plans on
go
create procedure myproc as ...
go
exec myproc
go
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
395
ストアド・プロシージャの抽象プラン
プ ロ シ ー ジ ャ がキ ャ ッ シ ュ に あ っ て、 プ ロ シ ー ジ ャ の プ ラ ン が取
得 さ れな い場合は、 プ ロ シ ー ジ ャ with recompile を 実行 し て く だ さ
い。 同様に、 ク エ リ の抽象プ ラ ン を 使用 し て、 ス ト ア ド ・ プ ロ
シ ー ジ ャ を 実行す る と 、 プ ロ シ ー ジ ャ ・ キ ャ ッ シ ュ に あ る プ ラ ン
が使用 さ れ る た め、 プ ロ シ ー ジ ャ がデ ィ ス ク か ら 読み込ま れ る 場
合 を 除き、 ク エ リ ・ プ ラ ン の関連づけは行われ ま せん。
set fmtonly on を 使用す る と 、 ス ト ア ド ・ プ ロ シ ー ジ ャ 内の文 を 実
際に は実行 し な い で、 ス ト ア ド ・ プ ロ シ ー ジ ャ の プ ラ ン を 取得で
き ま す。
プロシージャとプランの所有者
プ ラ ン取得モ ー ド が有効に な っ て い る と 、 ス ト ア ド ・ プ ロ シ ー
ジ ャ 内の最適化可能な文の抽象プ ラ ン は、 プ ロ シ ー ジ ャ の所有者
の ユーザ ID と と も に保存 さ れ ま す。
プ ラ ン関連づけ モ ー ド の間、 ス ト ア ド ・ プ ロ シ ー ジ ャ の関連づけ
は、 プ ロ シ ー ジ ャ を 実行す る ユーザでは な く 、 プ ロ シ ー ジ ャ の所
有者の ユーザ ID に基づ い て行われ ま す。 こ れは、 あ る プ ロ シ ー
ジ ャ の ク エ リ に対す る 抽象プ ラ ン を 作成す る と 、 プ ロ シ ー ジ ャ を
実行す る 許可 を 持つすべて の ユーザが同 じ 抽象プ ラ ン を 使用す る
こ と を 意味 し ま す。
可変実行パスと最適化を使用するプロシージャ
ス ト ア ド ・ プ ロ シ ー ジ ャ を 実行す る と 、 最適化可能な各文に つ い
て抽象プ ラ ン が保存 さ れ ま す。 こ れは、 そ の ス ト ア ド ・ プ ロ シ ー
ジ ャ に プ ロ シ ー ジ ャ や ほ か の条件の パ ラ メ ー タ に よ っ て異な る 文
を 実行す る フ ロ ー制御文が含ま れ る 場合で も 同 じ です。
Adaptive Server は、 ス ト ア ド ・ プ ロ シ ー ジ ャ の実行時に では な く
コ ン パ イ ル時に、 抽象プ ラ ン の ロ ー ド と 保存 を 行い ま す。
Adaptive Server は、 ス ト ア ド ・ プ ロ シ ー ジ ャ を コ ン パ イ ルす る 場
合 ( 通常は最初に実行す る と き )、 最適化 さ れた文ご と に抽象プ ラ
ン を 保存 し ま す。 Adaptive Server は、 抽象プ ラ ン の取得、 ま た は、
ス ト ア ド ・ プ ロ シ ー ジ ャ がプ ロ シ ー ジ ャ の パ ラ メ ー タ に よ っ て別
の文が実行 さ れ る よ う な フ ロ ー制御文 を 含む か ど う か の判断
に は、 影響 を 与え ま せん。
396
Adaptive Server Enterprise
第 13 章
クエリの抽象プランのユーザーズ・ガイド
異な る コ ー ド ・ パ ス を 使用す る 別の パ ラ メ ー タ で ク エ リ を 2 回目
に実行 ( 再 コ ン パ イ ルせずに ) す る と 、 Adaptive Server は既に前回
の コ ン パ イ ル に よ っ てすべて の文の プ ラ ン を 最適化 し 保存 し て い
る の で、 コ ー ド ・ パ ス が異な っ て も そ の中の文の プ ラ ン と 抽象プ
ラ ン は いずれ も 使用可能で あ り 、 こ れ ら の文が実行済みで あ る か
否か に か か わ ら ず、 前回の ス ト ア ド ・ プ ロ シ ー ジ ャ の実行パ ラ
メ ー タ 値がベ ー ス に な っ て い ま す。
し か し 、 プ ロ シ ー ジ ャ の抽象プ ラ ン は、 条件やパ ラ メ ー タ に よ っ
て異な る 最適化が行われ る よ う な文 を 持つ プ ロ シ ー ジ ャ に つ い て
は問題 を 解決 し ま せん。 次の よ う な ク エ リ で、 between 句の最小値
と 最大値 を ユーザが与え る よ う なプ ロ シ ー ジ ャ がそ の例です。
select title_id
from titles
where price between @lo and @hi
パ ラ メ ー タ に よ っ て、 最適なプ ラ ン は イ ン デ ッ ク ス ・ ア ク セ ス の
場合、 ま た はテーブル ・ ス キ ャ ン の場合が あ り ま す。 抽象プ ラ ン
は、 プ ロ シ ー ジ ャ の最初の実行で使用 し た パ ラ メ ー タ に よ っ て、
いずれか の ア ク セ ス ・ メ ソ ッ ド を 指定で き ま す。 ク エ リ の実行中
に保存 さ れた抽象プ ラ ン や、 tempdb 内の ス ト ア ド ・ プ ロ シ ー ジ ャ
はサーバ を 再起動す る と 失われ ま す。
アドホック・クエリと抽象プラン
抽象プ ラ ン を 取得す る と 、 SQL ク エ リ の完全な テキ ス ト が保存 さ
れ、 SQL ク エ リ の完全な テキ ス ト に基づ い て抽象プ ラ ン の関連づ
けが行われ ま す。 ユーザが ス ト ア ド ・ プ ロ シ ー ジ ャ や Embedded
SQL を 使用す る 代わ り に、 ア ド ホ ッ ク SQL 文 を 送信す る と 、 ク エ
リ 句の個々の異な る 組み合わせ に対 し て抽象プ ラ ン が保存 さ れ ま
す。 こ れ に よ り 、 非常に多 く の抽象プ ラ ン が作成 さ れ ま す。
た と えば、 ユーザが select 文 を 使用 し て特定の title_id の価格 を
チ ェ ッ ク す る と 、 文ご と に抽象プ ラ ン が保存 さ れ ま す。 次の 2 つ
の ク エ リ の それぞれが 1 つ の抽象プ ラ ン を 生成 し ま す。
select price from titles where title_id = "T19245"
select price from titles where title_id = "T40007"
さ ら に、 各ユーザに つ き 1 つ の プ ラ ン が あ り ま す。 つ ま り 、 何人
か の ユーザが title_id “T40007” を チ ェ ッ ク す る と 、 各ユーザ ID に
つ き プ ラ ン が 1 つ保存 さ れ ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
397
アドホック・クエリと抽象プラン
そ の よ う な ク エ リ が ス ト ア ド ・ プ ロ シ ー ジ ャ に含ま れて い る と 、
次の よ う な 2 つ の利点が あ り ま す。
•
保存 さ れ る 抽象プ ラ ン は 1 つだけ に な る 。 例 と し て次に ク エ
リ を 示 し ま す。
select price from titles where title_id =
@title_id
•
プ ラ ン は ス ト ア ド ・ プ ロ シ ー ジ ャ を 所有す る ユーザの ユーザ
ID と 一緒に保存 さ れ、 抽象プ ラ ン の関連づけ はプ ロ シ ー ジ ャ
の所有者の ID に基づ い て行われ る 。
Embedded SQL を 使用す る と 、 た っ た 1 つ の抽象プ ラ ン がホ ス ト
変数 と と も に保存 さ れ ま す。
select price from titles
where title_id = :host_var_id
398
Adaptive Server Enterprise
第
1 4
章
システム・プロシージャを使用した
抽象プランの管理
こ の章では、 抽象プ ラ ン を 管理す る た め の シ ス テ ム ・ プ ロ シ ー
ジ ャ の基本的な機能 と 使い方に つ い て説明 し ま す。 個々の プ ロ
シ ー ジ ャ の詳細に つ い ては、 『 リ フ ァ レ ン ス ・ マ ニ ュ ア ル : プ ロ
シ ー ジ ャ 』 を 参照 し て く だ さ い。
トピック
抽象プ ラ ン ・ グループ の管理
抽象プ ラ ン の検索
個々の抽象プ ラ ン の管理
グループ に あ る すべて の プ ラ ン の管理
プ ラ ン ・ グループ の イ ン ポー ト と エ ク ス ポー ト
ページ
399
404
404
409
413
抽象プラン・グループの管理
シ ス テ ム ・ プ ロ シ ー ジ ャ を 使 う と 、 抽象プ ラ ン ・ グループ の作
成、 削除、 名前の変更、 お よ び抽象プ ラ ン ・ グループ に関す る 情
報の表示 を 行え ま す。
グループの作成
sp_add_qpgroup を 使用す る と 、 抽象プ ラ ン ・ グループ の作成 と 命
名 を 行 う こ と がで き ま す。 プ ラ ン を デ フ ォ ル ト の取得先グループ
ap_stdout 以外の グループ に取得す る 場合は、 プ ラ ン の取得 を 開始
す る 前に プ ラ ン ・ グループ を 作成す る 必要が あ り ま す。 た と えば、
dev_plans と い う グループ に プ ラ ン の保存 を 開始す る の で あ れば、
set plan dump コ マ ン ド を 実行 し てグループ名 を 指定 し ま す。
sp_add_qpgroup dev_plans
set plan dump dev_plans on
/*SQL queries to capture*/
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
399
抽象プラン・グループの管理
抽象プ ラ ン ・ グループ を 追加で き る の は、 シ ス テ ム管理者 と デー
タ ベ ー ス所有者だけです。 一度グループ を 作成す る と 、 ど の ユー
ザ も そ の グループへプ ラ ン を ダ ン プ し た り 、 そ こ か ら ロ ー ド し た
り で き ま す。
グループの削除
sp_drop_qpgroup を 使用す る と 、 抽象プ ラ ン ・ グループ を 削除で き
ま す。
sp_drop_qpgroup に は、 次の制約が あ り ま す。
•
抽象プ ラ ン ・ グループ を 削除で き る の は、 シ ス テ ム管理者 と
デー タ ベー ス所有者だけです。
•
プ ラ ン が含ま れて い る グループ を 削除す る こ と はで き ま せん。
あ る グループか ら すべて の プ ラ ン を 削除す る に は、 グループ
名 を 指定 し て sp_drop_all_qplans を 実行 し ま す。
•
デ フ ォ ル ト の抽象プ ラ ン ・ グループで あ る ap_stdin と
ap_stdout は削除で き ま せん。
次の コ マ ン ド を 実行す る と 、 dev_plans プ ラ ン ・ グループ を 削除で
き ま す。
sp_drop_qpgroup dev_plans
グループについての情報の取得
sp_help_qpgroup は、 1 つ の抽象プ ラ ン ・ グループ、 ま た は 1 つ の
デー タ ベー ス に あ る すべて の抽象プ ラ ン ・ グループ に つ い て の情
報 を 出力 し ま す。
400
Adaptive Server Enterprise
第 14 章
システム・プロシージャを使用した抽象プランの管理
sp_help_qpgroup に グループ名 を 指定せずに実行す る と 、 すべて の
抽象プ ラ ン ・ グループ の名前、 グループ ID、 お よ び個々の グルー
プ に あ る プ ラ ン の数 を 出力で き ま す。
sp_help_qpgroup
Query plan groups in database ‘pubtune’
Group
GID
Plans
------------------------------ ----------- ----------ap_stdin
1
0
ap_stdout
2
2
p_prod
4
0
priv_test
8
1
ptest
3
51
ptest2
7
189
sp_help_qpgroup に グループ名 を 指定 し て実行す る と 、 指定 し た グ
ループ に あ る プ ラ ン に つ い て の統計 を 示 し た レ ポー ト が出力 さ れ
ま す。 次の例では、 グループ ptest2 に関す る レ ポー ト が出力 さ れ
ま す。
sp_help_qpgroup ptest2
Query plans group 'ptest2', GID 7
Total Rows Total QueryPlans
----------- ---------------452
189
sysqueryplans rows consumption, number of query
plans per row count
Rows
Plans
----------- ----------5
2
3
68
2
119
Query plans that use the most sysqueryplans rows
Rows
Plan
----------- ----------5 1932533918
5 1964534032
Hashkeys
----------123
There is no hash key collision in this group.
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
401
抽象プラン・グループの管理
sp_help_qpgroup は、 個々の グループ に つ い て次の事項 を レ ポー ト
し ま す。
•
抽象プ ラ ン の総数、 お よ び sysqueryplans テーブル に あ る ロ ー
の総数。
•
sysqueryplans に あ る 複数の ロ ー を 持つ プ ラ ン の数。 プ ラ ン は、
ロ ー の数の多い方か ら 降順に リ ス ト が作成 さ れ る 。
•
ハ ッ シ ュ ・ キー の数字お よ びハ ッ シ ュ ・ キー の衝突に関す る
情報。 抽象プ ラ ン は、 ク エ リ 全体に関す る ハ ッ シ ュ ・ ア ルゴ
リ ズ ム に基づ い て ク エ リ に関連づけ さ れ る 。
シ ス テ ム管理者ま た はデー タ ベ ー ス所有者がプ ロ シ ー ジ ャ
sp_help_qpgroup を 実行す る と 、 デー タ ベ ー ス、 あ る い は指定 し た
グループ に あ る すべて の プ ラ ン に つ い て の レ ポー ト が作成 さ れ ま
す。 他の ユーザが sp_help_qpgroup を 実行す る と 、 そ の ユーザが所
有す る プ ラ ン に つ い て の み レ ポー ト が行われ ま す。
sp_help_qpgroup に は、 次の表に示す よ う な レ ポー ト ・ モ ー ド が あ
り ま す。
モード
full
stats
hash
list
queries
plans
counts
402
返される情報
指定 し た グループ に あ る ロ ー の数お よ びプ ラ ン の数、 2 つ以上の ロ ー を 持つプ ラ ン の
数、 最 も 長い プ ラ ン の ロ ー の数お よ びプ ラ ン ID、 ハ ッ シ ュ ・ キー の数お よ びハ ッ
シ ュ ・ キー の衝突に関す る 情報。 こ れはデ フ ォ ル ト の レ ポー ト ・ モ ー ド です。
完全な レ ポー ト か ら ハ ッ シ ュ ・ キー に関す る 情報を除い たすべて の情報。
指定 し た グループ に あ る の ロ ー の数お よ び抽象プ ラ ン の数、 ハ ッ シ ュ ・ キー の数字、
お よ びハ ッ シ ュ ・ キー の衝突に関す る 情報。
グループ内の ロ ー の数 と 抽象プ ラ ン の数、 お よ び各 ク エ リ /プ ラ ン の ペ ア の情報 ( ハ ッ
シ ュ ・ キー、 プ ラ ン ID、 ク エ リ の最初の数文字、 プ ラ ン の最初の数文字 )。
グループ内の ロ ー の数 と 抽象プ ラ ン の数、 お よ び各 ク エ リ の情報 ( ハ ッ シ ュ ・ キー、
プ ラ ン ID、 ク エ リ の最初の数文字 )。
グループ内の ロ ー の数 と 抽象プ ラ ン の数、 お よ び各プ ラ ン の情報 ( ハ ッ シ ュ ・ キー、
プ ラ ン ID、 プ ラ ン の最初の数文字 )。
グループ内の ロ ー の数 と 抽象プ ラ ン の数、 お よ び各プ ラ ン の情報 ( ロ ー の数、 文字数、
ハ ッ シ ュ ・ キー、 プ ラ ン ID、 ク エ リ の最初の文字数 )。
Adaptive Server Enterprise
第 14 章
システム・プロシージャを使用した抽象プランの管理
次の例は、 counts モ ー ド の出力 を 示 し ま す。
sp_help_qpgroup ptest1, counts
Query plans group 'ptest1', GID 3
Total Rows Total QueryPlans
----------- ---------------48
19
Query plans in this group
Rows Chars
hashkey
id
query
----- --------- ----------- ----------- ---------------------------3
623 1801454852
876530156 select title from titles ...
3
576
476063777
700529529 select au_lname, au_fname...
3
513
444226348
652529358 select au1.au_lname, au1....
3
470
792078608
716529586 select au_lname, au_fname...
3
430
789259291
684529472 select au1.au_lname, au1....
3
425 1929666826
668529415 select au_lname, au_fname...
3
421
169283426
860530099 select title from titles ...
3
382
571605257
524528902 select pub_name from publ...
3
355
845230887
764529757 delete salesdetail where ...
3
347
846937663
796529871 delete salesdetail where ...
2
379 1400470361
732529643 update titles set price =...
グループの名前の変更
シ ス テ ム管理者やデー タ ベ ー ス所有者は、 sp_rename_qpgroup を 使
用 し て抽象プ ラ ン ・ グループ の名前 を 変更で き ま す。 次の例では、
グループ名 を dev_plans か ら prod_plans に変更 し ま す。
sp_rename_qpgroup dev_plans, prod_plans
新 し い グループ名に は、 既存の グループ と 同 じ 名前は指定で き ま
せん。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
403
抽象プランの検索
抽象プランの検索
sp_find_qplan を使用す る と 、 ク エ リ ・ テキ ス ト と プ ラ ン ・ テキ ス
ト を チ ェ ッ ク し て、 特定の パ タ ー ン に一致す る プ ラ ン を 検索で き
ま す。
次の例は、 ク エ リ に文字列 “from titles” が含ま れて い る すべて の プ
ラ ン を 検索 し ま す。
sp_find_qplan "%from titles%"
次の例では、 テーブル ・ ス キ ャ ン が実行 さ れ る すべて の抽象プ ラ
ン を 検索 し ま す。
sp_find_qplan "%t_scan%"
プ ロ シ ー ジ ャ sp_find_qplan を シ ス テ ム管理者ま た はデー タ ベー ス
所有者が実行す る と 、 すべて の ユーザが所有す る プ ラ ン に つ い て
検索 と レ ポー ト が行われ ま す。 そ の他の ユーザが こ の プ ロ シ ー
ジ ャ を 実行す る と 、 sp_find_qplan はそ の ユーザが所有す る プ ラ ン
に つ い て検索 と レ ポー ト を 行い ま す。
1 つ の抽象プ ラ ン ・ グループ の み を 検索す る に は、 グループ名 を
指定 し ま す。 次の例では、 test_plans グループ の み を 対象 と し て特
定の イ ン デ ッ ク ス を 使用す る すべて の プ ラ ン を 検索 し ま す。
sp_find_qplan "%i_scan title_id_ix%", test_plans
一致す る プ ラ ン が あ る と 、 sp_find_qplan はそ の グループ ID、 プ ラ
ン ID、 ク エ リ ・ テキ ス ト 、 お よ び抽象プ ラ ン ・ テキ ス ト を 出力 し
ま す。
個々の抽象プランの管理
シ ス テ ム ・ プ ロ シ ー ジ ャ を 使 う と 、 ク エ リ の出力、 個々の プ ラ ン
の テキ ス ト の出力、 個々の プ ラ ン の コ ピ ー、 削除、 比較、 あ る い
は特定の ク エ リ に関連づけ ら れて い る プ ラ ン の変更 を 行え ま す。
404
Adaptive Server Enterprise
第 14 章
システム・プロシージャを使用した抽象プランの管理
プランの表示
sp_help_qplan を 使用す る と 、 個々の抽象プ ラ ン の レ ポー ト を 作成
で き ま す。 作成で き る レ ポー ト の種類は brief、 full、 list の 3 種類で
す。 brief を 指定す る と 、 ク エ リ と プ ラ ン の最初の 78 文字の レ ポー
ト が作成 さ れ ま す。 full を 指定す る と 、 ク エ リ ま た はプ ラ ン の全体
を 見 ら れ ま す。 list を 指定す る と 、 ク エ リ お よ びプ ラ ン の最初の
20 文字の み を 表示で き ま す。
次の例では、 デ フ ォ ル ト の簡単な レ ポー ト が作成 さ れ ま す。
sp_help_qplan 588529130
gid
hashkey
id
----------- ----------- ----------8 1460604254
588529130
query
--------------------------------------------------------------select min(price) from titles
plan
--------------------------------------------------------------(plan
(i_scan type_price titles)
()
)
(prop titles
(parallel ...
シ ス テ ム管理者ま た はデー タ ベ ー ス所有者は、 sp_help_qplan を 実
行 し てデー タ ベー ス に あ る ど の プ ラ ン に つ い て も レ ポー ト を 作成
で き ま す。 他の ユーザは、 自分が所有す る プ ラ ン の み を 表示で き
ま す。
sp_help_qpgroup を 実行す る と 、 1 つ の グループ内の すべて の プ ラ
ン の レ ポー ト を 作成で き ま す。 詳細に つ い ては、 「グループ に つ
い て の情報の取得」 (400 ペ ー ジ ) を 参照 し て く だ さ い。
別のグループへのプランのコピー
sp_copy_qplan を 使用す る と 、 あ る グループ に あ る 抽象プ ラ ン を 既
存の別の グループ に コ ピ ーで き ま す。 次の例では、 プ ラ ン ID が
316528161 の プ ラ ン を 現在の グループか ら prod_plans グループへ
コ ピ ー し ま す。
sp_copy_qplan 316528161, prod_plans
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
405
個々の抽象プランの管理
sp_copy_qplan は、 コ ピ ー先の グループ に同 じ ク エ リ がすで に存在
す る か ど う か を チ ェ ッ ク し ま す。 重複の可能性が あ る と 、
sp_copy_qplan は sp_cmp_qplans を 実行 し て コ ピ ー先グループ に あ
る プ ラ ン を チ ェ ッ ク し ま す。 sp_cmp_qplans に よ っ て出力 さ れ る
メ ッ セー ジ の他に、 以下の場合に sp_copy_qplan に よ り メ ッ セ ー ジ
が出力 さ れ ま す。
•
コ ピ ー し よ う と し て い る ク エ リ やプ ラ ン が、 すで に コ ピ ー先
グループ に あ る 場合
•
同 じ グループ内の別の プ ラ ン の ユーザ ID と ハ ッ シ ュ ・ キーが
同 じ 場合
•
同 じ グループ内の別の プ ラ ン の ハ ッ シ ュ ・ キーが同 じ で、 ク
エ リ が違 う 場合
ハ ッ シ ュ ・ キー の競合が あ っ て も 、 プ ラ ン は コ ピ ー さ れ ま す。 コ
ピ ー先グループ に すで に同 じ プ ラ ン が あ る 場合、 あ る い は コ ピ ー
に よ り 関連づけ キー の競合が発生す る 場合は、 プ ラ ン の コ ピ ーは
行われ ま せん。 sp_copy_qplan に よ っ て出力 さ れ る メ ッ セ ー ジ に は
コ ピ ー先グループ に あ る プ ラ ン の プ ラ ン ID が含 ま れて い る の で、
sp_help_qplan を 使用 し てそ の ク エ リ と プ ラ ン を チ ェ ッ ク で き ま す。
シ ス テ ム管理者ま た はデー タ ベ ー ス所有者は、 ど の抽象プ ラ ン で
も コ ピ ーで き ま す。 そ の他の ユーザは、 自分が所有す る プ ラ ン の
み を コ ピ ーで き ま す。 sp_copy_qplan を 実行 し て も 、 元の プ ラ ン お
よ びグループ に は何の影響 も あ り ま せん。 コ ピ ー さ れたプ ラ ン に
は、 新 し い プ ラ ン ID、 コ ピ ー先グループ の ID、 お よ びそ の プ ラ
ン を 作成 し た ク エ リ を 実行 し たユーザの ユーザ ID が割 り 当て ら
れ ま す。
個々の抽象プランの削除
sp_drop_qplan を 使用す る と 、 個々の抽象プ ラ ン を 削除で き ま す。
次の例では、 指定 さ れた プ ラ ン が削除 さ れ ま す。
sp_drop_qplan 588529130
シ ス テ ム管理者ま た はデー タ ベ ー ス所有者は、 デー タ ベー ス に あ
る ど の抽象プ ラ ン で も 削除で き ま す。 そ の他の ユーザは、 自分が
所有す る プ ラ ン の み を 削除で き ま す。
406
Adaptive Server Enterprise
第 14 章
システム・プロシージャを使用した抽象プランの管理
抽象プ ラ ン ID を 見つ け る に は、 sp_find_qplan を 使用 し て ク エ リ と
プ ラ ン の パ タ ー ン を 利用 し てプ ラ ン の検索 を 行 う か、
sp_help_qpgroup を 使用 し てグループ内の プ ラ ン の リ ス ト を 表示 し
ま す。
2 つの抽象プランの比較
2 つ の プ ラ ン ID が あ る と き に、 sp_cmp_qplans を 使用す る と そ の抽
象プ ラ ン と 関連づけ ら れて い る ク エ リ を 比較で き ま す。 次に例 を
示 し ま す。
sp_cmp_qplans 588529130, 1932533918
sp_cmp_qplans を 実行す る と 、 次の よ う に ク エ リ の比較結果の レ
ポー ト と そ の プ ラ ン に つ い て の レ ポー ト が出力 さ れ ま す。
•
•
2 つ の ク エ リ の場合は、 次の いずれか に な り ま す。
•
ク エ リ が同 じ で あ る 。
•
ク エ リ が異な る 。
•
ク エ リ が異な る が、 ハ ッ シ ュ ・ キーは同 じ で あ る 。
プ ラ ン の場合は、 次の いずれか に な り ま す。
•
ク エ リ ・ プ ラ ン が同 じ で あ る 。
•
ク エ リ ・ プ ラ ン が異な る 。
次の例では、 ク エ リ と プ ラ ン の両方が一致す る 2 つ の プ ラ ン を 比
較 し て い ま す。
sp_cmp_qplans 411252620, 1383780087
ク エ リ が同 じ で あ る 。
ク エ リ ・ プ ラ ン が同 じ で あ る 。
次の例では、 ク エ リ は一致す る がプ ラ ン が異な る 2 つ の プ ラ ン を
比較 し て い ま す。
sp_cmp_qplans 2091258605, 647777465
ク エ リ が同 じ で あ る 。
ク エ リ ・ プ ラ ン が異な る 。
sp_cmp_qplans は、 比較結果 を 示す ス テー タ ス値 を 返 し ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
407
個々の抽象プランの管理
表 14-1: sp_cmp_qplans が返すステータス値
戻り値
0
+1
+2
+10
100
意味
ク エ リ ・ テキ ス ト と 抽象プ ラ ン が同 じ で あ る 。
ク エ リ と ハ ッ シ ュ ・ キーが異な る 。
ク エ リ が異な る が、 ハ ッ シ ュ ・ キーは同 じ で あ る 。
抽象プ ラ ン が異な る 。
プ ラ ン ID の一方、 ま たは両方が存在 し な い。
シ ス テ ム管理者ま た はデー タ ベ ー ス所有者は、 デー タ ベー ス に あ
る ど の 2 つ の抽象プ ラ ン で も 比較で き ま す。 そ の他の ユーザは、
自分が所有す る プ ラ ン の み を 比較で き ま す。
既存のプランの変更
sp_set_qplan を 使用す る と 、 既存の プ ラ ン ID の抽象プ ラ ン を 、 そ
の ID ま た は ク エ リ ・ テキ ス ト を 変更せずに変更で き ま す。
sp_set_qplan は、 プ ラ ン の テキ ス ト が 255 文字以下の場合に だけ使
用で き ま す。
sp_set_qplan 588529130, "( i_scan title_ix titles)"
シ ス テ ム管理者ま た はデー タ ベ ー ス所有者は、 保存 さ れて い る ど
の ク エ リ の抽象プ ラ ン で も 変更で き ま す。 そ の他の ユーザは、 自
分が所有す る プ ラ ン の み を 変更で き ま す。
sp_set_qplan を 実行す る と 、 新 し い抽象プ ラ ン が ク エ リ に有効か ど
う か、 あ る い はテーブル と イ ン デ ッ ク ス がすで に あ る か ど う か を
チ ェ ッ ク す る た め の ク エ リ ・ テキ ス ト と の比較は行われ ま せん。
そ の プ ラ ン の有効性 を チ ェ ッ ク す る に は、 そ の プ ラ ン に関連づけ
ら れて い る ク エ リ を 実行す る 必要が あ り ま す。
そ の抽象プ ラ ン を ク エ リ に指定す る に は、 create plan と plan 句
を 使用 し ま す。 詳細に つ い ては、 「SQL に よ る プ ラ ン の作成」
(353 ペ ー ジ ) を 参照 し て く だ さ い。
408
Adaptive Server Enterprise
第 14 章
システム・プロシージャを使用した抽象プランの管理
グループにあるすべてのプランの管理
シ ス テ ム ・ プ ロ シ ー ジ ャ を 使用す る と 、 あ る 抽象プ ラ ン ・ グルー
プ に あ る すべて の プ ラ ン を 別の グループ に コ ピ ー し た り 、 2 つ の
グループお よ び レ ポー ト に あ る すべて の抽象プ ラ ン を 比較 し
た り 、 1 つ の グループ に あ る すべて の抽象プ ラ ン を 削除 し た り
で き ま す。
グループにあるすべてのプランのコピー
sp_copy_all_qplans を 使用す る と 、 あ る 抽象プ ラ ン ・ グループ に あ
る すべて の プ ラ ン を 別の グループ に コ ピ ーで き ま す。 次の例 を 実
行す る と 、 test_plans グループ に あ る すべて の プ ラ ン が
helpful_plans グループ に コ ピ ー さ れ ま す。
sp_copy_all_qplans test_plans, helpful_plans
helpful_plans グループは、 sp_copy_all_qplans を 実行す る 前に存在 し
て い る 必要が あ り ま す。 こ の プ ロ シ ー ジ ャ に は、 別の プ ラ ン を 追
加で き ま す。
sp_copy_all_qplans は、 sp_copy_qplan を 実行 し てそ の グループ の
個々の プ ラ ン を コ ピ ーす る の で、 sp_copy_qplan が失敗す る よ う な
要因が あ れば、 こ の プ ロ シ ー ジ ャ も 失敗 し ま す。 詳細に つ い て
は、 「2 つ の抽象プ ラ ン の比較」 (407 ペ ー ジ ) を 参照 し て く だ さ い。
各プ ラ ン の コ ピ ーはそれぞれ独立 し た ト ラ ン ザ ク シ ョ ン で行われ
る の で、 1 つ の プ ラ ン の コ ピ ー に失敗 し て も sp_copy_all_qplans は
失敗 し ま せん。 し か し 、 sp_copy_all_qplans が何 ら か の理由で失敗
し 、 再実行す る 必要が あ る と き に は、 すで に正常に コ ピ ー さ れた
プ ラ ン に つ い て の メ ッ セ ー ジ ・ セ ッ ト が表示 さ れ、 ど の プ ラ ン が
すで に コ ピ ー先グループ に あ る かがわ か り ま す。
コ ピ ー さ れた各プ ラ ン に は、 新 し い プ ラ ン ID が割 り 当て ら れ ま
す。 コ ピ ー さ れたプ ラ ン に は元の ユーザ ID が割 り 当て ら れ ま す。
抽象プ ラ ン を コ ピ ー し てそれ に新 し い ユーザ ID を 割 り 当て る に
は、 sp_export_qpgroup と sp_import_qpgroup を 使用す る 必要が あ り
ま す。 詳細に つ い ては、 「プ ラ ン ・ グループ の イ ン ポー ト と エ ク
ス ポー ト 」 (413 ペ ー ジ ) を 参照 し て く だ さ い。
シ ス テ ム管理者ま た はデー タ ベ ー ス所有者は、 デー タ ベー ス に あ
る ど の プ ラ ン で も コ ピ ーで き ま す。 そ の他の ユーザは、 自分が所
有す る プ ラ ン の み を コ ピ ーで き ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
409
グループにあるすべてのプランの管理
グループにあるすべてのプランの比較
sp_cmp_all_qplans を 使用す る と 、 2 つ の グループお よ び レ ポー ト に
あ る すべて の抽象プ ラ ン を 比較で き ま す。
•
2 つ の グループで共通の プ ラ ン の数
•
同 じ 関連づけ キー を 持つ が、 抽象プ ラ ン が異な る プ ラ ン の数
•
片方の グループ に あ っ て、 も う 1 つ の グループ に な い プ ラ ン
の数
次の例では ap_stdout と ap_stdin の プ ラ ン を 比較 し ま す。
sp_cmp_all_qplans ap_stdout, ap_stdin
If the two query plans groups are large, this might take some
time.
Query plans that are the same
count
----------338
Different query plans that have the same association key
count
----------25
Query plans present only in group 'ap_stdout' :
count
----------0
Query plans present only in group 'ap_stdin' :
count
----------1
さ ら に レ ポー ト ・ モ ー ド ・ パ ラ メ ー タ を 1 つ追加す る と 、
sp_cmp_all_qplans は ID、 ク エ リ 、 お よ びグループ に あ る ク エ リ の
抽象プ ラ ン を 含む詳細な情報 を 出力 し ま す。 こ の モ ー ド ・ パ ラ
メ ー タ を 使用す る と 、 すべて の プ ラ ン、 ま た は特定の違い が あ る
プ ラ ン に つ い て の詳細情報 を 取得で き ま す。
410
Adaptive Server Enterprise
第 14 章
システム・プロシージャを使用した抽象プランの管理
表 14-2: sp_cmp_all_qplans のレポート・モード
モード
counts
brief
same
diff
first
second
offending
full
レポート内容
同一の プ ラ ン、 同 じ 関連づけキー を持つ プ ラ ン、 同一あ
る い は同 じ 関連づけ キー を持つが別の グループ に属す る
プ ラ ン、 同 じ グループ に あ る プ ラ ン、 同 じ グループ に あ
る が別の グループ に は な い プ ラ ン の数。 こ れはデ フ ォ ル
ト の レ ポー ト ・ モ ー ド で あ る 。
counts で取得 さ れ る 情報の ほ か に、 プ ラ ン自体は異な る
が関連づけ キーが同 じ で あ る よ う な各グループ に あ る 抽
象プ ラ ン の ID、 お よ び片方の グループ に あ っ て別の グ
ループ に は な い プ ラ ン の ID。
すべて の カ ウ ン ト と 、 ク エ リ と プ ラ ン が一致す る すべて
の抽象プ ラ ン の ID、 ク エ リ 、 プ ラ ン。
すべて の カ ウ ン ト と 、 ク エ リ と プ ラ ン が異な る すべて の
抽象プ ラ ン の ID、 ク エ リ 、 プ ラ ン。
1 番目の プ ラ ン ・ グループ に あ る が 2 番目の プ ラ ン ・ グ
ループ に は な いすべて の抽象プ ラ ン の総数、 ID、 ク エ
リ 、 お よ びプ ラ ン。
すべて の カ ウ ン ト と 、 2 番目の プ ラ ン ・ グループ に属す
る が最初の プ ラ ン ・ グループ に は属 さ な いすべて の抽象
プ ラ ン の ID、 ク エ リ 、 プ ラ ン。
すべて の カ ウ ン ト と 、 結合キーが異な る か、 ま たは両方
の グループ に は属 さ な いすべて の抽象プ ラ ン の ID、 ク エ
リ 、 プ ラ ン。 こ れは、 diff、 first、 second の 3 つ の モ ー ド
の レ ポー ト 結果を合わせた も の と 同 じ で あ る 。
すべて の カ ウ ン ト と 、 すべて の抽象プ ラ ン の ID、 ク エ
リ 、 プ ラ ン。 こ れは、 same と offending の 2 つ の モ ー ド
の レ ポー ト 内容を合わせた も の と 同 じ で あ る 。
次の例は、 brief レ ポー ト ・ モ ー ド を 示 し て い ま す。
sp_cmp_all_qplans ptest1, ptest2, brief
If the two query plans groups are large, this might take some time.
Query plans that are the same
count
----------39
Different query plans that have the same association key
count
----------4
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
411
グループにあるすべてのプランの管理
ptest1
ptest2
id1
id2
----------- ----------764529757 1580532664
780529814 1596532721
796529871 1612532778
908530270 1724533177
Query plans present only in group 'ptest1' :
count
----------3
id
----------524528902
1292531638
1308531695
Query plans present only in group 'ptest2' :
count
----------1
id
----------2108534545
1 つのグループのすべての抽象プランの削除
sp_drop_all_qplans を 使用す る と 、 1 つ の グループ に あ る すべて の
抽象プ ラ ン を 削除で き ま す。 次の例では、 dev_plans グループ に あ
る すべて の抽象プ ラ ン を 削除 し ま す。
sp_drop_all_qplans dev_plans
シ ス テ ム管理者あ る い はデー タ ベ ー ス所有者が sp_drop_all_qplans
を 実行す る と 、 指定 し た グループか ら すべて の ユーザに属す る す
べて の プ ラ ン が削除 さ れ ま す。 それ以外の ユーザが こ の プ ロ シ ー
ジ ャ を 実行す る と 、 そ の ユーザが所有す る プ ラ ン の みが対象 と な
り ま す。
412
Adaptive Server Enterprise
第 14 章
システム・プロシージャを使用した抽象プランの管理
プラン・グループのインポートとエクスポート
sp_export_qpgroup お よ び sp_import_qpgroup を 使用す る と 、
sysqueryplans と ユーザ ・ テーブルの間で相互に プ ラ ン ・ グループ
を コ ピ ーで き ま す。 シ ス テ ム管理者あ る い はデー タ ベー ス所有者
が こ の プ ロ シ ー ジ ャ を 実行す る と 、 次の操作が可能です。
•
抽象プ ラ ン を 1 つ のデー タ ベー ス か ら 同 じ サーバ上に あ る 別
のデー タ ベ ー ス に コ ピ ーす る
•
bcp を 使用 し て現在のサーバか ら 外部へ コ ピ ーで き る テーブ
ル を 作成 し 、 それ を 別の サーバ に コ ピ ーす る
•
同 じ デー タ ベ ー ス に あ る 既存の プ ラ ン に別の ユーザ ID を 割 り
当て る
プランのユーザ・テーブルへのエクスポート
sp_export_qpgroup を 使用す る と 、 抽象プ ラ ン ・ グループ に あ る 特
定の ユーザの すべて の プ ラ ン を ユーザ ・ テーブル に コ ピ ーで き ま
す。 次の例では、 fast_plans グループか ら デー タ ベ ー ス所有者 (dbo)
が所有す る プ ラ ン を コ ピ ー し 、 transfer と い う テーブル を 作成 し
ま す。
sp_export_qpgroup dbo, fast_plans, transfer
sp_export_qpgroup は select...into を 使用 し て、 sysqueryplans と 同 じ カ
ラ ム と デー タ 型 を 持つ テーブル を 作成 し ま す。 そ のデー タ ベー ス
で select into/bulkcopy/pllsort オプ シ ョ ン を 有効に設定 し て い な い と
き に は、 別のデー タ ベー ス名 を 指定で き ま す。 こ の コ マ ン ド を 実
行す る と 、 tempdb に エ ク ス ポー ト ・ テーブルが作成 さ れ ま す。
sp_export_qpgroup mary, ap_stdout, "tempdb..mplans"
bcp を 使用 し てテーブル を 外部に コ ピ ー し た り 、 テーブル を 別の
サーバ上の テーブル に コ ピ ー し た り で き ま す。 プ ラ ン は、 同 じ
サーバ上の別のデー タ ベ ー ス に あ る sysqueryplans に イ ン ポー ト す
る こ と も 、 同 じ デー タ ベ ー ス に あ る sysqueryplans に別の グループ
名ま た はユーザ ID を 使用 し て イ ン ポー ト す る こ と も で き ま す。
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
413
プラン・グループのインポートとエクスポート
ユーザ・テーブルからのプランのインポート
sp_import_qpgroup を 使用す る と 、 プ ラ ン を sp_export_qpgroup を 使
用 し て作成 さ れた テーブルか ら sysqueryplans に あ る グループ に コ
ピ ーで き ま す。 次の例では、 プ ラ ン がテーブル tempdb.mplans か ら
ap_stdin に コ ピ ー さ れ、 そ のデー タ ベ ー ス所有者の ユーザ ID が割
り 当て ら れ ま す。
sp_import_qpgroup "tempdb..mplans", dbo, ap_stdin
指定 し たユーザの プ ラ ン に すで に含ま れて い る グループへは、
プ ラ ン を コ ピ ーで き ま せん。
414
Adaptive Server Enterprise
索引
記号
C
() ( カ ッ コ )
SQL 文内 xix
, ( カンマ )
SQL 文内 xx
::= (BNF 表記 )
SQL 文内 xix
[ ] ( 角カ ッ コ )
SQL 文内 xx
{} ( 中カ ッ コ )
SQL 文内 xix
close on endtran オプ シ ョ ン、 set
close コ マ ン ド
メ モ リ 278
compute by 処理 99
cursor rows オプ シ ョ ン、 set
292
291
D
datachange 関数
統計値
312
deallocate cursor コ マ ン ド
メモ リ
数字
2 段階の ス カ ラ 集合
278
declare cursor コ マ ン ド
メモ リ
178
277
delete statistics コ マ ン ド
統計値の管理
A
abstract plan cache 設定パ ラ メ ー タ
352
abstract plan dump 設定パ ラ メ ー タ
352
abstract plan load 設定パ ラ メ ー タ
352
abstract plan replace 設定パ ラ メ ー タ
352
ALS
ユーザ ・ ロ グ ・ キ ャ ッ シ ュ 253
ALS。 「非同期 ロ グ ・ サー ビ ス」 を参照
B
Backus Naur Form (BNF) 表記
BNF 表記、 SQL 文内 xix
330
delete 演算子 71, 209
drop index コ マ ン ド
xix
統計値
E
emit 演算子
252
330
59
exchange
演算子 160
ワ ー カ ー ・ プ ロ セス ・ モー ド
exchange、 パ イ プ管理 161
exists check モ ー ド
348
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
163
415
索引
F
L
for update オプ シ ョ ン、 declare cursor
290
forceplan オプ シ ョ ン、 set
from table 62
最適化
240
G
group sorted agg
演算子 95
group sorted agg 演算子 95
GroupSorted (Distinct) 演算子
94
I/O
ク エ リ に サ イ ズ を指定 245
更新オペ レ ー シ ョ ン 34
直接更新 32
範囲 ク エ リ 245
IDENTITY カ ラ ム
カ ー ソ ル 281
insert
71, 209
J
Job Scheduler
update statistics 315
jtc オプ シ ョ ン、 set 257
416
N
nary nested loop join 演算子
nested loop join 79
null カ ラ ム
更新の最適化 40
I
演算子
M
max repartition degree
設定 147
max resource granularity
設定 147
merge join 演算子 81
merge union 演算子 102
MRU 置換方式、 無効可 251
H
hash join
演算子 84
hash union
演算子 103
hash vector aggregate
演算子 97
HashDistinctOp 演算子
91
Lava
演算子 26
ク エ リ ・ エ ン ジ ン 24
ク エ リ 実行 30
ク エ リ ・ プ ラ ン 25
log scan 68
LRU 置換方式
指定 250
86
O
open コ マ ン ド
メ モ リ 278
or 述部
ジ ョ イ ン 17
OR 方式、 カ ー ソ ル
or リ ス ト 60
289
P
plan dump オプ シ ョ ン、 set 341
plan load オプ シ ョ ン、 set 343
Adaptive Server Enterprise
索引
plan replace オプ シ ョ ン、 set
I/O
prefetch キー ワ ー ド
344
set コ マ ン ド
forceplan 240
jtc 257
sort_merge 255
plan dump 341
plan exists 348
plan load 343
plan replace 344
246
prefetch
251
ク エ リ 246
デー タ ・ ペー ジ 247
無効化 248
有効化 248
prefetch キー ワ ー ド 、 I/O サ イ ズ
process_limit_action 215
sp_cachestrategy
Q
QP 測定基準
R
remote scan 演算子 110
restrict 演算子 105
RID join 演算子 112
RID scan 66
S
104
scan
演算子 60
scroll 演算子 111
select コ マ ン ド
イ ンデ ッ ク ス の指定 243
select-into ク エ リ 206
sequencer
演算子 109
set
XML コ マ ン ド 124
set plan dump コ マ ン ド
342
set plan exists check 348
set plan load コ マ ン ド
343
set plan replace コ マ ン ド
344
ScalarAggOp 演算子
例
246
150
shared キー ワ ー ド 、 カ ー ソ ル
showplan
279
使用 43, 215
文レ ベルの出力 50
sort_merge オプ シ ョ ン、 set 255
SortOp (Distinct) 演算子 93
sp_add_qpgroup シ ス テ ム ・ プ ロ シ ー ジ ャ
399
sp_cachestrategy シ ス テ ム ・ プ ロ シ ー ジ ャ
251
sp_chgattribute シ ス テ ム ・ プ ロ シ ー ジ ャ
concurrency_opt_threshold 272
sp_cmp_qplans シ ス テ ム ・ プ ロ シ ー ジ ャ
407
sp_copy_all_qplans シ ス テ ム ・ プ ロ シ ー ジ ャ
409
sp_copy_qplan シ ス テ ム ・ プ ロ シ ー ジ ャ
405
sp_drop_all_qplans シ ス テ ム ・ プ ロ シ ー ジ ャ
412
sp_drop_qpgroup シ ス テ ム ・ プ ロ シ ー ジ ャ
400
sp_drop_qplan シ ス テ ム ・ プ ロ シ ー ジ ャ
406
sp_export_qpgroup シ ス テ ム ・ プ ロ シ ー ジ ャ
413
sp_find_qplan シ ス テ ム ・ プ ロ シ ー ジ ャ
404
sp_help_qpgroup シ ス テ ム ・ プ ロ シ ー ジ ャ
400
sp_help_qplan シ ス テ ム ・ プ ロ シ ー ジ ャ
405
sp_import_qpgroup シ ス テ ム ・ プ ロ シ ー ジ ャ
414
sp_set_qplan シ ス テ ム ・ プ ロ シ ー ジ ャ
408
sqfilter、 演算子 114
SQL
並列処理 166
SQL 規格
カ ー ソ ル 274
SQL 抽出テーブル 362
SQL テーブル
抽出 22
store
演算子 106
sysquerymetrics ビ ュ ー
ク エ リ 処理測定基準 297
set rowcount
オプ シ ョ ン
156
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
417
索引
あ
T
table count オプ シ ョ ン、 set
text delete、 演算子 72
truncate table コ マ ン ド
カ ラ ム レ ベルの統計値
242
ア クセス
ク エ リ 処理測定基準
ア プ リ ケ ー シ ョ ン開発
イ ン デ ッ ク ス の指定
カ ー ソ ル 292
319
294
244
U
い
union all
演算子 101
逐次 182
並列 180
union 演算子
カ ー ソ ル 289
update 209
update all statistics
イ ンデ ッ ク ス
update index statistics
update statistics 324
321
325
update index statistics 321, 324, 328
update statistics 308
with consumers 句 329
カ ラ ム レ ベル 324
カ ラ ム レ ベルの統計値 324
統計値の管理 319
update statistics の影響 を小 さ く す る
update 演算子 71
update all statistics コ マ ン ド
329
W
324
カ ー ソ ル に よ る 使用 280
ク エ リ へ の指定 243
更新オペ レ ー シ ョ ン 33, 34
更新モ ー ド 41
大容量 I/O 245
探索引数 13
イ ン デ ッ ク ス ・ ス キ ャ ン 172
カ バー さ れて い な い、 グ ロ ーバル ・ ノ ン ク ラ ス
タ ー ド 172
カ バー ド 、 ノ ン ク ラ ス タ ー ド ・ グ ロ ーバル を
使用 176
ク ラ ス タ ー ド 176
ク ラ ス タ ー ド 、 分割 さ れたテーブル 177
グ ロ ーバル ・ ノ ン ク ラ ス タ ー ド 172
ノ ン ク ラ ス タ ー ド 、 分割 さ れたテーブル 177
イ ン デ ッ ク ス未設定カ ラ ム 307
statistics 句、 create index コ マ ン ド
319
with statistics 句、 create index コ マ ン ド
319
え
演算
X
209
insert、 delete、 update
演算子
XML
124
診断出力 124
パー ミ ッ シ ョ ン 132
廃止に な っ た ト レ ー ス ・ コ マ ン ド
delete 演算子 71
exchange 160
set
group sorted agg
129
95
group sorted agg 95
GroupSorted (Distinct)
hash join 84
hash union 103
hash vector aggregate
418
91
97
Adaptive Server Enterprise
索引
94
Lava 26
merge union 102
nary nested loop join 86
remote scan 110
restrict 105
RID join 112
ScalarAggOp 104
scan 60
scroll 111
sequencer 109
SortOp (Distinct) 93
sqfilter 114
store 106
text delete 72
union all 101
update 演算子 71
ク エ リ ・ プ ラ ン 59
最適化 5
ソ ー ト 105
ベ ク ト ル集合 95
演算子、 emit 59
演算子、 insert 演算子 71
演算子、 merge join 81
演算子、 不等 14
エ ン ジ ン、 ク エ リ 実行 24
HashDistinctOp
お
オーバヘ ッ ド
カ ー ソ ル 285
遅延更新 35
大文字 と 小文字の区別
SQL xxi
置き換え更新 32
オブ ジ ェ ク ト ・ サ イ ズ
チ ュ ーニ ン グ 23
オプ シ ョ ン
set rowcount 156
オプテ ィ マ イ ザ 40–42
上書き 235
クエ リ 3
更新 40
か
カーソル
イ ンデ ッ ク ス 280
更新可能 279
実行 279
ス ト ア ド ・ プ ロ シ ー ジ ャ 279
独立性レ ベル 287
ハ ロ ウ ィ ー ン問題 281
複数 292
モ ー ド 279
読み込み専用 279
ロ ッ ク 276
カ ー ソ ルの フ ェ ッ チ、 メ モ リ 278
「角カ ッ コ [ ]」 を参照
角カ ッ コ [ ]
SQL 文内 xx
数(量)
カ ー ソ ル ・ ロ ー 291
オプテ ィ マ イ ザが検討す る テーブル数
カ ッ コ ()
SQL 文内 xix
カ バー ド ・ ク エ リ
キ ャ ッ シ ュ 方式の指定 249
カ ラ ム レ ベルの統計値 319
truncate table 319
update statistics 319
update statistics の生成 324
関数
datachange、 統計値 312
カ ン マ (,)
SQL 文内 xx
管理、 統計値 319
関連付け キー
sp_cmp_all_qplans 410
sp_copy_qplan 406
定義 340
プ ラ ン の関連付け 340
242
き
キー、 イ ンデ ッ ク ス
更新オペ レ ー シ ョ ン
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
33
419
索引
記号
SQL 文内 xix
共有 ロ ッ ク
読み込み専用カ ー ソ ル
279
く
クエリ
I/O サ イ ズの指定 245
IN リ ス ト を含む 198
Lava 実行 30
order by 句を含む 202
OR 句 200
select-into 句 206
イ ン デ ッ ク ス の指定 243
オプテ ィ マ イ ザ 3
最適化時間の制限 19
実行の設定 43
並列実行モデル 159
並列処理 144
並列で実行 さ れな い 213
ロ ー カ ル変数の設定 157
ク エ リ 、 最適化の問題 21
ク エ リ 最適化の問題 21
ク エ リ 、 実行エ ン ジ ン 24
ク エ リ 処理
並列 143
ク エ リ 処理測定基準
sysquerymetrics ビ ュ ー 297
ア ク セ ス 294
ク リ ア 299
実行開始時 294
使用 296
ク エ リ 処理測定基準の ク リ ア 299
ク エ リ と プ ラ ン の関連づけ
セ ッ シ ョ ン レ ベル 343
ク エ リ と プ ラ ン の関連付け
プ ラ ン ・ グループ 339
ク エ リ の最適化 123
ク エ リ の並列処理の制御 151
ク エ リ ・ プ ラ ン 54
Lava 25
演算子 59
420
更新可能カ ー ソ ル
並列 157
ク エ リ 分析 40–42
sp_cachestrategy
showplan 43
290
251
クエ リ ・ プラ ン
最良の次に良い 243
ク ラ ス タ ー ド ・ イ ンデ ッ ク ス
プ リ フ ェ ッ チ 246
け
結果、 異な る 並列 ク エ リ
検索、 抽象プ ラ ン 404
156
こ
高 コ ス ト の直接更新 34
更新オペ レ ー シ ョ ン 32
更新カ ー ソ ル 279
更新モ ー ド
イ ン デ ッ ク ス 41
置き換え 32
高 コ ス ト の直接更新モ ー ド
最適化 40
ジ ョ イ ン 35
遅延 35
遅延 イ ン デ ッ ク ス 36
直接 35
低 コ ス ト の直接更新モ ー ド
ト リ ガ 39
更新 ロ ッ ク
カ ー ソ ル 279
構文規則、 Transact-SQL xix
固定長カ ラ ム
イ ン デ ッ ク ス と 更新モ ー ド
異な る 並列 ク エ リ 結果 156
コ ピー
抽象プ ラ ン 405
プ ラ ン 405, 409
プ ラ ン ・ グループ 409
34
33
42
Adaptive Server Enterprise
索引
さ
最適化
演算子 5
カ ー ソ ル 278
ク エ リ 最適化の時間制限 19
ク エ リ の変形 8
述部変形 11
探索引数の例 14
追加の パ ス 11
方法 5
最適化の問題 21
最適化、 分析 さ れ る 要素 7
最適化、 目標 18
最適化目標、 例外 19
削除
index で指定 さ れた イ ン デ ッ ク ス
抽象プ ラ ン ・ グループ 400
プ ラ ン 406, 412
削除オペ レ ー シ ョ ン
ジ ョ イ ン で の更新モ ー ド 35
ジ ョ イ ン と 更新モ ー ド 35
削除パーテ ィ シ ョ ン 211
作成
カ ラ ム統計値 320
探索引数 21
抽象プ ラ ン ・ グループ 399
サブ ク エ リ 203
参照整合性
更新 35
更新オペ レ ー シ ョ ン 33
制約 74
サンプ リ ング
統計値 310
統計値更新の た め の使用 310
す
し
式、 ジ ョ イ ン
実行
17
set noexec on で回避
実行カ ー ソ ル
メ モ リ 使用
244
実行開始時
ク エ リ 処理測定基準 294
自動的
update statistics 315
集合指向プ ロ グ ラ ミ ン グ
ロ ー指向プ ロ グ ラ ミ ン グ と の比較 274
述部変形 11
出力
XML 診断 124
文 50
順序、 ジ ョ イ ン 17
順序、 ジ ョ イ ン の テーブル 240
ジ ョ イ ン 15
or 述部 17
演算子 79
オプテ ィ マ イ ザが検討す る テーブル数 242
外部 194
更新 33, 34, 35
更新モ ー ド 35
混合デー タ型 16
式 17
順序 17
セ ミ 194
逐次 192
テーブルの順序 240
ヒ ス ト グ ラ ム 15
並行処理、 テーブルが同様に有効に分割 さ れて
い る 場合 183
並列処理 183
並列処理、 1 つ の テーブルが有効に分割 さ れて
い る 場合 185
並列処理、 複写 189
密度 15
両方の テーブルの分割が無効な場合 187
279
43
推移閉包
探索引数 9
等価ジ ョ イ ン
ス カ ラ 集合
2 段階 178
逐次 179
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
10
421
索引
スキ ャ ン
イ ン デ ッ ク ス 172
イ ン デ ッ ク ス、 カ バー ド 、 ノ ン ク ラ ス タ ー ド ・
グ ロ ーバル を使用 176
イ ン デ ッ ク ス ・ グ ロ ーバル ・ ノ ン ク ラ ス タ ー ド
172
ク ラ ス タ ー ド ・ イ ン デ ッ ク ス 176
グ ロ ーバル ・ ノ ン ク ラ ス タ ー ド の カ バー さ れて い
な い イ ン デ ッ ク ス 172
ノ ン ク ラ ス タ ー ド 、 分割 さ れた テーブル 177
分割 さ れた テーブルの ク ラ ス タ ー ド ・ イ ン デ ッ ク
ス 177
ロ ー カ ル ・ イ ン デ ッ ク ス 176
ス キ ャ ン ・ タ イ プ統計 327
ス キ ュ ー、 分割 212
ス ト ア ド ・ プロ シージ ャ
カ ー ソ ル 283
せ
セ ッ シ ョ ン ・ レ ベルで の並列処理の制御
接続
カ ー ソ ル 292
設定
max repartition degree 147
max resource granularity 147
max scan parallel degree 148
number of worker processes 145
最大並列度 146
ロ ー カ ル変数 157
422
38
た
大容量 I/O
ペー ジ で ロ ー を検出
探索引数
イ ン デ ッ ク ス 13
最適化の例 14
作成 21
推移閉包 9
探索引数、 変換 9
245
149
ち
そ
ソー ト
演算子 105
統計値、 イ ン デ ッ ク ス未設定カ ラ ム
ソ ー ト 条件
統計値 327
属性に依存す る 演算
並列処理 183
属性非反映型演算
並列処理 167
速度 ( サーバ )
イ ン デ ッ ク ス の遅延削除
置き換え更新 32
高 コ ス ト の直接更新 34
更新 32
遅延更新 35
直接更新 32
低 コ ス ト の直接更新 33
328
遅延
イ ン デ ッ ク ス の更新 36
更新 35
逐次
union all 182
ス カ ラ 集合 179
逐次テーブル ・ ス キ ャ ン 168
中カ ッ コ {}、 SQL 文内 xix
抽出テーブル
SQL 抽出テーブル 362
SQL 22
SQL 抽出テーブル 362
抽象プ ラ ン の抽出テーブル 362
抽象プ ラ ン
sp_help_qplan を使用 し た表示 405
関連情報 405
コ ピ ー 405
パ タ ー ン一致 404
比較 407
表示 404
Adaptive Server Enterprise
索引
抽象プ ラ ン ・ グループ
イ ン ポー ト 414
エ ク ス ポー ト 413
管理の た め の プ ロ シ ー ジ ャ 399–413
関連情報 400
削除 400
作成 399
使用の概要 339
追加 399
プ ラ ン の関連付け 339
プ ラ ン の取得 339
抽象プ ラ ン ・ グループ の イ ン ポー ト 414
抽象プ ラ ン の検索 404
抽象プ ラ ン の修正 408
抽象プ ラ ン の抽出テーブル 362
抽象プ ラ ン の比較 407
チ ュ ーニ ン グ
オブ ジ ェ ク ト ・ サ イ ズ に応 じ た 23
高度な手法 235–272
範囲 ク エ リ 244
調整
実行時の管理 214
実行時の認識 214
実行時の発生回数の削減 216
ラ ン タ イ ム 214
重複
更新パ フ ォ ー マ ン ス の影響 35
直接更新 32
置き換え 32
高 コ ス ト 34
ジ ョ イ ン 35
低 コ ス ト 33
つ
追加
イ ンデ ッ ク ス未設定カ ラ ム に対す る 統計値
307
抽象プ ラ ン ・ グループ 399
て
低 コ ス ト の直接更新 33
デー タ型
ジ ョ イ ン 16
デー タ ・ ペー ジ の プ リ フ ェ ッ チ 247
デー タ変更の更新モ ー ド 32
テーブル ・ ス キ ャ ン
逐次 168
パーテ ィ シ ョ ン ベー ス 170
ハ ッ シ ュ ベー ス 169
並列 169
並列処理 168
強制的に実行 243
手順
遅延更新 35
直接更新 32
テ ス ト 、 イ ンデ ッ ク ス の強制 244
デッ ド ロ ッ ク
テーブル ・ ス キ ャ ン 272
同時実行性の最適化ス レ ッ シ ョ ル ド の設定
272
デバ ッ グ の た め の ツ ール
set forceplan on 240
デ フ ォ ル ト 設定
検討 さ れ る テーブル数 242
と
度
最大並列度の設定 146
等価ジ ョ イ ン、 推移閉包 10
統計
使用 303
統計値
datachange 関数 312
delete statistics でテーブル と カ ラ ム を削除
330
drop index 319
Job Scheduler の使用 315
truncate table 319
update statistics 308
イ ンデ ッ ク ス未設定カ ラ ム に対す る 追加 307
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
423
索引
イ ン デ ッ ク ス未設定カ ラ ム の ソ ー ト 328
カ ラ ム統計値の作成 320
カ ラ ム レ ベル 319, 321, 324
更新 306, 320
サ ン プ リ ン グ 310
自動的な update statistics 315
ス キ ャ ン ・ タ イ プ 327
ソ ー ト 条件 327
追加の統計値の取得 322
ロ ッ キ ン グ 327
統計値管理 319
統計値の更新 306, 310, 320
サ ン プ リ ン グ の使用 310
統計値の ソ ー ト 、 非先行カ ラ ム 328
統計値の追加 307
同時実行性の最適化
小 さ い テーブル 272
同時実行性の最適化ス レ ッ シ ョ ル ド
デ ッ ド ロ ッ ク 272
独立性 レ ベル
カ ー ソ ル 287
ト ラ ンザ ク シ ョ ン ・ ロ グ、 更新オペ レ ー シ ョ ン
ト リガ
更新オペ レ ー シ ョ ン 33
更新モ ー ド 39
廃止に な っ た ト レ ー ス ・ コ マ ン ド
XML 129
パ イ プ管理、 exchange 161
ハ ッ シ ュ ベー ス ・ テーブル ・ ス キ ャ ン 169
バ ッ フ ァ が使用で き な い 248
パ フ ォ ーマ ン ス
オプテ ィ マ イ ザが検討す る テーブル数 243
ハ ロ ウ ィ ー ン問題
カ ー ソ ル 281
範囲 ク エ リ 、 大容量 I/O 245
ひ
32
ヒス ト グラム
ジ ョ イ ン 15
ス テ ッ プ、 数 325
非先行カ ラ ム の ソ ー ト 統計値 328
ビュー
sysquerymetrics、 ク エ リ 処理測定基準
表記規則
Transact-SQL 構文 xix
「構文」 も 参照
リ フ ァ レ ン ス ・ マ ニ ュ ア ル xix
297
ふ
複合 イ ン デ ッ ク ス
な
名前
244
イ ンデ ッ ク ス のプ リ フ ェ ッ チ
index 句
247
ね
ネ ッ ト ワーク
カ ー ソ ルの ア ク テ ィ ビ テ ィ
は
パー ミ ッ シ ョ ン
XML 132
424
285
update index statistics 324
複写、 更新オペ レ ー シ ョ ン 33
不等、 演算子 14
部分プ ラ ン
create plan を 使用 し た指定 338
プラ ン
検索 404
コ ピ ー 405, 409
削除 406, 412
比較 407
表示 404
変更 408
プ ラ ン ・ グループ
エ ク ス ポー ト 413
関連情報 400
Adaptive Server Enterprise
索引
コ ピ ー 409
削除 400
作成 399
使用の概要 339
すべて の プ ラ ン の削除 412
追加 399
テーブルへ の コ ピ ー 413
プ ラ ン の関連付け 339
プ ラ ン の取得 339
レ ポー ト 400
プ ラ ン ・ グループ の エ ク ス ポー ト
プ ラ ン の削除 406, 412
プ ラ ン の取得
セ ッ シ ョ ン レ ベル 342
分割
テーブル ・ ス キ ャ ン 170
分割 (partition)
削除 211
ス キ ュ ー 212
文 レ ベルの出力 50
413
へ
並列
max resource granularity の設定
union all 180
ク エ リ 実行モデル 159
ク エ リ 処理 143
ク エ リ ・ プ ラ ン 157
最大度の設定 146
テーブル ・ ス キ ャ ン 169
並列処理 20
2 段階の ベ ク ト ル集合 196
IN リ ス ト を含む ク エ リ 198
order by 句を含む ク エ リ 202
OR 句を含む ク エ リ 200
SQL 演算 166
外部ジ ョ イ ン 194
ク エ リ 144
ク エ リ で の制御 151
個別の ベ ク ト ル集合 198
再 フ ォ ー マ ッ ト 190
147
再分割 し た ベ ク ト ル集合 195
ジ ョ イ ン 183
ジ ョ イ ン、 1 つ の テーブルが有効に分割 さ れて
い る 場合 185
ジ ョ イ ン、 テーブルが同様に有効に分割 さ れて
い る 場合 183
ジ ョ イ ン、 複写 189
ジ ョ イ ン、 両方の テーブルの分割が無効な場合
187
セ ッ シ ョ ン ・ レ ベルで の制御 149
セ ミ ジ ョ イ ン 194
属性に依存す る 演算 183
属性非反映型演算 167
逐次ジ ョ イ ン 192
逐次ベ ク ト ル集合 197
テーブル ・ ス キ ャ ン 168
内分割ベ ク ト ル集合 194
ベ ク ト ル集合 194
並列処理度
ワ ー カ ー ・ プ ロ セ ス の数の設定 145
並列処理の再 フ ォ ー マ ッ ト 190
並列処理の有効化 145
並列度、 最大ス キ ャ ン の設定 148
ペー ジ、 デー タ
プ リ フ ェ ッ チ 247
ベ ク ト ル集合 194
2 段階 196
distinct 198
再分割 195
逐次 197
内分割 194
ベ ク ト ル集合演算子 95
変換 さ れ る 探索引数 9
変形
ク エ リ の最適化 8
述部 11
変数、 ロ ー カ ルの設定 157
ほ
方法、 最適化
パフォーマンス&チューニング・シリーズ:クエリ処理と抽象プラン
5
425
索引
ま
ら
マ イ ナー ・ カ ラ ム
update index statistics
ランタイム
調整 214
調整回数の削減 216
調整の管理 214
調整の認識 214
324
み
密度、 ジ ョ イ ン
15
れ
め
メ ッ セ ー ジ、 イ ン デ ッ ク ス の削除
メモ リ
カ ー ソ ル 276
メ ン テナ ン ス作業
forceplan の チ ェ ッ ク
240
強制 さ れた イ ン デ ッ ク ス 244
244
ろ
ロ ー ID (RID) 更新オペ レ ー シ ョ ン 32
ロ ー ・ カ ウ ン ト 統計、 不正確 331
ロ ッ キング
統計値 327
も
目標、 最適化 18
目標、 最適化の例外
例外、 最適化目標 19
レ ポー ト
キ ャ ッ シ ュ 方式 251
プ ラ ン ・ グループ 400
19
わ
ゆ
有効化、 並列処理
ユーザ ID
145
sp_import_qpgroup を使用 し た変更 414
ユーザ ・ ロ グ ・ キ ャ ッ シ ュ 、 ALS 内 253
ユニー ク ・ イ ン デ ッ ク ス
更新モ ー ド 41
ワーカー ・ プロセス
数の設定 145
ワ ー カ ー ・ プ ロ セ ス ・ モー ド
exchange 163
よ
要素、 最適化の た め に分析 7
読み込み専用カ ー ソ ル 279
イ ン デ ッ ク ス 280
ロ ッ ク 285
426
Adaptive Server Enterprise
Fly UP