17.6.1 チューニング手順の例
pdvwoptの出力結果に基づいてチューニングをする方法の例を次に示します。17.6.2〜17.6.4の観点を基にチューニングをしてください。
***** Result of SQL Optimizer ***** Version : HiRDB/Parallel Server VV-RR 4BES UAP Name : pdsql -----------------------> UAP名は正しいか? UAP Source : pdsql-21775 Authorization : user1 -----------------------> 認可識別子名は正しいか? -------------------------------------------------------------------------------- Section No : 1 Optimize Time : 2001-01-07 10:59:16.591727 ---> SQL文を実行した時間は正しいか? Optimize Mode : COST_BASE_2 SQL Opt Level : 0x00000420(1056) = "PRIOR_NEST_JOIN"(32),"RAPID_GROUPING"(1024) Add Opt Level : 0x00000003(3) = "COST_BASE_2"(1),"APPLY_HASH_JOIN"(2) ------------> SQL最適化オプション,SQL拡張最適化オプションは最適か?※1 SQL : select T1.C1,T1.C2 from T1,T2,T3 where T1.C1='a' and T1.C2 like '%A' and T1.C1=T2.C1 and T1.C2=T2.C2 and T2.C3>=1995 and T1.C1=T3.C1 and T1.C2=T3.C2 order by T1.C2 --> SQL文は正しいか? Work Table : 3 Total Cost : 3314.567244 ----- QUERY ID : 1 ----- Query Type : QUERY LIST(SORT) {LLID1(2)} Order by Mode : FLOATABLE SORT FLT Server : 2 (ORDER BY) 2-CLM 1TO1 JOIN # Join ID : 1 ----------------------------> 表の結合順序は意図した通りか? L Table : T1 R Table : T2 Join Type : 2-CLM NESTED LOOPS JOIN(INNER) BROADCAST(FROM L TO R) -------------> 内表の分割キーを変更して,BROADCAST以外にできないか?※2 FLT Server : 0 # Join ID : 2 L Table : T3 R Join ID : 1 LIST{JRLST(1)} Join Type : 2-CLM HASH JOIN(INNER) 1-CLM HASH(FROM R TO L) -------------> 結合方式は意図した通りか?※3 FLT Server : 0 SCAN # Table Name : T1 Cost : N (10000000ROW) {T-2962.358541,I-763.682244,AND-766.202330} RDAREA : NON DIVISION (1RD/1BES) [0x07(7)] ALL Scan Type : MULTI COLUMNS KEY SCAN Index Name : X1 (2) (+C2,+C1) --------------> 意図したインデクスを使用しているか? SearchCnd : RANGE(CS-CE) [(MIN,'a '),(MAX,'a ')] (FULL SCAN) -----------------------------> サーチ範囲が絞り込まれているか?※4 KeyCnd : T1.C1='a ' AND T1.C2 like '%A' # Table Name : T2 Cost : N (20000000ROW) {T-1388.652368,I-408.252884,AND-2647.479838} RDAREA : 1-CLM FIX HASH(HASH6) (2RD/2BES) [0x07(7),0x0d(13)] ALL Scan Type : MULTI COLUMNS KEY SCAN Index Name : X2 (3) (+C1,+C2,+C3) SearchCnd : RANGE(CS-CE) [(T1.C1,T1.C2,1995),(T1.C1,T1.C2,MAX)] # Table Name : T3 Cost : N (20000000ROW) {T-1621.172368} RDAREA : 1-CLM FIX HASH(HASH6)(4RD/2BES)[0x07(7),0x08(8),0x0d(13),0x0e(14)]ALL Scan Type : TABLE SCAN ------------------> 意図したスキャンタイプになっているか?
注 この出力結果は一部編集しているため,実際の表示例とは異なります。
- 注※1
-
データベースの状態に最適なSQL最適化オプション,SQL拡張最適化オプションを指定しているか確認してください。
SQL最適化オプション,SQL拡張最適化オプションについては,マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。
- 注※2
-
ネストループジョイン時に転送方法がBROADCAST転送,KEY RANGE PARTIAL BROAD CAST転送,又はPARTIAL BROADCAST転送となる場合は,ネストループジョインの内表の分割キーを変更して,BROADCAST,KEY RANGE PARTIAL BROAD CAST,及びPARTIAL BROADCAST以外にすることで,性能が向上することがあります。
詳細については,「分割キーを使用したネストループジョイン」を参照してください。
- <変更前>
# Join ID : 1 L Table : T1 R Table : T2 Join Type : 2-CLM NESTED LOOPS JOIN(INNER) BROADCAST(FROM L TO R) FLT Server : 0
↓ 表T2の分割キーをC1(結合キー)にします。
- <変更後>
# Join ID : 1 L Table : T1 R Table : T2 Join Type : 2-CLM NESTED LOOPS JOIN(INNER) 1-CLM HASH(FROM L TO R) FLT Server : 0
最もデータの偏りの少ない列を分割キーにしてください。データの偏りの少ない列がなく,かつ複数の列で結合している場合には,結合列に使用している列から,それらを組み合わせることでデータの偏りが少なくなる列を複数選択して,分割キーに指定してください。
- 注※3
-
T1とT2の結合結果の件数が絞り込まれている場合,T1,T2の結合結果とT3をネストループジョインにした方が高速に検索できます。そこで,T3の列を含んでいる結合条件(T1.C1=T3.C1 and T1.C2=T3.C2)から,T3の列をすべて含む複数列インデクスT3(C1,C2)を定義します。
詳細については,「結合検索に使用する表のインデクス定義」を参照してください。
- <変更前>
# Join ID : 2 L Table : T3 R Join ID : 1 LIST{JRLST(1)} Join Type : 2-CLM HASH JOIN(INNER) 1-CLM HASH(FROM R TO L) FLT Server : 0 ・ ・ ・ # Table Name : T3 Cost : N (2000000000ROW) {T-1621.172368} RDAREA : 1-CLM FIX HASH (HASH6) (4RD/2BES) [...] ALL Scan Type : TABLE SCAN
↓ T3(C1,C2)にインデクスを定義します。
- <変更後>
# Join ID : 2 L Join ID : 1 R Table : T3 Join Type : 2-CLM NESTED LOOPS JOIN(INNER) 1-CLM HASH(FROM L TO R) FLT Server : 0 ・ ・ ・ # Table Name : T3 Cost : N (2000000000ROW) {T-1621.172368,T-1581.852884} RDAREA : 1-CLM FIX HASH (HASH6) (4RD/2BES) [...] ALL Scan Type : MULTI COLUMNS KEY SCAN Index Name : X3 (2D) (+C1,+C2) SearchCnd : AT [(T1.C1,T1,C2)]
- 注※4
-
インデクスの第1構成列に対する条件が範囲を形成できないため,インデクスの全範囲をサーチしてしまいます。インデクスの第2構成列に=があるため,インデクスの第1構成列と第2構成列を逆にします。
詳細については,「インデクスの定義」を参照してください。
- <変更前>
Index Name : X1 (2) (+C2,+C1) SearchCnd : RANGE(CS-CE) [(MIN,'a '),(MAX,'a ')] (FULL SCAN) KeyCnd : T1.C1='a ' AND T1.C2 like '%A'
- ↓
-
T1(C2,C1)のインデクスを削除し,T1(C1,C2)のインデクスを定義します。
- <変更後>
Index Name : X1 (2) (+C1,+C2) SearchCnd : RANGE(CS-CE) [('a ',MIN),('a '),MAX] KeyCnd : T1.C2 like '%A'