SQLServer【Index編】#S2_04_キャッシュとは

当サイトではアフィリエイト広告を利用しています。

今回はキャッシュについて解説します。

キャッシュとは?

キャッシュとは,処理を高速に行うための機能です。

コンピューターには,メモリの部分とハードディスクなどのディスクの部分がありますよね。電源を切ったら忘れてしまうメモリと,物理的に書き込んでいるディスクです。

この2つ,どちらも記憶領域ですが,速度が全く違います。ディスクは物理的に書き込まれているので,そのファイルを開いて,読み込みます。メモリは読み込んだ状態で記憶しているので,すぐに使うことができます。この差は1000倍くらいと思っておいていいでしょう。例えば東京大阪間を自転車で移動するのと,新幹線で移動するくらいの速さの違いがあります。なので,メモリ上にデータがあれば速いのですが,ディスクから読み込むと遅いわけです。

キャッシュとは,ディスクから読み込んだデータを,メモリ内に覚えておくことです。こうすることで,再度そのデータを使いたい場合に,すぐに使うことができます。毎回ディスクに読みに行かなくて済みます。

それならすべてメモリに覚えておけばいいと思うかもしれませんが,なかなかそうはいきません。例えばハードディスクが500ギガバイトのPCの場合,メモリが4ギガバイトとか8ギガバイトだったりします。到底すべてのデータをメモリ内に覚えておくことはできません。それにパソコンの処理は当然SQLServer以外にもいろいろと動作していますから,1つのアプリケーションに割り当てられるメモリの限界があり,4ギガバイトであれば,その半分の2ギガまでしかアプリケーションに割り当てられないといった制約があります。

なので,メモリにあったデータの,時間がたてば他のデータに置き換わり,メモリ内からなくなります。そうなればまたディスクから読み込むことになります。

キャッシュのクリア

先述の通り,メモリ内にデータがあれば高速にデータを取得でいますが,初回や,2回目以降も,キャッシュになくなってしまったら,また遅くなるわけですから,SQLでの検索の実力測定は,キャッシュが無い状態で行わないと,本当の力が分かりません。なので,速度を計測する場合は,毎回キャッシュのクリアを行うコマンドを実行してからSQLを実行させます。

本レクチャーでは,毎回下記の2つのコマンドを実施しながらSQLの検証を行います。

キャッシュクリアのコマンド

DBCC DROPCLEANBUFFERS バッファー プールのクリーン バッファーと、列ストア オブジェクト プールの列ストア オブジェクトをすべて削除します。
DBCC FREEPROCCACHE プラン キャッシュからすべての要素を削除するか、プラン ハンドルまたは SQL ハンドルを指定して特定のプランを削除するか、指定したリソース プールに関連付けられたすべてのキャッシュ エントリを削除します。