!!!DB2 SELECTステートメント最適化 [DB2][Database]{{category DBパフォーマンス}}{{category SQL}} !!Link !SELECT *効率的な SELECT ステートメント **http://publib.boulder.ibm.com/infocenter/db2luw/v9/index.jsp?topic=/com.ibm.db2.udb.admin.doc/doc/c0005283.htm *SELECT ステートメントの制限のガイドライン **http://publib.boulder.ibm.com/infocenter/db2luw/v9/topic/com.ibm.db2.udb.admin.doc/doc/c0005280.htm?resultof=%22%46%4f%52%20%46%45%54%43%48%20%4f%4e%4c%59%22%20 !索引 *パフォーマンスを向上させるためのリレーショナル索引の使用 **http://publib.boulder.ibm.com/infocenter/db2luw/v9/topic/com.ibm.db2.udb.admin.doc/doc/c0005052.htm *リレーショナル索引の計画のヒント **http://publib.boulder.ibm.com/infocenter/db2luw/v9/topic/com.ibm.db2.udb.admin.doc/doc/c0005054.htm *リレーショナル索引のパフォーマンスのヒント **http://publib.boulder.ibm.com/infocenter/db2luw/v9/topic/com.ibm.db2.udb.admin.doc/doc/c0005055.htm !!最適化 *オプティマイザーは、アプリケーションが必ず 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 文節を使用しない