sql >> データベース >  >> RDS >> Sqlserver

SQL Server キャッシュに関する質問

    クエリを実行すると、データがブロック単位でメモリに読み込まれます。これらのブロックはメモリに残りますが、「古く」なります。これは、ブロックが最後のアクセスでタグ付けされ、Sql Server が新しいクエリのために別のブロックを必要とし、メモリ キャッシュがいっぱいになると、使用頻度が最も低いブロック (最も古いブロック) がメモリから追い出されることを意味します。 (ほとんどの場合、フル テーブル スキャン ブロックは即座にエージングされ、フル テーブル スキャンがメモリをオーバーランしてサーバーを詰まらせないようにします)。

    ここで起こっていることは、最初のクエリからのメモリ内のデータ ブロックがまだメモリから追い出されていないため、2 番目のクエリに使用できるということです。つまり、ディスク アクセスが回避され、パフォーマンスが向上します。

    したがって、あなたの質問が本当に求めているのは、「必要なデータ ブロックをメモリに読み込まずに (実際にクエリを実行して) メモリに取得できますか?」ということです。テーブル全体をキャッシュし、それらをメモリに永続的に常駐させたい場合を除き、答えはノーです。これは、説明しているクエリ時間 (およびデータ サイズ) から考えると、おそらく良い考えではありません。

    パフォーマンスを向上させるための最善の策は、クエリの実行計画を調べて、インデックスを変更することでより良い結果が得られるかどうかを確認することです。ここでパフォーマンスを改善できる主な領域が 2 つあります。

    • 非効率なクエリやテーブル全体のスキャンを避けるために、クエリで使用できるインデックスを作成する
    • インデックスに列を追加して、2 回目のディスク読み取りを回避する。たとえば、列 A と B を返し、A と C に where 句を指定したクエリがあり、列 A にインデックスがあるとします。このクエリでは、列 A のインデックスを使用して 1 回のディスク読み取りが必要ですが、その後 2 番目のディスクが必要になります。ヒットして列 B と C を取得します。インデックスにすべての列 A、B、C が含まれている場合、データを取得するための 2 回目のディスク ヒットを回避できます。


    1. MYSQLエラー1096-テーブルが使用されていません-CODEIGNITER

    2. mysql:非常に単純なSELECT id ORDER BY LIMITは、期待どおりにINDEXを使用しません(?!)

    3. SQLでランダムにバイアスされていますか?

    4. 挿入/更新イベントでのMySQLトリガー