2

Oracle 11g は配列に対して For ループを最適化しますか? もしそうなら、それはどのようにしますか?

例:
次のコードは、 の各インスタンスをlt_some_array(i)配列内の index のレコードへのポインタとして扱いますiか? それとも毎回調べますか?

FOR i IN lt_some_array.FIRST..lt_some_array.LAST
LOOP
   field1 := lt_some_array(i).field1;
   field2 := lt_some_array(i).field2;
   field3 := lt_some_array(i).field3;
   field4 := lt_some_array(i).field4;
   field5 := lt_some_array(i).field5;
   field6 := lt_some_array(i).field6;
   do_something();
END LOOP;

明確化:
コンパイラはそれを次のように扱いますか (ここで、lr_some_row はポインターであり、コピーではありません)。

FOR i IN lt_some_array.FIRST..lt_some_array.LAST
LOOP
   lr_some_row := lt_some_array(i);
   field1 := lr_some_row.field1;
   field2 := lr_some_row.field2;
   field3 := lr_some_row.field3;
   field4 := lr_some_row.field4;
   field5 := lr_some_row.field5;
   field6 := lr_some_row.field6;
   do_something();
END LOOP;
4

1 に答える 1

1

はい、Oracle11gがその最適化を実行します。

その機能は10gで追加されました。プレゼンテーション「PL/SQLのパフォーマンス-神話を暴く」の60ページを参照してください。コードに非常によく似た例が含まれています。手動による最適化は、9iR2ではほぼ2倍高速でしたが、10gR1ではまったく役に立ちません。

オラクルがどのようにそれを行っているかはわかりませんが。私の知る限り、Oracleがどのように機能するかについてのそのレベルの詳細は存在しません。

于 2012-08-14T17:31:54.900 に答える