- ベストアンサー
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に詳しい方、よろしくお願いいたします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
in は by reference だと思います。
その他の回答 (1)
- kazuho_goo
- ベストアンサー率56% (34/60)
inset文の埋め込みやストアド呼び出しの場合ですと、そんなにパフォーマンスは変わらない気がします。ただ、ストアドの場合ですと、共有プールに固定できるので若干速くなるのではと。 共有プールに固定する方法は [$ORA_HOME]\RDBMS\ADMIN\DBMSPOOL.SQLを流した後、 execute dbms_shared_pool.keep('[オーナ].TEST_BUHIN')を流せばできます。 これであればalter system flush shared_poolが実行されても開放されません。 >オブジェクトタイプ型変数を引数として渡した場合、 >パフォーマンスへの影響はあるのでしょうか? ごめんなさい。これはよくわかりません。たぶん、TYPEのサイズに比例するだけだとは思いますが...。 たいしたアドバイスでなくて申し訳ないです。
お礼
ありがとうございました。 コーディングやコード内のロジックにしか目がいっていなかったのですが、パフォーマンスチューニングの方法をいろいろ調べるきっかけになりました。 ありがとうございました。
補足
回答ありがとうございます。 呼び出し元のプログラムもストアドにするので、INSERT文のパフォーマンスは差がなさそうです。 >>オブジェクトタイプ型変数を引数として渡した場合、 >>パフォーマンスへの影響はあるのでしょうか? >ごめんなさい。これはよくわかりません。たぶん、TYPEの>サイズに比例するだけだとは思いますが...。 ということは、オブジェクトタイプのサイズが大きいと、 部品を呼び出す際のパフォーマンスが下がるということでしょうか? 引数を渡す際の、メモリとか、裏の動きが分からないので、さっぱり見当がついてないのですが・・・。 知識がないため、質問自体がグチャグチャですみません。 また何か気づかれましたら、よろしくお願いいたします。
お礼
回答ありがとうございます。 確か、集約のSQLのときも回答いただいた方ですよね。 前回に引き続きありがとうございます。 回答を拝見した感じでは、アドレスを渡しているという感じなのでしょうか? だとすると、パラメータを渡すことで、特にパフォーマンスが落ちるとか、 メモリを余分に使うことはない、という印象を持ったのですが・・・ 知識が乏しいため、もう少し詳しい説明などいただけるとありがたいです。 よろしくお願いいたします。
補足
お礼欄を使ってしまったので、こちらに書かせていただきます。 「by reference」という文字を頼りに探したところ、Oracleのリファレンスにたどり着くことができました。 英語が分からないので、知り合いに解読してもらって、理解しました。 割と急ぎだったのでとても助かりました。ありがとうございました。