
みなさん。こんにちは。
下記のsqlは、約66万行をテーブルに挿入します。
しかし、何時間経っても終わらない。
原因はそのsqlでプロシージャー「sp_getEOutSrcRate」を呼び出す
ことが分かりました。
しかし、Select分のみを実行すると、すぐに結果が出ます。
なぜinsert時性能は悪いかが分からない。
みなさんがぜひ原因と解決策を教えて頂きたいと思います。
よろしくお願いいたします。
Insert /*+ append */
Into tbl_temp_eoutsrcrate
(iengineeringid, ioutsrcassignmentid, ieinstallationtypeid, iprodcategoryid, seoutsourcetypelist, IOUTSRCRATE)
Select e.iengineeringid, o.ioutsrcassignmentid, e.ieinstallationtypeid, e.iprodcategoryid, o.seoutsourcetypelist,
round(sp_getEOutSrcRate(e.iengineeringid, e.ieinstallationtypeid, e.iprodcategoryid, o.seoutsourcetypelist), 2) rate
From tbl_epengineering e, tbl_epoutsrcassignment o
Where o.iengineeringid = e.iengineeringid
And e.icancelflag = 0
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.5
- 回答日時:
【解決策】
1.まず、実行計画を確認しましょう。appendヒントがうまく効いているか、知りたいですね。
explain plan for SQL文;
select * from table(dbms_xplan.display());
→ "LOAD AS SELECT"ならダイレクトパスインサートになっている(appendヒントが効いている)。しかし、これだけ遅いと、なっていないのではないか。なっていない場合は、"INSERT STATEMENT"(通常INSERT)のはず。
2.ダイレクトパスインサートにならない理由としては、トリガーが設定されていることが考えられます。
select * from user_triggers;
→ 当該テーブルにトリガーはついていないでしょうか?
3.トリガーがついているのであれば、それが無効化しても良いものであれば、無効にしてINSERTすれば、ダイレクトパスインサートできると思います。
alter table tbl_temp_eoutsrcrate disable all triggers;
SQL実行
-- 有効に戻す
alter table tbl_temp_eoutsrcrate enable all triggers;
しかし、意味があってトリガーがついているのであれば、単純に無効にするとダメかもですが、設計を確認してみてください。
【原因について】
トリガー以外だと、redoログやログバッファ、データファイルの配置や設定がまずくて更新処理が非常に遅いなんていう可能性もゼロではありません。はっきり特定するためには、トレースを取りましょう。
以下を実行するユーザにALTER SESSION権限が必要ですので無ければ権限付与してください。
alter session set sql_trace = true;
SQL実行
alter session set sql_trace = false;
→ v$parameterの"user_dump_dest"にtrcファイルが出力される。そのファイルをtkprofコマンドで整形した結果を確認すると、何に時間がかかったかが分かる。
No.4
- 回答日時:
#1です。
ひょっとして、単にinsertが遅いだけでは?
例えば、insert文(selectが付いていないもの)約66万行を実行しても
質問のinsert selectとほとんど同じ時間かかっているとか。
## 試せとはいっていません。念のため。
もし、そうだとすると、以下のアプローチが有効と思います。
create table tbl_temp_eoutsrcrate のinitialとnextはどうなっていましたか?
INSERTはテーブルが拡張されると極端に遅くなります。
nextのサイズを大きくしてみましょう。(Alter tableで変えてみてください。)
なお、appendヒント(/*+ append */のこと)使っているから、空きブロックを使わずに
ハイ・ウォーター・マーク以降にどんどん追加されるので、拡張がおきやすいです。
空きがたくさんあるのに拡張しているようなら、appendヒントをはずしてください。
appendヒントの注意点というかデメリットはここをみてもらうと分かりやすいかと。
http://www.atmarkit.co.jp/fdb/rensai/orasql12/or …
No.3
- 回答日時:
>しかし、Select分のみを実行すると、すぐに結果が出ます。
>なぜinsert時性能は悪いかが分からない。
【Selectのみの実行】と【Select/Insertの実行】は異なることを理解しましょう。
【Selectのみの実行】
対象:tbl_epengineering、tbl_epoutsrcassignment
【Select/Insertの実行】
対象:tbl_temp_eoutsrcrate、tbl_epengineering、tbl_epoutsrcassignment
上記のようにInsert時はSelectのみと異なりtbl_temp_eoutsrcrateへのINSERT処理が走ります。Selectが速くてもInsertが遅ければ、トータルの実行時間は遅くなります。
まず、sp_getEOutSrcRateを外した状態でInsertを実施した場合の速度を測定しなければ
本当にsp_getEOutSrcRateが原因かはわかりません。確認ずみでしょうか?
sp_getEOutSrcRateを外した状態でも遅い場合はtbl_temp_eoutsrcrate側に問題があると考えられます。tbl_temp_eoutsrcrateに索引やトリガーはついてますか?
TraceをとってSQLの実行計画を見ないことには第三者から指摘できるのはこれくらいです。
この回答への補足
sp_getEOutSrcRateを外した状態でInsertを実施した場合の速度は非常に遅いです。
また、tbl_temp_eoutsrcrateに索引やトリガーはついていないです。
No.1
- 回答日時:
sp_getEOutSrcRate
は何をやっていますか?
ひょっとしてシステム標準のストアドプロシジャですか?
(知っているバージョンでは見たことないけど)
・・・それなら、oracleのバージョンを書いてもらわないと。
違うならその中身が分からないと答えようがないです。
例えば、
tbl_temp_eoutsrcrate
を
sp_getEOutSrcRate
内部で使用しているなら
selectで処理したとき早く、insert selectで処理したとき非常に遅い
となり得ますが、sp_getEOutSrcRateの中身をみないとなんともいえません。
selectとinsert selectの両方について
explain planを取得して、中を見比べてみるというのも調べる方法ではあります。
・・・これも結果をもらわないとこちらとしてはわからないことに変わりはないですが。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL 下の画像はSQLの4大命令の性質をまとめたものであるらしいです UPDATE INSERT DELE 1 2023/06/07 15:36
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- Oracle 下記のsqlで取得されるレコード以外を取得する方法ありますでしょうか。 SELECT B.番号, B 2 2022/04/20 23:21
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- Access(アクセス) アクセス 有効なフィールド名、または式として認識できませんのエラー 3 2022/08/19 11:53
- PHP プログラムコードを入力する場合改行してもいいですか? 2 2022/10/02 16:05
- Oracle 質問です。 下記のテーブルとデータがあり、 取得想定結果のように出力したいです。 下記のsqlだと0 2 2023/05/23 19:10
- MySQL PhpMyAdminで作成して実行せよ。 東京23区を、皇居を中心とした4つのエリア(南東, 南西, 1 2023/06/11 11:58
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
このQ&Aを見た人はこんなQ&Aも見ています
-
selectした大量データをinsertしたい
MySQL
-
TruncateしたテーブルへのInsertの遅さが気になる
Oracle
-
データを削除しても表領域の使用率が減りません
Oracle
-
-
4
OracleのSQL*PLUSで、データが折り返されて見づらいのですが。。。
その他(データベース)
-
5
sqlplusの処理が途中でとまる
Oracle
-
6
SELECT と INSERT の速度
Oracle
-
7
SQLPLUSで結果を画面に表示しない
Oracle
-
8
他の処理でselectさせないようにしたい。
Oracle
-
9
SQLローダーCSV取込で、囲み文字がデータ中に入っている場合について
Oracle
-
10
キャッシュを使わずにSELECTを投げたい
Oracle
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SQL>UPDATEと同時にその件数を...
-
SELECTで1件のみ取得するには?
-
Date型にNULLをセットしたい V...
-
ACCESSのSQLの書き方
-
☆☆☆☆SQL Olacle 3つ以上の文字...
-
sqlplusの処理が途中でとまる
-
GROUP BYを行った後に結合した...
-
Oracleでの文字列連結サイズの上限
-
OracleのSQL*PLUSで、デー...
-
Accessで別テーブルの値をフォ...
-
select句副問い合わせ 値の個...
-
select insertで複数テーブルか...
-
実績累計の求め方と意味を教え...
-
GROUP BYを使ったSELECT文の総...
-
サブフォームに新規レコードを...
-
oracleの分割delete
-
差し込み印刷のレコード数について
-
[Access]異なるレコード間の文...
-
ADO VBA 実行時エラー3021
-
DataGridViewの内容をDBに反映...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SELECTで1件のみ取得するには?
-
Date型にNULLをセットしたい V...
-
sqlplusの処理が途中でとまる
-
SQL>UPDATEと同時にその件数を...
-
ORDER BY 半角カナ
-
☆☆☆☆SQL Olacle 3つ以上の文字...
-
異なるDB間でのJOINやVIEWについて
-
oracleのinsert select性能
-
[Access]時間帯の重複チェック
-
プロシージャで変数をテーブル...
-
正規化?の戻しについて
-
連番のつけ方
-
SQL文が浮かびません。
-
サブクエリ内のORとANDについて
-
オラクル オブジェクトのデー...
-
ACCESSとORACLEで抽出結果が異なる
-
PostgreSQLで小数点以下を処理...
-
SELECTでの指定行からの指定行...
-
エクセルVBAのオートフィル...
-
存在するデータの一覧を出すには?
おすすめ情報