- PR -

SQL Server2005のメモリ開放について

1
投稿者投稿内容
タカ
会議室デビュー日: 2009/02/14
投稿数: 4
投稿日時: 2009-02-14 01:57
SQL Server2005とVB.NETで業務アプリを開発していますが、大量データをSQL Serverのテーブルに追加・更新処理を行うと、SQL Server自体の動きが重くなり、以降の処理レスポンスが非常に遅くなる事象に困っています。

処理前のSQL Server2005の使用メモリ量と処理後の使用メモリ量に約1GB程度の開きが出ており、大量データ処理で一時的にSQl Serverで使用したメモリを開放しない為ではないかと推測していますが、このメモリをアプリケーション側から開放することは出来ないのでしょうか?
現在はSQL Serverのサービス再起動を行うことで、回復は出来るのですが、この状態でずっと業務利用するのは困難な状況です。
何か良い解決案があればご教示ください。
いとっと
常連さん
会議室デビュー日: 2005/06/10
投稿数: 33
投稿日時: 2009-02-14 10:42
引用:

タカさんの書き込み (2009-02-14 01:57) より:
処理前のSQL Server2005の使用メモリ量と処理後の使用メモリ量に約1GB程度の開きが出ており、大量データ処理で一時的にSQl Serverで使用したメモリを開放しない為ではないかと推測していますが、このメモリをアプリケーション側から開放することは出来ないのでしょうか?



確保したメモリをそのまま利用するのはSQLServerの通常の動作です。
# 下記のブログがとても詳しいのでご覧ください

http://blogs.sqlpassj.org/matu_tak/archive/2004/04/20/1824.aspx


大量データの追加/更新が遅くなるという場合には、ログファイルの初期サイズを大きめに保持しておくというのもよいと思います。ファイルの拡張が実行されるととても処理が遅くなります。
それと「データベースの復旧モデルをシンプル(単純)にする」と速くなったような気がしますが、試してみたらトランザクションログが全く書かれないわけではないようなのでもしかしたら勘違いかも知れません。


あとは遅くなるのがプログラムがメモリを確保出来ないことに起因する場合には、上記ブログにもありますがmax server memoryを調整するのもよいと思います。
タカ
会議室デビュー日: 2009/02/14
投稿数: 4
投稿日時: 2009-02-14 23:18
いとっとさん、回答ありがとうございます。

「データベースの復旧モデルをシンプル(単純)にする」は、設定しておりまして、その上で質問の状況となっています。

max server memoryについては初期値(2GB)のままですが、サーバー自体の物理メモリは4GB搭載していますので、特に調整する必要無いと判断していましたが、やはり行った方が良いのでしょうか?

サーバー再起動することで、SQL Server2005の使用メモリが減少し、SQL Server自体の動きが重くなる事象も改善されるため、やはりメモリが解放されないためだと思うのですが、物理メモリが4GBあるのに何故?という思いがあります。

一度max server memoryの調整にトライしてみようとは思います。もし何か他にアドバイスありましたらお願いします。
いとっと
常連さん
会議室デビュー日: 2005/06/10
投稿数: 33
投稿日時: 2009-02-15 00:58
引用:

タカさんの書き込み (2009-02-14 23:18) より:

max server memoryについては初期値(2GB)のままですが、サーバー自体の物理メモリは4GB搭載していますので、特に調整する必要無いと判断していましたが、やはり行った方が良いのでしょうか?



前の返信にも書いたとおり、動作が遅い原因がSQLServerがメモリを占有してしまい、アプリケーションで十分なメモリが使えない事に起因する場合には指定すればよいと思いますが、そうでない場合には行う必要はありません。


引用:

タカさんの書き込み (2009-02-14 23:18) より:

サーバー再起動することで、SQL Server2005の使用メモリが減少し、SQL Server自体の動きが重くなる事象も改善されるため、やはりメモリが解放されないためだと思うのですが、物理メモリが4GBあるのに何故?という思いがあります。



前の返信で参照しましたブログをご覧いただきたいのですが、サービスで使用するメモリが増える一番の原因はデータキャッシュの増加です。どのようにしてデータをデータベースへ一括で格納しているのかは分からないのですが、仮にデータキャッシュが増大しているのであればこのデータ一括格納のロジックを変えるしか対応はないと思います。


一点思いついたのは、bulk copyなどを行っている場合は一時領域としてtempdbが使用されることがあります。その際にtempdbに十分なサイズがないとデータベースの拡張を繰り返して遅くなることは考えられます。
再起動するとtempdbは既定のサイズに戻りますので、まずはこのサイズを十分に取ることを検討してみてはいかがでしょうか。

方法については2000についての生地ですが松本さんのブログが分かりやすかったのでリンクを載せておきます。

http://blogs.sqlpassj.org/matu_tak/archive/2004/05/17/2295.aspx

[ メッセージ編集済み 編集者: いとっと 編集日時 2009-02-15 01:03 ]
タカ
会議室デビュー日: 2009/02/14
投稿数: 4
投稿日時: 2009-02-15 08:00
いとっとさん。

丁寧な回答ありがとうございました。

さっそくアドバイスに従い、確認してみたいと思います。
akira
会議室デビュー日: 2004/06/14
投稿数: 6
投稿日時: 2009-02-15 16:15
こんにちわ。

既に色々と意見は出されていると思いますが、もう少し状況をしっかり把握することも必要ではないかと思います。。。
遅くなるということは、その分余計なオーバヘッドとなる何かが動作しているわけで、それを把握しないことには対処に無駄な時間を費やしてしまうのではないかと思いました。

CPU/メモリ/ページング/PhysicalDisk/System等のパフォーマンスカウンタ、SQLServer2005でできるかはわからないんですが(2000ではあったような?)、可能であれば各DBの詳細なactivityをそれぞれ遅くなる前後で監視してみるなどした上で対策を考えた方がいいんじゃないでしょうか。
IKE
常連さん
会議室デビュー日: 2008/03/24
投稿数: 46
投稿日時: 2009-02-19 14:31
こんにちは。

理由は全くわからないのですが、リモートデスクトップでコンソールセッションに
ログインするとメモリが開放されます。
SQLServerのサービス再起動が出来ない場合に使っています。。
たか
会議室デビュー日: 2009/02/08
投稿数: 4
投稿日時: 2009-02-21 02:00
akiraさん、IKEさん、アドバイスありがとうございます。
試してみますね。
また、何かありましたら教えてください。
1

スキルアップ/キャリアアップ(JOB@IT)