• ベストアンサー

MoveNextの処理速度は?

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

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

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.5

ORADYN_READONLYとORADYN_NO_REFETCHを一緒に指定してみてはどうですか?

takataka111
質問者

お礼

ありがとうございました、 いっしょに設定する方法を試したのですが 、効果はありませんでした。 とりあえず、ストアドプロシジャで対応する事にしました 。

その他の回答 (4)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.4

Oracle Clientを普通にインストールするとoo4oのヘルプも一緒にインストールされているはずなんですけど。 CreateDynasetメソッドや、OpenDatabaseメソッドの箇所をどうぞ。

takataka111
質問者

お礼

ありがとうございます。 VBのヘルプを見てました(笑) dbcreatedynaset(sql, 8&) を指定したのですが、スピードは変わりませんでした。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.3

>ただ、セレクトしたデータを加工してインサートしたいと >考えております。 どのような加工でしょう? どうしてもSQLで出来ない加工ですか? 速度的には雲泥の差になるかもしれませんよ。 あと、SQLで出来ないとしたときのアドバイスを。 Dynasetの作成方法なんですが、読み込み専用で、前方に戻れないようなオプションをつけて作成してください。 MoveNextで行われるのはフェッチ処理です。 レコード件数が多くなると、前方に戻れるカーソル(Dynaset)ではバッファに内容を格納していくので処理が遅くなります。

takataka111
質問者

補足

ご回答ありがとうございます 読み込み専用オプションとはどのように設定するのでしょうか? 参考になるようなホームページ等ご存知内でしょうか? なにぶんVB初心者なのでどこをどう調べてよいかわからず 困っています。 よろしくお願いします。

  • muran
  • ベストアンサー率31% (12/38)
回答No.2

DAOを使用されていますか? もしDAO使用でデータがJETであれば、INSERT分を発行するより、 ADDNEW/UPDATEにてテーブルに追加したほうが、 INSERT文発行より約4倍近くスピードが違うそうです。 特に更新明細が多ければ多いほど、速度差は大きくなります。 MOVENEXTで処理が遅くなっているというよりは、 20,000件近いデータの更新処理が遅い原因かと思われますので、 この更新方法をお勧めしたいです。 ADDNEW、UPDATEはDAOのヘルプに載ってます。参考になすってください。

takataka111
質問者

補足

oo4oにて処理を行っています UPDATEにてテーブルに追加とは、 SQL文のUPDATEのことでしょうか? ADDNEWとはどのようなSQL文なのでしょうか? よろしくお願いします。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

>またこの方法以外にSelectしたものを一軒ずつInsertするよい(早い)方法があれば教えてください。 insert先のテーブルの分だけ insert into インサート先A select F1,F2 from 元テーブル名 where インサート先Aに入れるレコードの抽出条件 という感じのinsert文を使って入れるべきでしょう。

takataka111
質問者

補足

ご回答ありがとうございます。 ただ、セレクトしたデータを加工してインサートしたいと 考えております。 Do Until oraDynaset.EOF データの加工 加工したデータをinsert処理... oraDynaset.MoveNext ですのでInsert Into table Select... で行う手段は断念したのです。 今現状で18,000件のデータをセレクトして一軒ずつ加工して一軒ずつInsertする方法ですと処理が終わらない状況です(泣)

関連するQ&A

  • ループ処理の繰り返しについて

    お世話になっております。 単純なことで悩んでおります、どなたかわかるかたお願いいたします。 <% DO UNTIL SQLrs.EOF IF a=0 THEN %> 処理1 <% END IF SQLrs.MOVENEXT LOOP %> <% SQLrs.MOVEFIRST DO UNTIL SQLrs.EOF IF b=0 THEN %> 処理2 <% END IF SQLrs.MOVENEXT LOOP %> 上記のような処理順なのですが、問題は MoveFirstで先頭のレコードにもどらないのか、2回目のループ処理がうまく抽出できません。 原因はわかりますでしょうか?

  • access vbでループ処理

    レコードセットでテーブルの内容をフォームのテキストボックスに表示 させたいのですが、vbの知識が無く困ってます。以下の処理をループ処理で 簡単に出来ないでしょうか。 ' PASU1 = rs!PASU ' rs.MoveNext ' PASU2 = rs!PASU ' rs.MoveNext ' PASU3 = rs!PASU ' rs.MoveNext ' PASU4 = rs!PASU ' rs.MoveNext ' PASU5 = rs!PASU ' rs.MoveNext ' PASU6 = rs!PASU レコードセットは, Do Until rs.EOF   loop を用いれば繰り返し出来ると解っているのですがフォームの, PASU[1,2,3,,,]の数字の部分を指定することが出来ずにいます。 変数など駆使すれば出来ると思うのですが良くわかりません。 どなたか教えてください。

  • RDOでrowcountが1以上なのに、EOF!

    よく分からない現象が発生して困っています。 SQLServer2005 (9.0.1399) 【?な結果】 sSql = "Select * from ○○マスタ" Set oRst = goRDO_Con.OpenResultset(sSql, rdOpenKeyset, rdConcurReadOnly) Do Until oRst.EOF oRst.MoveNext Loop 上記のような文で、oRst.rowcountを取得すると10件なのに、 oRst.Eofを取得すると最初から常にTrueが返ってきます。 【思い描いている結果】 sSql = "Select * from ○○マスタ" Set oRst = goRDO_Con.OpenResultset(sSql, , rdConcurReadOnly) Do Until oRst.EOF oRst.MoveNext Loop 上記のような文では、oRst.rowcountを取得すると10件で oRst.Eofを取得すると最初はFalseが返ってきます。 他のSQLServerがインストールされている別の端末では、 正常にどちらの文も最初はEOFはFalseなのにも関わらず、 ある端末だけが上記のような結果になります。 どこかSQLServerのインストールがおかしいのかもしれませんが、 全く検討がつきません。 怪しいのは、?な結果が返る端末のホスト名が最初○○で、 その状態でSQLServer\MSSQLEXPRESSをインストール。 その後、ホスト名が△△に変更。SQLServer2005をインストール(上書き) している状況ということです。 どなかた何か情報ありませんでしょうか。。

  • LOOP処理で処理の先頭に移動するには?

    数年ぶりにVBのプログラミングをする事になり超初心者状態のため稚拙な質問で申し訳ございません 以下のような感じでLOOP処理を作成しています。 DO UNTIL AAA.EOF チェックA チェックB チェックC  AAA.MOVENEXT LOOP 上記のような形で取得した内容をLOOPでまわし、 一レコードづつチェックをかけていくのですが、 たとえば、チェックBでエラーとなった段階で AAA.movenextして チェックcはスキップしLOOPの先頭に移動し 次レコードのチェックをチェックAから開始したいのですが、 このような場合どう記述するのでしょうか? EXIT DOでループ自体から抜けるやり方はありましたが、このように処理の 途中で以降の処理をスキップしてループの先頭に移動する 方法が見つかりませんでした。 どなたかご教授ください!!

  • レコードセットのループ処理でエラー・・・

    簡単なことだと思うのですが、解決できなくこまっております。お助けください。 以下のコーディングで、データの取得は出来ているのですが、「Do Until rs1.EOF」でエラーとなります。 SOURCE----------------------------------------- sql = "Select No from t01" Recordset.Open sql, dbc, 3 If rs1.EOF Then Response.Write "データナシ<BR>" ←表示されません。 else Do Until rs1.EOF ←この行でエラーとなります。 Response.Write "No=" & rs1("No").Value rs1.MoveNext Loop end if Error-------------------------------------------- ADODB.Field (0x80020009) BOF と EOF のいずれかが True になっているか、または現在のレコードが削除されています。要求された操作には、現在のレコードが必要です。 因みに、Do Untilを使用せず  Response.Write "No=" & rs1("No").Value  rs1.MoveNext  Response.Write "No=" & rs1("No").Value と記述すると正常にデータが表示されます。 「Do Until rs1.EOF」で発生するエラーの回避方法を御教示願います。

  • accessとオラクルの連携について

    お世話になります。アクセスでテーブルのデータをSQL文で取得し、 そのデータをオラクルのテーブルにinsertしたいと思ってます。 ただ、フィールドの数が40個もあるので insert into ・・・・Fields(0),Fields(1)・・・・ と記述するのはかなり面倒なので何かいい方法はないでしょうか よろしくお願いします。 なお、access側とオラクル側のテーブルは同じ型です。 ’ローカルテーブルのデータを取得 rec.Open "select * from tesuto", cnn ’取得したデータをinsertする Do Until rec.EOF sql= insert into value(Fields(0),Fields(1),・・・ rec1.Open "select * from tesuto1", cnn1 Loop

  • レコードセットの値を一気にDBに

    access2007で開発しています。 レコードセットのデータをDBのテーブルに一気にいれる方法はないのでしょうか? 調べたところレコードセットをMOVENEXTで一件ずつ読込み、インサート文をなげている例はあったのですが、一気にいれる方法は見当たりませんでした。 さらにいうと元々はSQLで insert into テーブル1(・・・) select ・・・from テーブル2 としたかったのですが、executeすると´3065´選択クエリを実行できません´のエラーとなってしまいました。 すいませんが、ご教唆ねがいます。

  • OracleとVB6.0を勉強している学生です。

    OracleとVB6.0を勉強している学生です。 あるテーブルから全てのレコードを抽出してCSVで出力させたいのですが なかなかうまく行かないので悩んでおります。 TEST1 というテーブルには名前、年齢、住所、電話番号etc というフィールドがあり 数100件のレコードがある場合 その全てのレコードをcsvに出力する所で詰まって おります。 記述しているコードですが 'Oracleとの接続 Set OraSession = CreateObject("OracleInProcServer.XOrasession") 'DataBaseとの接続 Set OraDataBase = OraSession.DbOpenDataBASE(ORADBNAME, ORADBCONECT, 0&) SQL = "SELECT * FROM TEST1" Set Oradynaset = OraDataBase.DbCreateDynaset(SQL, ORADYN_READONLY) Do Until Oradynaset.EOF '出力 Open OUTPATH &"test1" & ".csv" For Append As #10 Len = 3 Print #10, ????????? ←この場所の記述の仕方 Close #10 step1: Loop Exit Sub End Sub Printでどう記述すればTEST1のレコード全てをCSVに出力できるかがわかりません。 DBへの接続は成功しております。 何卒よろしくお願いします。

  • Do Until rs1.EOF であるレコードをスキップしたい

    ACCESS2007のVBについて教えて下さい。 テーブルをオープンし RecordSetとして、rs1、に読み込まれてきます。 あるフィールド、廃油計がゼロのときは、そのレコードに対し  処理をスキップしたいのです。 苦しまぎれに、下記のように   Continue、を使うとContinueが関数とみなされてしまいます。 ある、レコードをスキップさせたいとき、   そのようにCoding、したらいいのでしょうか? --------------------------------------- Do Until rs1.EOF If rs1![廃油計] = 0 Then continue End If ' '処理 ' rs1.MoveNext Loop ------------------------------------ よろしくお願いします。

  • レコード一件ずつ処理判定をしたいのです。

    データベースの値を取得してきて 下記内容の処理を実施したいと考えています。 Do While rs.EOF = False    処理する内容:     レコード1件目とレコード2件目の値をチェックする。     レコード2件目とレコード3件目の値をチェックする。 rs.MoveNext Loop レコード一件ずつ処理の判定をしたいのです。 要は レコード内で重複する値があれば排除する分岐をしたいんですよね。

専門家に質問してみよう