ASP.NET Webサイトで、独自の独立したデータキャッシュを実行し、データが長期間変化しないため、同じクエリでSQL Serverに2回クエリする必要がありません。そのSQL Serverへの初回(バージン)クエリのパフォーマンスを改善する必要があります。一部のクエリは、SQL Serverが使用する可能性のある大量のデータを処理しますtempdb
。一時テーブル変数や一時テーブルは使用しないので、SQL Serverはtempdb
必要なときにいつでもそれ自体を使用することにしました。
私のデータベースサイズは16Gbですが、サーバーマシンで32Gbの物理RAMを使用できます。
MS SQL Serverのキャッシュ戦略は、同じデータを再度ロードする必要がある場合に、同様のクエリのパフォーマンスを向上させるために、RAMにデータを保持しようとすることを理解しています。さらに、tempdbの代わりに使用可能なRAMを使用して、ディスクアクセスを引き起こさずにパフォーマンスを高速化しようとします。
tempdb SQL Serverに何かを格納する必要があるクエリが来て、十分なRAMが利用できない場合、SQL Serverには2つの選択肢があると思います。
1)キャッシュされたデータをアンロードし、tempdbの代わりにスペアRAMを使用してディスクの書き込みを回避する
2)今後のクエリのためにキャッシュされたデータを保持し、tempdbの使用を開始します。これにより、ディスクへの書き込みが遅くなります。
この状況でSQL Serverがどのような選択をするかはわかりませんが、最初の(バージン)クエリのパフォーマンスのみを考慮し、同じクエリをSQL Serverに再度送信することはないため、選択#1をしたいと思います。 (私は同様のクエリを送信する可能性があります)。
このシナリオのSQL Serverキャッシュ戦略は何ですか?
新しいクエリのtempdbの回避と2回目のクエリの速度の間で、RAMの使用量をどのようにバランスさせますか?
SQL Serverを選択#1するように構成することは可能ですか?はいの場合、どのように?
他にどのようにしてすべてのバージンSQLクエリのパフォーマンスを向上させることができますか?
SQL Serverのキャッシュ戦略がわからないので、データベースをRAMディスクに配置します。これにより、SQL Serverが常に#1を選択する場合でも、キャッシュされていないデータを高速で読み込むことができます。SQL Serverが選択肢#2を選択し続けると、SQL Serverが利用可能なRAMを少なくしてより多くのtempdbを使用し始める可能性があります(RAMディスクに16Gbを使用した後は16Gbしか残りません)tempdb
。
SQL 2008 R2のソリューションに興味がありますが、おそらくSQL 2008、SQL 2005でも同じで、SQL 2000かもしれません。
明確化:
そのボックスで実行されている他のアプリケーションはなく、SQL Server専用です。ウェブサイトは別のボックスで実行されます。
Windows Server 2008 R2 Enterprise 64ビット上のSQL Server 2008 R2 Standard Edition 64ビットです。
読み取り専用クエリのみを実行し、データベースが読み取り専用に設定されています。
すでに良いインデックスがあるとしましょう。この質問は、SQL Serverが選択肢#1と選択肢#2を作ること、それを制御する方法があるかどうか、RAMディスクがバージンクエリの正しい選択を行うのに役立つかどうかについてです。