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に詳しい方、よろしくお願いいたします。
No.2ベストアンサー
- 回答日時:
in は by reference だと思います。
この回答への補足
お礼欄を使ってしまったので、こちらに書かせていただきます。
「by reference」という文字を頼りに探したところ、Oracleのリファレンスにたどり着くことができました。
英語が分からないので、知り合いに解読してもらって、理解しました。
割と急ぎだったのでとても助かりました。ありがとうございました。
回答ありがとうございます。
確か、集約のSQLのときも回答いただいた方ですよね。
前回に引き続きありがとうございます。
回答を拝見した感じでは、アドレスを渡しているという感じなのでしょうか?
だとすると、パラメータを渡すことで、特にパフォーマンスが落ちるとか、
メモリを余分に使うことはない、という印象を持ったのですが・・・
知識が乏しいため、もう少し詳しい説明などいただけるとありがたいです。
よろしくお願いいたします。
No.1
- 回答日時:
inset文の埋め込みやストアド呼び出しの場合ですと、そんなにパフォーマンスは変わらない気がします。
ただ、ストアドの場合ですと、共有プールに固定できるので若干速くなるのではと。共有プールに固定する方法は
[$ORA_HOME]\RDBMS\ADMIN\DBMSPOOL.SQLを流した後、
execute dbms_shared_pool.keep('[オーナ].TEST_BUHIN')を流せばできます。
これであればalter system flush shared_poolが実行されても開放されません。
>オブジェクトタイプ型変数を引数として渡した場合、
>パフォーマンスへの影響はあるのでしょうか?
ごめんなさい。これはよくわかりません。たぶん、TYPEのサイズに比例するだけだとは思いますが...。
たいしたアドバイスでなくて申し訳ないです。
この回答への補足
回答ありがとうございます。
呼び出し元のプログラムもストアドにするので、INSERT文のパフォーマンスは差がなさそうです。
>>オブジェクトタイプ型変数を引数として渡した場合、
>>パフォーマンスへの影響はあるのでしょうか?
>ごめんなさい。これはよくわかりません。たぶん、TYPEの>サイズに比例するだけだとは思いますが...。
ということは、オブジェクトタイプのサイズが大きいと、
部品を呼び出す際のパフォーマンスが下がるということでしょうか?
引数を渡す際の、メモリとか、裏の動きが分からないので、さっぱり見当がついてないのですが・・・。
知識がないため、質問自体がグチャグチャですみません。
また何か気づかれましたら、よろしくお願いいたします。
ありがとうございました。
コーディングやコード内のロジックにしか目がいっていなかったのですが、パフォーマンスチューニングの方法をいろいろ調べるきっかけになりました。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL 次の時間帯の勝率の合計を求めるSQL文 1 2023/07/04 17:12
- その他(データベース) Microsoft Accessについて 1 2022/06/06 16:20
- PHP プログラムコードを入力する場合改行してもいいですか? 2 2022/10/02 16:05
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- PHP php エラー 2 2022/10/23 16:43
- Excel(エクセル) Excel 、この式はどのように解釈すればいいのでしょうか 4 2023/02/03 08:53
- Visual Basic(VBA) VBAでfunctionを利用しようとしたときに「引数は省略できません」というエラーが出ます 1 2022/10/15 16:30
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- その他(プログラミング・Web制作) ZWCAD CUIXとLISPの関係について 1 2022/09/28 03:07
- PHP php エラー 3 2022/11/18 23:32
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PL/SQL exceptionを呼び出すには?
-
ストアドプロシジャからストア...
-
PL/SQLに関して
-
OracleのTEXT_IOについて
-
INSERT文の書式
-
ストアド実行時のエラー「参照...
-
ROW_NUMBER()を使用したデータ取得
-
ストアドプロシージャからアナ...
-
Accessのマクロでモジュールを...
-
Access VBAで行ラベルが定義さ...
-
likeとsubstrの使いわけについて
-
SQLサーバで和暦から西暦に変換...
-
PL/SQLカーソルの2重FORループ...
-
Statement ignored というエラー
-
sqlplusでヘッダーが付かない
-
Accessの数値から時間に変換す...
-
或るプロシージャの呼び出し元判定
-
エクセルVBAでUserFormを起動し...
-
PL/SQLでのSQL文法
-
全角空白のTRIMができない...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ストアドプロシジャからストア...
-
時間項目を60進数から10進数へ...
-
ストアド実行時のエラー「参照...
-
PL/SQL exceptionを呼び出すには?
-
ROW_NUMBER()を使用したデータ取得
-
ストアドプロシージャからアナ...
-
質問:DBMS_OUTPUTの使用方法
-
PL/SQLで連結(||)と結合(=>)の違い
-
ストアドプロシージャからスト...
-
パッケージ内のファンクション...
-
PL/SQLのファンクションでのOUT...
-
INSERT文の書式
-
PL/SQL 実行中のSID
-
PL/SQLの例外
-
GET_DDLについて
-
Function内に記述したdbms_outp...
-
Oracle: PACKAGE BODY の分割
-
OracleのTEXT_IOについて
-
動的SQL
-
PL/SQLについて
おすすめ情報