2013-05-17 9 views
5

同じデータベースを2つコピーして同じアプリケーションを使用した場合、.NETアプリケーションのメモリ使用量に大きな違いがあります。唯一の違いは、シナリオ1では、SQL Server 2005 Expressのインスタンスに登録されたデータベースのローカルコピーを使用していることです。シナリオ2では、SQL Server 2008 Enterpriseのインスタンスに登録されたデータベースのリモートコピーを使用しています。SQL Expressクライアントのメモリ使用量がSQL Enterpriseクライアントのメモリ使用量と異なる

私の知る限り、私はSQLパフォーマンスとSQLメモリ使用量に違いがあると思います(Expressには1GBの制限があるため)。

しかし、私が見ているのは、1GB以上のメモリを使用した場合のSQL Expressシナリオのように、メモリ使用量が大きく異なる(1GB)ということです。 SQL Expressも、特に大きなテーブルや大きなクエリではるかに遅くなるようですが、このメモリヒットがSQLであり、消費/クライアントアプリケーションではないと思いますか?

アプリはSystem.Data.SqlClient.SqlConnectionを使用してSQLサーバに接続し、頻繁にSqlCommandSqlBulkCopyの操作を実行します。

ご意見はお寄せいただければ幸いです。

+0

これはリッチクライアントアプリですか?すべての違いは接続文字列ですか? – Rikalous

+0

ほとんどの場合、SQLに接続する.Netアプリケーション(GUIアプリケーションではなくサービスです)です。そして、はい、2つのテストシナリオの唯一の違いは、接続文字列です。 – Jackfruit

+0

どのようにメモリ使用量を測定していますか? 1ヒットでメモリの負荷を消費しているのか、時間の経過と共に徐々に増加していますか? – Rikalous

答えて

1

大きなテーブルとクエリでのスローエクスプレスに関する2番目の質問は、エクスプレス版がエンタープライズ版よりも多くのメモリとディスクを消費しているためです。エンタープライズ版では、Enhanched-Read-ahead and Scan(a.k.a Merry-go-roundスキャン)という機能が使用されています。これは、大きなクエリのパフォーマンスに大きな違いがあります。例えば

は、ユーザーAとユーザーBの両方の問題テーブルスキャンをもたらすSELECT * FROM Customerコマンド、と仮定する。 UserAが最初にコマンドを発行します。 UserBは20秒後にコマンドを発行します。テーブルには1億行(非常に大きなテーブル)があり、Enterprise Edition以外のマシンにスキャンが実行されています。 UserAのテーブルスキャンでは、テーブルの最初のページにあるCustomerテーブルの読み取りが開始されます。 20秒後、一部のページが既にキャッシュからフラッシュされている可能性があるにもかかわらず、UserAのスキャンが、UserAがすでに読み込んでいるページの読み取りを開始します。このプロセスによって、ディスクの競合が激しくなり、メモリが消費されることがあります。

Enterprise Editionでは、先読みとスキャンの機能が少し異なります。 Enterprise Edition以外のバージョンとは異なり、UserAがSELECT * FROM Customerコマンドを発行すると、Enterprise EditionはCustomerテーブルのスキャンを開始します。 UserBが20秒後に同じコマンドを発行すると、UserBのテーブルスキャンは、UserAが現在読み取っている場所で正確に開始されます。 UserAとUserBのクエリはほぼ同時にCustomersテーブルの最後のページを読み取りますが、UserBのスキャンはCustomerテーブルの先頭に戻り、UserBがそのクエリを開始する前にUserAがスキャンしたページをスキャンします。このプロセスにより、ディスクの競合とメモリの消費が大幅に削減されます。

+2

ここでのポイントは、設定で最大サイズを指定しない限り、エンタープライズはすべてのメモリを「食べる」ということです。この製品では、サーバー上で実行されている唯一のアプリケーションであり、適切に構成されているものとします。 – Hogan

+0

はい、大規模なテーブルの別の重要なポイントは、marry-go-roundと呼ばれるエンタープライズ機能です。 – dixpac

+0

OPの質問とは関係がありません。 – Hogan