質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

解決済

2回答

10149閲覧

SQL Serverへのインポート処理を早くしたい

ryo0814

総合スコア16

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

0グッド

0クリップ

投稿2019/02/23 08:32

前提・実現したいこと

Docker上のSQL Serverに大量データ(約600GB)のインポートを行いたい。

発生している問題・エラーメッセージ

4GBのデータインポート(BulkInsertを使用)で10分程度かかっており、インポートが遅くなりました。(前回実績では、同一テーブルで1GB程度で10秒程で完了していた。) アクティビティモニタ上はDockerを起動しているだけで、「com.docker.hyperkit」がWrite約50GB,Read約35GB になっており、Docker上で何かしらIOが発生し続けているように見えるので、それが原因のような気がするのですが、なぜそうなっているのかわからず。。。

該当のソースコード

BULK INSERT [テーブル名] FROM [Docker内のCSVファイルパス] WITH ( FILEDTERMINATOR = ',', ROWTERMINATOR = '0x0a' );

試したこと

Dockerの再起動、SQL Serverの新規DB作成

補足情報(FW/ツールのバージョンなど)

SQL Server:SQL Server2017
Docker:18.03.1-ce-mac65
GUIツール:SQL Operation Studio 0.30.6

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

**BATCHSIZE **を指定して、分割コミットされるようにして下さい。
但し、エラーになった場合のリカバリーについての考慮はしておいて下さい。

BULK INSERT (Transact-SQL)

パフォーマンスに関する考慮事項
1 つのバッチでフラッシュされるページの数が内部しきい値を超えると、バッチのコミット時にフラッシュするページを特定するためにバッファー プールのフル スキャンが行われる可能性があります。

フル スキャンが行われると、一括インポートのパフォーマンスが低下します。
この内部しきい値の問題は、大きなバッファー プールと遅い I/O サブシステムの組み合わせでも発生します。
大規模なコンピューターでバッファー オーバーフローを防ぐには、TABLOCK ヒントを使用しないようにするか (一括インポートの最適化は行われなくなります)、バッチ サイズを小さくします (一括インポートの最適化は引き続き行われます)。

コンピューターはそれぞれ異なるため、実際のデータでさまざまなバッチ サイズを試して最適な値を見つけるようにすることをお勧めします。

BATCHSIZE =batch_size
1 つのバッチに含まれている行の数を指定します。

それぞれのバッチは、1 回のトランザクションでサーバーにコピーされます。
コピーに失敗した場合、SQL Server では各バッチのトランザクションがコミットまたはロールバックされます。
既定では、指定のデータ ファイル内にあるすべてのデータが 1 つのバッチになります。

投稿2019/02/23 10:40

sazi

総合スコア25138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

メモリが足りてないんじゃないですか?
BULK INSERT時に、INSERT対象のデータより多くのメモリの空き容量を確保してやってみるか、メモリの空き容量以内のデータで複数回実行してみて下さい。

投稿2019/02/23 08:39

kunai

総合スコア5405

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hihijiji

2019/02/23 10:26

出来れば BULK INSERT するファイルサイズの4倍ぐらいは空きメモリが欲しいですね。 あとSQL Server はエディションによって使えるメモリも制限があるので空きメモリがあっても使えないことがあります。 600GBなら1GB*600 にファイル分割して BULK INSERT するのが現実的でしょうね。
ryo0814

2019/02/23 10:48

回答ありがとうございます。やはり分割する必要がありますよね、、、。 10程度のテーブルに入れようとするのが無茶でした。
wwbQzhMkhhgEmhU

2019/02/23 15:21

実際600GB入れるとなるとメモリにキャッシュさせるのは無理な話だし、ディスクやバスやネットワークの転送速度のうちボトルネックになる部分の速度に合わせて設計すべきです。しかし、実際には、インデックスも最終的には構築しないといけないし、テーブル特性によっては同時に構築しないといけないケースもあるはずなので、この場合は単純に掛け算割り算では計算できない曲線的な特性を持ちます。 すでにされていると思いますが、ロギングを抑えつつ、並列化を極力して、適切なバルクで転送するようにしてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問