素人な質問ですみません。
環境:ORACLE 10g
ストアドである値をINSERTする場合、
キー重複でEXCEPRIONに飛ばすのと、SELECTで同キーの件数(0 or 1)を取得して、
O件の場合のみ処理を行うのではどちらのほうが速度は上なのでしょう?
ちなみに登録されるテーブルのレイアウトは、
項目(1)NUMBER(8) PK,
項目(2)NUMBER(8) PK,
項目(3)VARCHAR2(256) PK,
項目(4)NUMBER(2) PK,
項目(5)NUMBER(8)
って感じです。
よろしくおねがいします。
A 回答 (6件)
- 最新から表示
- 回答順に表示
No.6
- 回答日時:
質問者様のバッチ処理での状況を見ますと、私が過去に性能改善を行ったシステムと同じような要件と思われます。
その時もバッチ処理で、約7万件のデータを毎回DBに格納する際、既に存在するレコードが数件ありました。
その時の性能として、改善前はSELECTして、レコードの有無を調べ、レコードが既に存在してればUPDATE、なければINSERTするというような感じで作られていました。
この処理時間は1時間半でした
これを無条件にINSERTして、Exceptionが発生したらUPDATEに切り替えるという処理に直したところ、処理時間が30分になりました。
ですので、質問者様の条件の際には
(1)いきなりINSERT
(2)Exceptionが発生したらUPDATEに切り替える
というやり方を経験的に推進します。
Oracle8 PL/SQLでした。
No.5
- 回答日時:
あ、ごめんなさい。
ANo.4でなんかトンチンカンか回答をしてしまいました。
重複って、テーブル内のデータと、これから登録するデータのことですよね。
下半分の件も、バッチならば処理の最初にテーブルロックしちゃいますよね。
ANo.4とこの文章は、無視してください。ごめんなさい。
No.4
- 回答日時:
回答へのコメントで「同キーのデータが1~2レコード存在すると思われます。
」がちょっと気になります。PK張ってあるのに重複レコードがあるの?
あと、(1)select+insertより(2)insertが早いとのことですが、
insertする場合、暗黙のテーブルロックがかかるため、
このテーブルにロックが必要な処理(update,delete含む)が非常に多いと見積もれる場合、ロックの競合を避けレスポンスを維持するため、
(1)の方法をとる場合があります。
No.3
- 回答日時:
前者の方が必ず速くなります。
というのも後者の方法はselectで重複が無いかをチェックした気になっているのは人間だけでOracleにとっちゃあそんなことは一切関係無く、
プライマリキーがあるのですから再度INSERTするときに重複チェックを必ず行います。
つまりSELECTでの重複チェックは全く意味が無い負荷をかけるだけの処理なのです。
プライマリキーの重複などチェックがOracleに任せられるのであれば任せるべきです。
後者の方法やmerge文を用いるのはプライマリキー制約などではない、
DBに定義していないチェックをしたい場合に限られます。
No.2
- 回答日時:
merge文なんてものもあります。
一概には言えません。実測されるのが一番でしょう。insertでもキーを検索(select)していることは変わりませんので、
直接insertでexceptionを返すのが早いか、selectの結果を返すのが早いかということになります。この2つが同じ速度だと仮定すると、直接insertの場合には、うまくいけば、exceptionが発生しない場合もあるので、その場合には、その後の1sql分の短縮が見込めることになりますね。あとは、insertで重複する確率の問題になるかと思います。
実際にストアドで簡単に計測してみた方がよいと思いますよ。
No.1
- 回答日時:
トランザクション系の処理でしょうか、それともバッチ処理でしょうか?また、母体件数と重複キーになる可能性(確率)がどれくらいかによって変わります。
また、求められる性能要件によっても重要性が変わってくると思いますが。。。
単純に考えると、select<insert<select後insert の処理速度になりますよね!
insert結果のexceptionルーチンでの処理も、count=0の場合の処理も同一と考えると、
母体数が多い、もしくは重複する確率が低い場合、insert<select→insert
母体数が少ない、もしくは重複する確率が高い場合、insert>select→insert
になると想定されます。
バッファサイズやselectするキーの内容によって、ヒット率も変わって来ますので、一概には言えませんが、可能であれば、sqlトレースや実行計画を取得して、最適なチューニングを施した方がいいと思います。
ご回答ありがとうございます。
バッチ処理です。
おそらく母体数が5万~40万ほどで、
同キーのデータが1~2レコード存在すると思われます。
なんとなくinsert<select→insertの予感がします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Oracle sqlで質問です。 Aテーブルの登録番号をキーにBテーブルから確認番号を取得したいのですが、Bテーブ 4 2023/05/18 13:08
- JavaScript javascriptでテーブルに追加した項目のid追加してローカルストレージを操作したい 5 2023/01/01 15:52
- JavaScript セレクトを全て選択されていないと、文字によるエラーメッセージを表示させるコードを調べています 2 2023/06/22 15:48
- Excel(エクセル) ExcelVBAでリストの項目に必要数と同じ手配数を分配していくマクロを作りたいです。 1 2022/07/29 18:36
- Oracle SQL update方法 2 2022/06/22 14:07
- Excel(エクセル) 表示形式、文字列セル(列)に数式を入力するには マクロ 1 2022/09/18 10:53
- Ruby pandasでsqlite3にテーブル作成・追加・読み出しでindexの取り扱い方教えてください 5 2023/03/08 09:57
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
- PHP コメント機能に返信欄を矢印で追加したい 1 2022/05/09 21:17
- Excel(エクセル) Formulaプロパティーを使ってセルに数式を組んだのですが簡潔にしたい。 3 2022/08/21 20:51
このQ&Aを見た人はこんなQ&Aも見ています
-
【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
【お題】 ・存在しそうで存在しないモノマネ芸人の名前を教えてください
-
秘密基地、どこに作った?
小さい頃、1度は誰もが作ったであろう秘密基地。 大人の今だからこそ言える、あなたの秘密基地の場所を教えてください!
-
ホテルを選ぶとき、これだけは譲れない条件TOP3は?
ホテルを探す時、予約サイトで希望条件の絞り込みができる便利な世の中。 あなたは宿泊先を決めるとき「これだけは譲れない」と思う条件TOP3を教えてください。
-
この人頭いいなと思ったエピソード
一緒にいたときに「この人頭いいな」と思ったエピソードを教えてください
-
「お昼の放送」の思い出
小学校から中学校、ところによっては高校まで お昼休みに校内放送で、放送委員が音楽とかおしゃべりとか流してましたよね。 最近は自分でもラジオができるようになって、そのクオリティもすごいことになっていると聞きます。
-
oracleのinsert select性能
Oracle
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
カーソル0件の時にエラーを発生...
-
SQLについて WITH句とサブクエ...
-
Accessで処理経過を表示したい...
-
カーソル宣言をIFで分けられま...
-
クエリの実行時間の目安
-
処理件数を非表示にしたい
-
(x 行処理されました)を表示さ...
-
わり算の結果が整数でも小数点...
-
【PL/SQL】カンマ区切りのレコ...
-
ACCESSで一括処理する方法
-
NVLとDECODEのスピード差
-
アナライズ
-
RDBとVSAMの比較
-
カーソルを使って、最終行レコ...
-
データ型でFloatとreal の計算...
-
sinカーブの表示のさせ方
-
差し込み後、元データを変更し...
-
エクセルで最後の文字だけ置き...
-
SQLで特定の項目の重複のみを排...
-
for whichの使い方
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
カーソル0件の時にエラーを発生...
-
処理件数を非表示にしたい
-
クエリの実行時間の目安
-
カーソルを使って、最終行レコ...
-
データ型でFloatとreal の計算...
-
カーソル宣言をIFで分けられま...
-
ACCESSで一括処理する方法
-
ストアドプロシージャ_カーソル...
-
NVLとDECODEのスピード差
-
Accessで処理経過を表示したい...
-
(x 行処理されました)を表示さ...
-
SELECT と INSERT の速度
-
SQL plus で改行
-
わり算の結果が整数でも小数点...
-
RDBとVSAMの比較
-
動的SQLの処理件数
-
PL/SQL で continue ?
-
カーソルがコミットするとクロ...
-
カーソルオープンの処理について
-
300万件のデータの処理について
おすすめ情報