| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

「DB2 SELECTステートメント最適化」の版間の差分

提供: MyMemoWiki
ナビゲーションに移動 検索に移動
 
1行目: 1行目:
==DB2 SELECTステートメント最適化==
+
==[[DB2 SELECTステートメント最適化]]==
[[DB2]] | [[Database]] | {{category DBパフォーマンス}}{{category SQL}}
+
[[DB2]] | [[Database]] | [[Category:DBパフォーマンス}}{{category SQL]]
 
===Link===
 
===Link===
 
====SELECT====
 
====SELECT====
24行目: 24行目:
 
!内容
 
!内容
 
|-
 
|-
|FOR UPDATE
+
|FO[[R]] UPDATE
 
|その後に置く UPDATE ステートメントで更新できる列を指定
 
|その後に置く UPDATE ステートメントで更新できる列を指定
 
|-
 
|-
|FOR READ/FETCH ONLY
+
|FO[[R]] [[R]]EAD/FETCH ONLY
 
|戻される列を読み取り専用
 
|戻される列を読み取り専用
 
|-
 
|-
|OPTIMIZE FOR n ROWS
+
|OPTIMIZE FO[[R]] n [[R]]OWS
 
|全結果セットの中の最初の n 行の検索を優先
 
|全結果セットの中の最初の n 行の検索を優先
 
|-
 
|-
|FETCH FIRST n ROWS ONLY
+
|FETCH FI[[R]]ST n [[R]]OWS ONLY
 
|指定された数の行だけを検索
 
|指定された数の行だけを検索
 
|-
 
|-
|DECLARE CURSOR WITH HOLD
+
|DECLA[[R]]E CU[[R]]SO[[R]] WITH HOLD
 
| 一度に 1 つずつ行を検索
 
| 一度に 1 つずつ行を検索
 
|-
 
|-
46行目: 46行目:
 
*可能な限り、数値データ・タイプの変換はしない
 
*可能な限り、数値データ・タイプの変換はしない
 
*可能なら、以下のデータ・タイプを使用
 
*可能なら、以下のデータ・タイプを使用
**短い列では、VARCHAR 型ではなく、CHAR 型  
+
**短い列では、VA[[R]]CHA[[R]] 型ではなく、CHA[[R]] 型  
 
**浮動小数点数や 10 進数ではなく、整数  
 
**浮動小数点数や 10 進数ではなく、整数  
 
**文字列型ではなく、日時  
 
**文字列型ではなく、日時  
 
**文字列型ではなく、数値
 
**文字列型ではなく、数値
*DISTINCT または ORDER BY などの文節や操作を、必要でなければ省略
+
*DISTINCT または O[[R]]DE[[R]] BY などの文節や操作を、必要でなければ省略
 
*複数の述部文節に同じ列が存在する場合には、 IN リストを使用することを考慮します。大きい IN リストをホスト変数と共に使用すると、ホスト変数のサブセットのループインでパフォーマンスが向上する可能性があります
 
*複数の述部文節に同じ列が存在する場合には、 IN リストを使用することを考慮します。大きい IN リストをホスト変数と共に使用すると、ホスト変数のサブセットのループインでパフォーマンスが向上する可能性があります
 
*応答セットを必要な行のみに制限する述部を使用
 
*応答セットを必要な行のみに制限する述部を使用
*必要な行数が戻される行数の合計よりかなり少なくなる場合には、 OPTIMIZE FOR を指定
+
*必要な行数が戻される行数の合計よりかなり少なくなる場合には、 OPTIMIZE FO[[R]] を指定
*検出する行数が少ない場合には、 OPTIMIZE FOR k ROWS 文節だけを指定
+
*検出する行数が少ない場合には、 OPTIMIZE FO[[R]] k [[R]]OWS 文節だけを指定
*行ブロッキングを利用するには、 FOR READ ONLY または FOR FETCH ONLY 文節を指定してパフォーマンスを改善(検出された行には排他ロックがかけられない)
+
*行ブロッキングを利用するには、 FO[[R]] [[R]]EAD ONLY または FO[[R]] FETCH ONLY 文節を指定してパフォーマンスを改善(検出された行には排他ロックがかけられない)
*位置指定の更新を使用して更新するカーソルに対しては、 FOR UPDATE OF 文節を指定して、データベース・マネージャー が初めにより適切なロッキング・レベルを選択して、発生する可能性のあるデッドロックを回避できるようにします
+
*位置指定の更新を使用して更新するカーソルに対しては、 FO[[R]] UPDATE OF 文節を指定して、データベース・マネージャー が初めにより適切なロッキング・レベルを選択して、発生する可能性のあるデッドロックを回避できるようにします
*検索済み更新を使用して更新するカーソルに対しては、 FOR READ ONLY および USE AND KEEP UPDATE LOCKS 文節を使用して影響を受ける行を強制的に U ロックすると、デッドロックを回避し、行ブロッキングを引き続き使用できます
+
*検索済み更新を使用して更新するカーソルに対しては、 FO[[R]] [[R]]EAD ONLY および USE AND KEEP UPDATE LOCKS 文節を使用して影響を受ける行を強制的に U ロックすると、デッドロックを回避し、行ブロッキングを引き続き使用できます
 
*値を比較するとき、同じデータ・タイプの項目を使うようにする
 
*値を比較するとき、同じデータ・タイプの項目を使うようにする
  
63行目: 63行目:
 
*表を結合するには、結合述部を使用します。結合述部とは、1 つの結合において異なる表の 2 つの列を比較することです
 
*表を結合するには、結合述部を使用します。結合述部とは、1 つの結合において異なる表の 2 つの列を比較することです
 
*結合述部内で列に対して索引を定義し、それによって、その結合をさらに効率的に処理できるように
 
*結合述部内で列に対して索引を定義し、それによって、その結合をさらに効率的に処理できるように
*可能なら、結合述部で式または OR 文節を使用しない
+
*可能なら、結合述部で式または O[[R]] 文節を使用しない

2020年2月16日 (日) 04:24時点における最新版

DB2 SELECTステートメント最適化

DB2 | Database | [[Category:DBパフォーマンス}}{{category SQL]]

Link

SELECT

索引

最適化

  • オプティマイザーは、アプリケーションが必ず SELECT ステートメントで指定されているすべての行を検索することを想定
  • ブラウズアプリケーションにおいては、照会で定義されている結果の集合が大規模であっても、検索するのは最初のいくつかの行だけ、通常は画面をいっぱいにするのに十分な数の行だけであるということがよくあります

SELECT ステートメントを変更

対処 内容
FOR UPDATE その後に置く UPDATE ステートメントで更新できる列を指定
FOR READ/FETCH ONLY 戻される列を読み取り専用
OPTIMIZE FOR n ROWS 全結果セットの中の最初の n 行の検索を優先
FETCH FIRST n ROWS ONLY 指定された数の行だけを検索
DECLARE CURSOR WITH HOLD 一度に 1 つずつ行を検索

SELECT ステートメントについての指針

  • 必要な列だけを指定(*は避ける)
  • 表に行があるかどうか調べるときには、単一の行を選択(COUNT(*)は利用しない!!)
  • 可能な限り、数値データ・タイプの変換はしない
  • 可能なら、以下のデータ・タイプを使用
    • 短い列では、VARCHAR 型ではなく、CHAR
    • 浮動小数点数や 10 進数ではなく、整数
    • 文字列型ではなく、日時
    • 文字列型ではなく、数値
  • DISTINCT または ORDER BY などの文節や操作を、必要でなければ省略
  • 複数の述部文節に同じ列が存在する場合には、 IN リストを使用することを考慮します。大きい IN リストをホスト変数と共に使用すると、ホスト変数のサブセットのループインでパフォーマンスが向上する可能性があります
  • 応答セットを必要な行のみに制限する述部を使用
  • 必要な行数が戻される行数の合計よりかなり少なくなる場合には、 OPTIMIZE FOR を指定
  • 検出する行数が少ない場合には、 OPTIMIZE FOR k ROWS 文節だけを指定
  • 行ブロッキングを利用するには、 FOR READ ONLY または FOR FETCH ONLY 文節を指定してパフォーマンスを改善(検出された行には排他ロックがかけられない)
  • 位置指定の更新を使用して更新するカーソルに対しては、 FOR UPDATE OF 文節を指定して、データベース・マネージャー が初めにより適切なロッキング・レベルを選択して、発生する可能性のあるデッドロックを回避できるようにします
  • 検索済み更新を使用して更新するカーソルに対しては、 FOR READ ONLY および USE AND KEEP UPDATE LOCKS 文節を使用して影響を受ける行を強制的に U ロックすると、デッドロックを回避し、行ブロッキングを引き続き使用できます
  • 値を比較するとき、同じデータ・タイプの項目を使うようにする

複数の表にアクセスする SELECT ステートメント

  • 表を結合するには、結合述部を使用します。結合述部とは、1 つの結合において異なる表の 2 つの列を比較することです
  • 結合述部内で列に対して索引を定義し、それによって、その結合をさらに効率的に処理できるように
  • 可能なら、結合述部で式または OR 文節を使用しない