SQL-SERVER2000 に Microsoft Access を利用してデータを書き込んでいます


元データは、CSVなんですが、ストアドで処理するには複雑すぎる処理を行った後、テーブルに書き込んでいます

今は、ADO 経由で、ストアドを呼び出して1行づつ書き込んでいるのですが、数十万行を処理するので、かなり時間がかかってしまいます

処理自体は、高速なんですが、SQL-SERVERへのデータ投入に、えらく時間がかかってしまっています

何とか、良い方法はないもんでしょうか?

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2007/06/03 16:45:39
  • 終了:2007/06/04 18:29:42

回答(5件)

id:lizy No.1

lizy回答回数45ベストアンサー獲得回数142007/06/03 18:43:30

ポイント20pt
  1. CSVファイルの内容に処理を行い、DBにinsertできる形に変換して、再度CSVファイル等に出力する。
  2. そのファイルを一括してインポートする

の2段階(一括変換→一括投入)ではどうでしょうか。

id:rikimaru

なるほど、確かに高速かもしれませんねぇ

別の回答待ってみます

2007/06/03 19:24:51
id:memo77 No.2

memo77回答回数238ベストアンサー獲得回数202007/06/03 20:10:26

ポイント20pt

AccessからSQLServerへの転送にDTSを使うとよいでしょう。

Accessの位置を固定してDTSパッケージを作ってもいいですが、DTSパッケージをBASファイルとして保存すれば、Accessのモジュールとして使うことができます。

モジュールをちょっと書き換えれば、Accessのパスを渡せるようになりますよ。

ただ経験上、「複雑すぎる処理」というのは文字の半角化でもない限り、AccessでできることはSQLServerでできますね。

http://www31.atwiki.jp/memo77/

id:rikimaru

複雑すぎるの意味が、ちょっと曖昧でした

具体的には、VB 使って、ちょっとしたアルゴリズムを通して作成したデータをサーバーに書きたかったんですね

理想を言えば、SQL-SERVER に、CSVを直接インポートして、それから処理すれば早いんでしょうが、1ぎょうづつ、処理して、その結果を書くということで、時間がかかる状態になっていたのです

今回の、解決手法も、ちょっと考えていなかったので、ちょっと面白いと思いました

2007/06/03 20:30:30
id:F-15X No.3

F-15X回答回数111ベストアンサー獲得回数132007/06/04 04:40:41

ポイント20pt

.LockType=adLockTypeBatchOptimistic/.UpdateBatch

などで、複数行まとめてインサートと思ったのですが、

こちらで議論されており、結局、SQL Serverに対してのADOでのInsertはどの方法でもさほど効率は変わりません。

となっております。

http://www2.moug.net/bbs/exvba/20070316000027.htm

やはり、一旦ファイルに落としてから取り込む方法が宜しいようです。


以下、参考

◆Insert into ~ select 文
SystemWatanabe【JetとSQLServerのSQL】
◆バルクコピー
バルクコピーによるパフォーマンス
- BLUE-TRANSPARENCY~限りなく透明に近いブルー~ SP(ストアドプロシージャ) Tips
    その3.ファイルからテーブルに読み込み
    その4."文字のある文字列をバルクインサートする
◆バルクインサート(msdn)
BULK INSERT (Transact-SQL)
◆ODBC Text Driver
csvファイルをsqlserverのテーブルにinsert
※抜粋
ODBC Text Driver を使うと CSV を読み取ることができます。
リンクサーバーとして設定することもできるし、OPENROWSET で
アドホック接続することもできるので、簡単に Select と Insert ができます。
・・・
>Currentdb.Execute "select * into [odbc;Driver=sql server;server=AAA;database=BBB;uid=CCC;pwd=DDD].DBTABLE from [text;database=C:\TEST].[XXX.csv]"
◆ACCESSのインポート
DoCmdオブジェクト(基礎編)の22.TransferText メソッド
◆.NETでは、.Net 2.0 のDataTable から、直接 BULK INSERT するサンプルコード というのがあります。
id:rikimaru

BULK INSERT は、興味あります

面白そうです

2007/06/04 18:27:57
id:upride No.4

upride回答回数220ベストアンサー獲得回数12007/06/04 12:32:05

ポイント20pt

1.accessでcsv読み込み後vbのロジックで処理した利用しやすいCSV別ファイルを作る(ローカルでの作業)

2.accessからSQLSERVERが稼動しているマシンへ1で作ったファイルを転送

3.アクセスからSQLSERVERのストアドをキック(このストアドは複数行一括処理するように改造しておく)

4.SQLSERVERの処理結果を確認する(ACCESSでもなんでも可)

こんな流れに改造してみては?

csvの一発取り込みはbulk insertですよ(SQLSERVER)

※SQLSERVER2005ならVBのロジックをストアドにできますよ

http://q.hatena.ne.jp/

id:rikimaru

※SQLSERVER2005ならVBのロジックをストアドにできますよ

これは、衝撃的事かもしれません

2007/06/04 18:28:47
id:matsu-boolean No.5

matsu-boolean回答回数43ベストアンサー獲得回数72007/06/04 12:48:50

ポイント20pt

古典的な方法ですが、投入先テーブルにインデックスがたくさん張られているなら、

1.テーブルのインデックスを削除

2.データ投入(処理)

3.インデックスの再構築

とすると多少速くなるのではないかと思います。

インサート(アップデート)の度にインデックスを書き換えるより、インデックスなしで処理しておいて、後からインデックス作り直したほうが早いということです。

夜間のバッチ処理などでは結構使えるのではないかと思います。

使えるかどうか判りませんがまずは情報ということで。


http://www.wind.sannet.ne.jp/m_matsu/developer/a5m2/index.html

id:rikimaru

なるほど、これは、これで面白そうですねぇ

2007/06/04 18:29:24

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません