2011-08-05 14 views
0

BulkCopyクラスを使用して〜17M行(2GB程度)のテーブルをSQLServerにロードすると、約6Mのレコードをロードした後にサーバーがメモリ不足になっているようです。すなわち、私はシステムのメモリの90%以上を占めており、その後、メモリ不足例外を発生させずに、静かにデータをロードしようと試みるが、それは極端に遅くなる。SQL Serverのメモリの管理

誰か他に同様の問題がありますか?それを再起動せずにメモリをクリアするようSQLServerに指示する方法はありますか?いいえ、誰でも私にプログラムでサーバーを再起動する方法を教えてもらえますか?

PS:メモリを使い果たしているプログラムではないことを確認しました。

[編集]私は64ビットのWindows 7、64ビットのsqlserver 2008 R2を8ギガバイトのメモリで実行しています。

+0

あなたのプログラムがメモリ消費の原因ではないことをどのように確認できましたか? – RobB

+0

ああ、私のプロセスを殺すと、SQLサーバを再起動したときよりもはるかに少ないメモリが解放されます –

答えて

1

Sqlには、すべてのデータをメモリにロードするためのオーバーヘッドがあります。したがって、2GBの生データがある間にメタデータとポインタがあり、そのようなものを追跡するためにメモリにロードする必要があります。あなたのシステムで起こっていることは、すべてをメモリに保存するためにRAMストレージが不足しているため、ある特定のページ(OSが仮想アドレスを物理アドレスに変換するために使用するユニット)をハードドライブにスワップするより多くの情報を格納するための部屋を作ることができます。通常、データベースを完全にメモリに読み込むことは、データベースがかなり大きくなる可能性があるため、これを行います。 Sqlサーバーにはカスタムメモリー管理機能があるため、最近使用されておらず、近い将来使用される可能性のないものは通常取り除かれます。

Sqlを再起動すると、これを行う唯一の簡単な方法です.Sql(MySql、MsSqlなど)の一般的なバージョンに応じて、プログラムでサーバーを再起動する方法があります。

3

SQL Serverは、システムで使用可能なすべてのメモリを割り当てます。一度それが最大のメモリに達すると、そこにとどまり、そのメモリを解放しません。これは、設計によって意図された動作です。

あなたは私たちに情報のいくつかの重要な部分を教えてくれませんでした:

  • どのくらいの物理メモリがシステムが持っているのでしょうか?
  • は、64ビットまたは32ビットのOSですか?
  • は、64ビットまたは32ビットのSQL Serverインスタンスですか?

私の疑惑は、あなたが実際に完全に無関係な何かを見ていることである:6M行であなたのテストでは、成長しているファイルを起動すると、あなたはinstant file initializationがオンになっていません。パフォーマンスカウンタの多くを見にあります

  • そして、任意のSQL Serverのトラブルシューティングの問題と同様に、Waits and Queues方法論を以下を傷つけることはできません。最後に、メモリ圧力が原因で問題が発生した場合は、Using DBCC MEMORYSTATUS to Monitor SQL Server Memory Usageで調査する方法があります。

  • +0

    ありがとう!私は仕様を追加しました。ファイルの初期化に関して - 私は10GBのディスクスペースをあらかじめ割り当てています。すべてのデータがロードされ、インデックスが作成されている間はウォールクロックに気を付けません。カウンターで私は何をしますか?その監視の権利ですか? 基本的に、私の場合は、さらに多くの行が追加されることを知っています。そのための回避策は、sqlserverを再起動してメモリを取り戻し、すべてのメモリを使い切るまでもっと楽しく読み込みます。私は 'DBCC MEMORYSTATUS'を試し、待ち時間と待ち行列を読んでいます。その間に何かが考えられるなら、それはすばらしいでしょう。 –

    +0

    BCPを実行しているセッションの 'sys.dm_exec_requests'の' wait_time'、 'wait_type'、' wait_resource'と 'last_wait_type'の値をチェックすることをお勧めします。頻繁に確認する値、ここには最も頻繁に表示される値を記入してください。 –