2013年3月17日日曜日

ビルド時に適用されるオプティマイズ(最適化)について

For eachコマンド(DBに対するクエリー)の記述に関して、ビルド時にGeneXusが分析した結果、生成するコードをオプティマイズ(最適化)するケースがあります。

For eachというとカーソルで結果セットをぐるぐるループしながら処理するイメージがあります。処理対象が数十万件を超えるとループ処理がネックになってきますが、オプティマイズ(最適化)が適用されると一回のSQLを実行するだけになり実行効率が上がるのです。

例えば、


1.レコード削除


  ・For eachコマンド
For each
       Where attribute = &val

          Delete
Endfor

  ・ナビゲーションレポート

  ・生成されるSQL
DELETE FROM table WHERE attribute = &val

2.カウント


  ・For eachコマンド
For each
       Where attribute = &val

          &count += 1
Endfor

  ・ナビゲーションレポート

  ・生成されるSQL
SELECT COUNT(*) FROM table WHERE  attribute = &val

3.集計


  ・For eachコマンド
For each
       Where attribute = &val

          &total += attribute
Endfor

  ・ナビゲーションレポート

  ・生成されるSQL
SELECT SUM(attribute) FROM table WHERE attribute = &val

4.1件取得


  ・For eachコマンド
For each
       Where attribute = &val

         &val=attribute
         Exit
Endfor

  ・ナビゲーションレポート

  ・生成されるSQL
・SQLServer
    SELECT TOP 1 attribute FROM table WHERE attribute = &val
・Oracle
    SELECT attribute FROM table WHERE attribute = &val AND ROWNUM <= 1



0 件のコメント:

コメントを投稿