スケーラブルデータベースサーバ HiRDB Version 8 コマンドリファレンス(UNIX(R)用)

[目次][索引][前へ][次へ]

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 8 UAP開発ガイド」を参照してください。

注※2
ネストループジョイン時に転送方法がBROADCAST転送,KEY RANGE PARTIAL BROAD CAST転送,又はPARTIAL BROADCAST転送となる場合は,ネストループジョインの内表の分割キーを変更して,BROADCAST,KEY RANGE PARTIAL BROAD CAST,及びPARTIAL BROADCAST以外にすることで,性能が向上することがあります。
詳細については,「17.6.4(1) 分割キーを使用したネストループジョイン」を参照してください。
<変更前>
 
 # 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)を定義します。
詳細については,「17.6.2(2) 結合検索に使用する表のインデクス定義」を参照してください。
<変更前>
 
 # 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構成列を逆にします。
詳細については,「17.6.2(1) インデクスの定義」を参照してください。
<変更前>
 
 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'