• 締切済み

SQLServer Access(adp)から更新

SQLServer初心者です。 Access(adp)から、ストアドプロシージャを使ってSQLServer(2005)の テーブルを更新させる処理があります。(約9万行のCSVデータを読み込み) 内容としては1行ずつLoopさせて以下の処理を行っている感じです。 1、AテーブルにCSVファイルから取得したデータをINSERT 2、Aテーブルの同一キーがマッチしたBテーブルの2項目に対して、   CSVファイルの値を更新(Update)  テスト環境では問題なく更新できていましたが、本番環境だと処理が異様に遅くなりました。 (1時間かかって12000件ほどしか更新されません) テーブル、インデックス、ストアドの中身も確認しましたが違いが見つけられず。 「SET ARITHABORT ON」の設定も入れてみましたがダメでした。 2のUpdate処理を外すと運用に耐えるくらいの速度になったので、Update部分が 問題なのだとは思うのですが・・。 UPDATE Bテーブル SET koumoku1=@csvkoumoku1,koumoku2=@csvkoumoku2 WHERE KEY=@csvkey ←csvkeyはAテーブルのキーになります サーバ環境と本番環境はコピーしているためまったく同じだとは思うのですが どこかほかに確認するところなどありますでしょうか。 よろしくお願いいたします。

みんなの回答

  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.1

特にCSVファイルの更新に時間がかかっているのであれば SQL自体の問題ではないように思われます   (問題はSQLにあるのではなくPC環境にあるのでは?) 例えば使ってるセキュリティソフトの違いとか

miyo72
質問者

お礼

koi1234 さん、回答ありがとうございます。 なるほどセキュリティソフトですか・・・。 確かに自社サーバではないため、気づいてませんでしたが あり得るかもしれませんね。 ありがとうございます。 よく考えてみると、そもそも1行づつの更新でなくても 良いはずなので、処理自体も見直してみます。

関連するQ&A

  • SQLServer7.0 重大な例外「EXCEPTION_ACCESS_VIOLATION」について

    SQLServer7.0のストアドプロシージャにて、 あらかじめCSVからワークテーブルに格納されたデータを 取り込もうとしています。 1000件ほどのCSVなら難なく取り込めるのですが、 1300件に増やして取り込もうとすると 以下のようなエラーが出ます。 「SqlDumpExceptionHandler: プロセス9で重大な例外 c0000005 EXCEPTION_ACCESS_VIOLATION が発生しました。 SQL Server はこのプロセスを終了します。」 自分なりにネットで検索をかけて調べたところ、 SQLServer7.0のサービスパックで回避出来るとのことだったのですが、 既に今出ているサービスパック4までは当てています。 他になにか原因があるのでしょうか? もしご存知の方がいらっしゃれば助けてください!

  • SQLServerでのSQL文に関して(Accessより)

    SQLServer2005とAccess2000で改修をしています。 共にADO接続をしています。 下記のように単純にUPDATEしているSQLがあるのですがエラーとなります。 フラグAはAccess側から見るとYes/No型 SQLServer2005から見るとビット型です。 (DB.Excute (UPDATE tblテーブル名 SET フラグA = Yes WHERE ID = 1)) エラーはメッセージが出るわけではなく、更新が決定されないというか… デバック自体は何も言われず通るのですが 当処理記述のMDBを閉じた後、下記SQLにてリスト表示させると SELECT IIF(フラグA = NO, '','済') FROM tblテーブル名 WHERE フラグA = NO とすると'済'とは表示されないID=1のレコードが抽出されます。 Access側からリンクテーブルを開き 当レコードのフラグAを手で変更しようとすると 「データの競合」メッセージが表示され「レコードの保存」ボタンの押下は不可です。 見えるレコード値は「0」です。 結局試行錯誤の結果 UPDATE tblテーブル名 SET フラグA = -1 WHERE ID = 1 とすることでSELECT結果は正常となったのですが 原因と、解決方法が適切かがわかりません。 改修中のプログラムは、Yes/No、True/False、-1/0の記述が混在していて 今までYes/No型やビット型、Accessを使ったことがないのでさっぱりです。。 ちなみに現システム使用環境はSQLServer2000とAccess2000/2003です。 普通に動いているようなので、勝手に既存SQLを変えてもいいものか、 むしろSQLServerのバージョンを変えることで変えなければならないのか 判断できたらいいなと思っています。 すいませんが、よろしくお願いいたします。

  • SQLServerで更新ができない。

    環境  Windows NT SQLServer 7.0 SQLServerのクエリアナライザ等で参照(select文)は成功するのですが、 更新(update文やinsert文)を実行すると以下のエラーが発生します。 解決方法がわかる方いましたら教えてください。 サーバー : メッセージ 6、レベル 16、状態 1、行 4 指定された SQL Server が見つかりません。

  • オラクルからのSQLServerへのデータを取込み

    お世話になります。 オラクルのテーブルからSQLServerのテーブルにデータをスケジューリングして 取り込みたいのですが、どのようにして行えば良いのでしょうか? オラクルの事しか知らないのですが、ストアドプロシージャ-のようなもので 取込みを行うのでしょうか? どなたかご存知でしたら、お教え願います。

  • SQLSERVERのテーブルにデータをロードする方法を教えてください

    SQLSERVER2000のテーブルにデータをロードする方法を教えてください。 <環境> マシンA・・・OS WINDOWS2000SERVER マシンB・・・OS WINDOWS2000SERVER SQLSERVER2000 質問1 マシンA上で作成したCSVファイルを使用して、マシンBのSQLSERVERにデータをロードする方法を教えてください。 リモートから直接データがロードできるのであれば、各マシンにインストールする必要がある製品と、方法、サンプルスクリプトがあると助かります。 おそらくマシンBにデータを転送した後、DTSか、バルクローダをリモートからキックすることになると思うのですが、詳しい方法が分かりません。 質問2. マシンA上で作成したUPDATE文を使用して、マシンBのSQLSERVERにデータを更新する方法を教えてください。 リモートから直接データが更新できるのであれば、各マシンにインストールする必要がある製品と、方法、サンプルスクリプトがあると助かります。 以上、2点になります。よろしくお願い致します。

  • ストアド。存在チェックをしてから登録したい。

    SQLServer2005環境です。 同じ構造のテーブルA、Bがあり、AのデータをBにコピーしたいと思っています。 Aのデータは最新のデータ、Bの中にあるのは古いデータなので、もしキーが かぶるレコードがあれば、Updateをかけ、なければInsertをするような仕組みに したいと思っています。 更に可能であれば、Aに存在しないデータがBにあった場合は、Deleteしたいです。 一度BをDeleteしてInsertすれば話が早いのですが、そうもいかず、UpdateとInsertを 交え、小出しに更新するような形にしたいのです。 2008であれば、Merge文という便利なものがあるのですが、2005では上のような 動作をストアドで実現するのは難しいでしょうか。 サンプルコードですとか、解説しているサイトなどがありましたら、教えていただけますと 大変助かります。 宜しくお願いします。

  • SQLServerのデータをCSVファイルに出力したい

    VB6.0(SP5) Windows2000(SP3) SQLServer2000(SP3) で開発しています。 VBで、SQLServerのデータをCSV形式で出力したいのですが、どのようにすればいいか教えてください。 一旦データを取得して、それを1行ずつ書いていく。 というやり方ならイメージできるのですが、もっと簡単というか、処理の早い方法があるのかなと思いまして(SQLServerの機能で何かあるかなとか)、教えて頂きたいのです。 よろしくお願いします。

  • SQLServerにおける、排他制御に関して質問です。

    SQLServerにおける、排他制御に関して質問です。 環境:  SQLサーバ  ・Windows 2003 Server SP2  ・SQL Server 2005 Standard Edition SP3  SQLクライアント  ・WindowsXP SP3  ・.NET Framework 3.5 SP1 VB.NET アプリ  DBアクセサ  ・ADO.NETを利用 ---------------------------------------------------------------------- 1.DBとのコネクションを確立        ・        ・        ・ 2.データベーストランザクションを開始(レベルはSerializable) 3.テーブルAに対してINSERTを実行   (テーブルAの主キーはオートインクリメント設定されている。) 4.3の結果、追加された主キーを取得するため、MAX()関数にて主キーの最大値(つまり、3で追加した行のはず)を取得 5.テーブルAを外部参照しているテーブルに対して、4で取得したテーブルAのキーを利用して、行を追加・更新などを行う。 6.コミットを行う。   (コネクションは、アプリケーションが終了するまで保持する・・・) ---------------------------------------------------------------------- この処理フローで実行していたシステムですが、 二つのクライアント(X,Y)から、同時に2からの処理が行われた際に排他されず、 Xが、Yが作成したレコードの主キー値を元に、5の更新を行ってしまいました。 ログを見ると、 2→成功 3→成功(別のレコードが作成された) 4→XがMAX関数にて、Yが作成したレコードの主キーを取得   ※処理そのものは成功しているが、論理的におかしい となっています。 論理的には、トランザクションをかけているので、3からの処理が同時に行われるはずはなく、 4で取得される番号も、それぞれが作成した行の主キー番号になるはずなのですが・・・。 論理的に見落としている点や、環境的な要因などで、考えられる原因はありますでしょうか・・・?

  • PHPとSQLServerにて

    おはようございます。 質問させてください。 今PHPでSQLServerのデータを抽出してWEBで表示するアプリを作成しています。 SQLServerに格納されている本番テーブル(honban_tbl)はかなりのレコードが 格納されていて、テストテーブル(test_tbl)には本番テーブルの 約50分の1の大きさにしてあります。 参照先をtest_tblにすると問題なくデータを表示するのですが、 honban_tblにするとかならずエラーになります。 -------エラー内容---------- MS SQL: Query failed in d:\test\・・・ -------------------------- この原因は (1)honban_tblが大きすぎる (2)honban_tbl内のデータに壊れているものがある (3)スクリプトに問題がある (4)処理時間に問題がある 上記の理由がかんがえられるのですが、 それ以外にもなにかご存知の方いらっしゃいましたら、 宜しくお願いいたします。m(_ _)m

    • 締切済み
    • PHP
  • SQLSERVER 連番更新について

    <環境>SQLSERVER 一時ワークテーブルのフィールドに指定した番号以降の連番を更新したいのですが、 クエリーで更新する方法はありますか? 例) <更新前のテーブル> コード 名前  連番  001  AAA  null 002  BBB  null 003  CCC  null <更新後のテーブル> 15以降の連番を更新する コード 名前  連番  001  AAA   15 002  BBB   16 003  CCC   17