前回はキャッシュについて解説しました。
キャッシュをクリア
実際にキャッシュをクリアしてみましょう。クエリエディターに次のように入力して「実行」をします。
DBCC DROPCLEANBUFFERS DBCC FREEPROCCACHE select * from Shain
このように,キャッシュのクリアコマンドに続けて,SQLを実施すると,キャッシュをクリアしてからSQLが実行されます。
これで1回目に検索した時と同じだけ検索時間がかかるようになりました。
今後は,SQLの前に必ずキャッシュクリアコマンドをつけて実行していきます。
検索条件ありで実行
現在「社員テーブル」には5万件あり,全件検索を行うと,一番上の行に「Id」が「1」のデータが表示されています。ためしに,この1行目のデータをだけが検索結果に表示されるように,SQLを実行してみましょう。
DBCC DROPCLEANBUFFERS DBCC FREEPROCCACHE select * from Shain where Id = 1
このようにSQLを実行すると,Idが「1」の列だけがヒットするため,検索結果は1件になるはずです。この一番上の1行を取得するのに,どれくらいの時間がかかると思いますか?1行なので一瞬で終わると思いますか?
それでは実際に実行してみましょう。
結果はなんと「12秒」です。全件検索したときと同じ時間がかかっています。「なんでこんなに時間がかかるの?」と思うかもしれませんが,検索処理の内部処理が分かれば,検索に時間がかかる理由が理解できるようになります。
実際の実行プラン
検索処理の内部処理は「実行プラン」で確認できます。画面上部の「実際の実行プランを含める」のボタンをクリックしてONにしてください。
この状態でSQLを実行すれば,内部でどのような経路で実行したかを確認することができます。
再度実行
「実際の実行プランを含める」をONにした状態で,もう一度SQLを実行します。先ほど同様に「12秒」ほど検索時間がかかりますが,出力結果に「実行プラン」というタブが表示されるようになります。
この「実行プラン」のタブを選択します。
実行プランタブ
実行プランを表示すると,「TableScan」と表示されています。テーブルスキャンとは,「テーブルをすべて読みました」という意味です。
「スキャン」とは,スキャナーと同じで,端から端まですべて読み込むという処理です。「Idが1」のデータは1件しかないはずなのですが,端から端まで読み込んだという事です。なので,全件検索と同様の「12秒」という時間がかかっているわけです。
ちなみに検索条件なしの全件検索をして「実行プラン」を確認してみてください。今回と同様に「TableScan」(テーブルスキャン)になります。検索条件ありでもなしでもTableScanになっているという事です。