SQLServer【Index編】#S2_05_検索条件ありで検索

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

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

キャッシュをクリア

実際にキャッシュをクリアしてみましょう。クエリエディターに次のように入力して「実行」をします。

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になっているという事です。