• ベストアンサー

インサート処理のスピード

n件のデータを (1)SELECT INSERTで処理するのと、 (2)SELECT文をカーソルループにして1件ずつINSERTするのでは 処理時間は結構違うのでしょうか? 手元に実行環境がないためご存知の方がいらっしゃったらご教授下さい。 (SQLSERVERかORACLEかなどは問いませんので)

質問者が選んだベストアンサー

  • ベストアンサー
  • nora1962
  • ベストアンサー率60% (431/717)
回答No.1

ロックを考慮しなければ一般的に INSERT INTO SELECT の方が高速です。 一件ずつキー重複などを判断しなければならないような場合だとカーソルで回す必要があるでしょう。

souken_200
質問者

お礼

ありがとうございます!

関連するQ&A

  • SELECT実行中にINSERTしたい

    テーブルTに対し、データ抽出に数分かかるようなSELECT文を実行しているとして、 そのSELECT文の実行中にInsertしたらどのような挙動になるでしょうか。 (INSERTした瞬間にエラーが発生する?) また、SELECT文の実行中にInsertしたら、 「SELECT文が実行終了するまで待って、そのあとにINSERTする」 という動きにしたい場合、どのように設定(or SQLを書けば?)すればよいでしょうか。

    • ベストアンサー
    • MySQL
  • ORACLEでINSERT処理が遅い

    WINDOWS2000SERVER+ORACLE8.1.7で在庫管理ソフトを使用しています 。システム会社が作ったソフトなのですが、登録処理 (INSERT文のみで作られていると言っていました)が非常に遅くなって います。 10レコードのデータを登録するのに2分かかりました。 INSERT処理が遅くなる要因などご存知の方 いましたら、ご教示下さい。 (SELECT文は登録処理では使用していないとの事) ●システム会社の指示で「データをEXPORT/INPORTするバッチファイルを送りますので実行して下さい」との事で(EXPORT/INPORT実行すると早くなると言われました) 対象のテーブルをEXPORT/INPORTし、サーバ再起動しましたが、まだまだ遅いです。(10秒程早くなりました) システム会社の対応が非常に不安なのでここで質問させて頂きました。

  • 「SELECTして取得できない場合、INSERT」の不完全さの改善

    はじめまして。 ユニークキー設定しているカラムに、 SELECTして取得できない場合、INSERTの処理をすると 違うセッションでタイミングによってINSERTがエラーになってしまうと思います。(以下参照) -------------------------------------- 時間  SESSION1     SESSION2 ↓    SELECT→× ↓                SELECT→× ↓    INSERT→○ ↓                INSERT→× -------------------------------------- この様な場合、SESSION2を生かすには、その後SELECTを再度実行すればよいと思うのですが、他によい方法はないのでしょうか? 何かございましたら、ご教授お願いいたします。 各バージョン MySQL5.0 (PHP5.1)

  • T-SQLで10万件程度のInsert処理を記述したい。

    T-SQLで10万件程度のInsert処理を記述したい。 カーソルを利用したループ処理の中で、 Insert失敗時(エラー時)のみ、そのデータだけスキップし、 次のデータ登録処理に進みたい場合、 どのように記述すればよいのでしょうか。

  • SQLServer Insertが遅い

    1台のPCで発生している問題です。SQLServerで、Select命令は即戻ってくるのですが、Insertの処理は遅く、1件に2秒くらいかかっており、理由が分からず困っています。他のPCからは、SelectもInsertも問題ありません。 <SQLServer環境> ・バージョン:SQLServer2005 Express ・OS:WindowsXP ・ポート番号:1433固定 <クライアント環境> ・OS:Windows7  ※問題の発生しているPCも、問題の発生しないPCも、共に同じOS・同様のスペックです。 <当方でテストした内容> ※全テストで、実行前にテーブルはtruncateし、トランザクションは未使用で実行しています。 (1) 1件づつ Insertし、計3000件を登録    →問題発生PCでは、1件に2秒くらいかかる。問題なしPCでは、3秒くらいで全て終了 (2) sqlBulkCopyを利用し、配列変数に格納したデータ計3000件を一括登録 (配列格納後に測定)    →問題発生PCでは、15秒で30件くらい。問題なしPCでは、3秒くらいで全て終了 (3) bcpin で、テキストファイルの計3000件を登録    →問題発生PCでは、30秒くらい経っても開始されず。問題なしPCでは、1秒くらいで全て終了 (4) Select命令発行    →問題発生PC、問題なしPC 共に、1秒くらいで全て終了。 (5) bcpout で、テーブルより計3000件をテキストファイルに落とす    →問題発生PC、問題なしPC 共に、1秒くらいで全て終了。 bcpinについては、ためしに、 -S IPアドレス\Express,1433 と、ポート番号を付けて実行もしてみましたが、結果は同じで、問題発生PCでは、開始に時間がかかり、問題なしPCでは即終了しました。 以上の結果より、問題なく動くクライアントもあるため、Server側の問題ではなく、問題発生クライアントPCの環境に問題があるのではないかと思っていますが、SQLServerの接続、Selectやbcpoutには問題なく、Insertやbcpinといったデータ挿入のみが遅いという点で、何に問題があるのか、さっぱり検討がつきません。 このような場合、どういった点を調査したらよいのでしょうか?

  • TruncateしたテーブルへのInsertの遅さが気になる

    こんにちわ。 日次処理として、毎晩ワークテーブルをTruncateしてInsertしなおすというプログラムを数年前に作りました。 このプログラムはVB6、ADO、OLE DBプロバイダはOracleのものを使っています。 他のテーブルからSelectし、それを元に1レコードずつInsert文を作っては実行を繰り返す処理で正直遅いのですが、このプログラムの動作が不思議です。 日々数十万件のInsertを行っているのですが、ログを確認すると最初の2万件のInsertには40分掛かるわりに最後の2万件は5分で終わるのです。 今まで処理時間の遅さが問題になることもなく、バグもなく動いているしであまり気にしていなかったのですが、最近なぜこのような動きになるのか気になってきました。 最初も最後もSelect結果に偏りはなく、Insert文を作る処理に掛かっている時間は同じようなものかと思います。 とすると、遅いのはDBでのInsert処理か?と考えています。 レコード件数が少ないうちのInsertには時間が掛かるものなんでしょうか? だとするとそれはなぜ? 別に処理速度を速くしたいとか言うことではなく、なぜInsertの処理時間にこれほどの差が生じるのかが気になっています。 なおこのテーブルは主キー以外に索引を作っていません。 Insert文を作る際の元になるデータは論理的な単位ごとにSelectします。1回がだいたい数十件ぐらいです。 またその論理的な単位の分のデータをInsertしおわるごとにcommitしています(数十件ごとのcommitになります)。

  • Access にて DISTINCROW を使用した INSERT SELECT

    お世話様です。 Access2003 VBAにて、DoCmd.RunSQLを使用してSQL文を流す際、 普通のINSERT-SELECT文はOKですが、 そのSELECT文にDISTINCROW句を使用していると、 数百件程度のSELECT結果しかINSERTできません。 本当は数千件のSELECT結果をINSERTしたいのですが、 これを実行した場合、エラーにもならず、1レコードもINSERTされません。 ためしに、DINSTINCTROWではなく、SQL文を変更してDISTINCTにしてみたところ、 2000件以上でもINSERTできました。 DISTINCROW句を使用して数千件でもINSERTできる方法はあるでしょうか? ちなみにSELECT単体ですと、DISTINCTROWを使用していながら、 数千件でも結果を表示できます。 SQL例: str_SQL = " INSERT INTO 結果テーブル(フィールド1, フィールド2, フィールド3)  SELECT DISTINCTROW A.項目1, A.項目2, B.項目1  FROM テーブル1 A, テーブル2 B  (WHERE句はあってもなくても現象変わらず)  ORDER BY A.項目4 ASC, A.項目5 ASC " DoCmd.RunSQL (str_SQL) よろしくお願いいたします。

  • accessのデータをoracleへinsertする方法

    環境 vb6、access2000、oracle10g、OS:WinXP Pro accessの中にある30,000件のレコードをvb6でoracle10gに日常的にinsertしようと考えてます。(ボタンクリック時etc) insert into 『oracleのテーブル名』 select * from 『accessのテーブル名』 とは記述できないと思うのですが、30,000回 loop→insertさせると 15分くらい掛かります。何か処理速度を早くなる良い方法はありませんか?  お知恵をお貸し下さい。宜しくお願い致します。

  • MoveNextの処理速度は?

    お世話になります。 セレクトした結果(100000件)を一件ずつ違うテーブルにインサートする処理を行っているのですが、セレクトしたデータをMoveNextしていくとだんだん遅くなっていくような感じがします。MoveNextとはどのような処理なのでしょう か? またこの方法以外にSelectしたものを一軒ずつInsertするよい(早い)方法があれば教えてください。 Set oraDynaset = DATABASE.oraDynaset(セレクト文, 0&) Do Until oraDynaset.EOF insert処理... oraDynaset.MoveNext Loop

  • INSERT文でサブクエリ

    SQLServer初心者です。 使用DBはSQLServer2005です。 SQLServerではInsert文でサブクエリは使用できませんか? 例) INSERT INTO TmpA (a,b) VALUES ( 1,(SELECT TmpB.b FROM TmpB)) を実行しましたところ、 『メッセージ 1046、レベル 15、状態 1、行 12 このコンテキストではサブクエリは許可されません。スカラ式だけが許可されます。』 とのエラーが発生しました。 何らかの工夫で実装できる方法がありましたら、 教えて下さいませんか?