• ベストアンサー

PL/SQLのパフォーマンスについて

PL/SQLで、元のプログラムから、部品プログラム(以下のTEST_BUHIN)を呼ぶ際の、 パフォーマンスについてお聞きしたいことがあります。 Oracle8i環境を使っています。 以下の2つをコンパイルすると考えてください。 -------------------------------------------------- CREATE OR REPLACE TYPE test_type as object (  COL1 NUMBER(11),  COL2 VARCHAR2(20),    (実際には、40項目くらいあります)   ); / -------------------------------------------------- CREATE OR REPLACE PACKAGE BODY TEST_BUHIN AS  PROCEDURE TESTINSERT(TESTDATA IN test_type)  AS  BEGIN   INSERT INTO TESTTABLE VALUES(    TESTDATA.COL1,TESTDATA.COL2, ・・・    (以下略) -------------------------------------------------- 今、TESTTABLEにINSERTするプログラムを作成したいのですが、 パフォーマンスを最優先に考えたいと思っています。 その場合、元のプログラム内にINSERT文を作るべきか、 部品(TEST_BUHIN)を使用すべきか迷っています。 パフォーマンスがほぼ同じであれば、部品(TEST_BUHIN)を使用したいと思っています。 部品を使うとパフォーマンスが極端に落ちるということであれば、 部品はコンパイルせずに、元のプログラム内にINSERT文を作成しようと思います。 オブジェクトタイプ型変数を引数として渡した場合、 パフォーマンスへの影響はあるのでしょうか? 自分でも調べてみたのですが、いまいち分かりませんでした。 あと、大きな引数を渡した場合に、メモリをたくさん使ってしまうのかどうかも気になります。 文章が分かりづらいと思いますので、みなさんのご意見などを見て補足させていただきます。 Oracle、PL/SQLに詳しい方、よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • jmh
  • ベストアンサー率23% (71/304)
回答No.2

in は by reference だと思います。

cucsna
質問者

お礼

回答ありがとうございます。 確か、集約のSQLのときも回答いただいた方ですよね。 前回に引き続きありがとうございます。 回答を拝見した感じでは、アドレスを渡しているという感じなのでしょうか? だとすると、パラメータを渡すことで、特にパフォーマンスが落ちるとか、 メモリを余分に使うことはない、という印象を持ったのですが・・・ 知識が乏しいため、もう少し詳しい説明などいただけるとありがたいです。 よろしくお願いいたします。

cucsna
質問者

補足

お礼欄を使ってしまったので、こちらに書かせていただきます。 「by reference」という文字を頼りに探したところ、Oracleのリファレンスにたどり着くことができました。 英語が分からないので、知り合いに解読してもらって、理解しました。 割と急ぎだったのでとても助かりました。ありがとうございました。

その他の回答 (1)

回答No.1

inset文の埋め込みやストアド呼び出しの場合ですと、そんなにパフォーマンスは変わらない気がします。ただ、ストアドの場合ですと、共有プールに固定できるので若干速くなるのではと。 共有プールに固定する方法は [$ORA_HOME]\RDBMS\ADMIN\DBMSPOOL.SQLを流した後、 execute dbms_shared_pool.keep('[オーナ].TEST_BUHIN')を流せばできます。 これであればalter system flush shared_poolが実行されても開放されません。 >オブジェクトタイプ型変数を引数として渡した場合、 >パフォーマンスへの影響はあるのでしょうか? ごめんなさい。これはよくわかりません。たぶん、TYPEのサイズに比例するだけだとは思いますが...。 たいしたアドバイスでなくて申し訳ないです。

cucsna
質問者

お礼

ありがとうございました。 コーディングやコード内のロジックにしか目がいっていなかったのですが、パフォーマンスチューニングの方法をいろいろ調べるきっかけになりました。 ありがとうございました。

cucsna
質問者

補足

回答ありがとうございます。 呼び出し元のプログラムもストアドにするので、INSERT文のパフォーマンスは差がなさそうです。 >>オブジェクトタイプ型変数を引数として渡した場合、 >>パフォーマンスへの影響はあるのでしょうか? >ごめんなさい。これはよくわかりません。たぶん、TYPEの>サイズに比例するだけだとは思いますが...。 ということは、オブジェクトタイプのサイズが大きいと、 部品を呼び出す際のパフォーマンスが下がるということでしょうか? 引数を渡す際の、メモリとか、裏の動きが分からないので、さっぱり見当がついてないのですが・・・。 知識がないため、質問自体がグチャグチャですみません。 また何か気づかれましたら、よろしくお願いいたします。

関連するQ&A