[SQL][DB2] 効率的なSELECT文

*必要な列だけを指定する。
*応答セットを必要な行のみに制限できる述語(WHERE条件)を使う。
*必要な行数が戻される行数の合計より少ない場合は、
 【OPTIMIZE FOR】を指定する。
*検出する行数が少ない場合は、
 【OPTIMIZE FOR k ROWS】文節だけを指定する。
 ※【FETCH FIRST n ROWS ONLY】文節は不要。
  ただし、
  nの値が大きいので初めのk行を取り出してから、
  後でまたk行を取り出したい場合には、
  両方の文節を指定する。
  ※通信バッファのサイズとして
   nとk中で小さい方が使われる。
    ex.
    SELECT EMPNAME, SALARY FROM EMPLOYEE
     ORDER BY SALARY DESC
     FETCH FIRST 100 ROWS ONLY
     OPTIMIZE FOR 20 ROWS
*行ブロッキングを利用するには、
 【FOR READ ONLY】または、
 【FOR FETCH ONLY】文節を指定する。
 この指定によって、
 検出された行に排他ロックが掛けられなくなる。
 ※【BLOCKING ALL BIND】オプション
  と一緒に
  【FOR READ ONLY】
  または
  【FOR FETCH ONLY】文節
  を指定すれば、
  フェデレーテッド・システム内の
  ニックネームに対する照会の性能も向上する。
*位置指定の更新を使用して更新するカーソルには、
 【FOR UPDATE OF】文節を指定する。
 ※【FOR UPDATE】カーソルは、
  行ブロッキングの利点は生かせない。
*検索済み更新を使用して更新するカーソルには、
 【FOR READ ONLY】
 および
 【USE AND KEEP UPDATE LOCKS】文節
 を使用して影響を受ける行を強制的にUロックすると
 デッドロックを回避し、
 行ブロッキングを引き続き使用できる。
*出来るだけ数値データ・タイプの変換はしない。
 以下データ・タイプが使用出来れば一番。
  +短い列には VARCHAR型よりCHAR型
  +浮動小数点には 10進数より整数
  +文字列型より日時
  +文字列型より数値
*必要ない【DISTINCT】や【ORDER BY】等は省略して
 ソート操作が発生する可能性を小さくする。
*表に行があるか調べる時は
 単一の行を選択する。
 カーソルをオープンして1つの行を取り出すか、
 単一行(SELECT INTO)選択を実行する。
 複数の行が検出される場合はSQLCODE -811か調べる。
 ↓は性能的にNG!
 SELECT COUNT(*) FROM TABLENAME
*更新活動が低調で表が非常に大きい場合は、
 述語として頻繁に使用する列に索引を定義する。
*複数の述部文節に同じ列がある場合は、
 INリストの使用を考慮する。


-FOR UPDATE: 後のUPDATE文で更新できる列を指定
-FOR READ/FETCH ONLY: 戻される列が読み取り専用
-OPTIMIZE FOR n ROWS: 全結果セットの中の最初のn行の検索を優先
-FETCH FIRST n ROWS ONLY: 指定された数の行だけを検索
-DECLARE CURSOR WITH HOLD: 一度に1つずつ行を検索


ref:
http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/admin/c0005283.htm
http://typea.info/tips/wiki.cgi?page=DB2+SELECT%A5%B9%A5%C6%A1%BC%A5%C8%A5%E1%A5%F3%A5%C8%BA%C7%C5%AC%B2%BD

tag : DB2 SQL

2009-06-16 00:23 : 開発 : コメント : 0 : トラックバック : 0 :
コメントの投稿
非公開コメント

« next  ホーム  prev »

search

ad



counter


tag cloud

category cloud