みなさん。こんにちは。
下記の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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
これ何て呼びますか Part2
あなたのお住いの地域で、これ、何て呼びますか?
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
TruncateしたテーブルへのInsertの遅さが気になる
Oracle
-
selectした大量データをinsertしたい
MySQL
-
単純なselectが遅くなるのですが、理由がサッパリわかりません
PostgreSQL
-
-
4
SQLPLUSで結果を画面に表示しない
Oracle
-
5
SQLローダーCSV取込で、囲み文字がデータ中に入っている場合について
Oracle
-
6
Viewにインデックスは張れますか?
Oracle
-
7
SELECT INTOで一度に複数の変数へ代入をするにはどのようにすれがよいでしょうか?
PostgreSQL
-
8
オラクルのUPDATEで複数テーブル
Oracle
-
9
ORA-01013のエラーについて経験のある方お願いします。
Oracle
-
10
SELECT と INSERT の速度
Oracle
-
11
Oracleでの文字列連結サイズの上限
Oracle
-
12
バッチからsqlplusの接続エラーの検知について
その他(プログラミング・Web制作)
-
13
キャッシュを使わずにSELECTを投げたい
Oracle
-
14
NVLとDECODEのスピード差
Oracle
-
15
sql*loader 数値のロード
Oracle
-
16
INDEXの無効化
Oracle
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Date型にNULLをセットしたい V...
-
SELECTで1件のみ取得するには?
-
プロシージャで変数をテーブル...
-
oracleのinsert select性能
-
SQL>UPDATEと同時にその件数を...
-
sqlplusの処理が途中でとまる
-
[Access]時間帯の重複チェック
-
ORDER BY 半角カナ
-
GROUP BYを行った後に結合した...
-
Oracleでの文字列連結サイズの上限
-
実績累計の求め方と意味を教え...
-
最新の日付とその金額をクエリ...
-
select句副問い合わせ 値の個...
-
レコードが存在しなかった場合
-
Access 文字+年ごとの自動採番
-
キーが同じを複数行を1行にま...
-
Accessで別テーブルの値をフォ...
-
select insertで複数テーブルか...
-
アクセスでレポートの1印刷内...
-
【アクセスVBA】テーブルにフィ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SELECTで1件のみ取得するには?
-
sqlplusの処理が途中でとまる
-
Date型にNULLをセットしたい V...
-
oracleのinsert select性能
-
SQL>UPDATEと同時にその件数を...
-
異なるDB間でのJOINやVIEWについて
-
ORDER BY 半角カナ
-
☆☆☆☆SQL Olacle 3つ以上の文字...
-
SQLで抽出可能でしょうか?
-
[Access]時間帯の重複チェック
-
AccessVBAでリンクテーブルの参...
-
検索キーワードを使用し、テー...
-
PLSQLで変数に格納されたSQL文...
-
プロシージャで変数をテーブル...
-
ACCESSのSQLの書き方
-
SQLでのレコード抽出について、...
-
マクロの編集方法を教えて下さい。
-
正規化?の戻しについて
-
SELECTでの指定行からの指定行...
-
SQL文(最新データ且つ条件付)...
おすすめ情報