人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

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

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

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


●質問者: rikimaru
●カテゴリ:コンピュータ
✍キーワード:access CSV Microsoft SQL データ
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

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

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

◎質問者からの返答

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

別の回答待ってみます


2 ● memo77
●20ポイント

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

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

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

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

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

◎質問者からの返答

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

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

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

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


3 ● F-15X
●20ポイント

.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 するサンプルコード というのがあります。
◎質問者からの返答

BULK INSERT は、興味あります

面白そうです


4 ● upride
●20ポイント

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/

◎質問者からの返答

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

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


5 ● matsu-boolean
●20ポイント

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

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

2.データ投入(処理)

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

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

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

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

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


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

◎質問者からの返答

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ