コマンドを使用した 2 番目のクエリは、EXECUTE
コマンドを使用しない最初のクエリよりも 4 倍高速に実行されるのはなぜですか? どうすればこの問題を解決できますか?
2 番目のケースで追加のテーブル (Workatable) が作成されるのはなぜですか?
変数:
DECLARE @count INT, @followerId BIGINT
SET @count=1024
SET @followerId=10
最初のクエリ (通常のクエリ):
SELECT TOP (@count) Photo.* FROM Photo
WHERE EXISTS (SELECT accountId FROM Follower
WHERE Follower.followerId=@followerId
AND Follower.accountId = Photo.accountId)
AND Photo.closed='False'
ORDER BY Photo.createDate DESC
ログ:
SQL Server の解析時間とコンパイル時間: CPU 時間 = 0 ミリ秒、経過時間 = 7 ミリ秒。
SQL Server 実行時間: CPU 時間 = 0 ミリ秒、経過時間 = 0 ミリ秒。
テーブル「写真」。スキャン カウント 952、論理読み取り 542435、物理読み取り 0、先読み読み取り 0、LOB 論理読み取り 0、LOB 物理読み取り 0、LOB 先読み読み取り 0。
テーブル「フォロワー」。スキャン カウント 1、論理読み取り 7、物理読み取り 0、先読み読み取り 0、LOB 論理読み取り 0、LOB 物理読み取り 0、LOB 先読み読み取り 0。
SQL Server 実行時間: CPU 時間 = 1466 ミリ秒、経過時間 = 9620 ミリ秒。
実行計画:
2 番目のクエリ ( と同じクエリEXECUTE
):
EXEC ('SELECT TOP (' +@count + ') Photo.* FROM Photo
WHERE EXISTS ( SELECT accountId FROM Follower
WHERE Follower.followerId=' +@followerId + '
AND Follower.accountId = Photo.accountId)
AND Photo.closed=''False''
ORDER BY Photo.createDate DESC')
ログ:
SQL Server の解析時間とコンパイル時間: CPU 時間 = 0 ミリ秒、経過時間 = 0 ミリ秒。
SQL Server 実行時間: CPU 時間 = 0 ミリ秒、経過時間 = 0 ミリ秒。
SQL Server 実行時間: CPU 時間 = 0 ミリ秒、経過時間 = 0 ミリ秒。SQL Server の解析時間とコンパイル時間: CPU 時間 = 25 ミリ秒、経過時間 = 25 ミリ秒。
テーブル「ワークテーブル」。スキャン カウント 0、論理読み取り 0、物理読み取り 0、先読み読み取り 0、LOB 論理読み取り 0、LOB 物理読み取り 0、LOB 先読み読み取り 0。
テーブル「写真」。スキャン数 952、論理読み取り 542707、物理読み取り 0、先読み読み取り 0、LOB 論理読み取り 0、LOB 物理読み取り 0、LOB 先読み読み取り 0。
テーブル「フォロワー」。スキャン カウント 6、論理読み取り 9、物理読み取り 0、先読み読み取り 0、LOB 論理読み取り 0、LOB 物理読み取り 0、LOB 先読み読み取り 0。
テーブル「ワークテーブル」。スキャン カウント 0、論理読み取り 0、物理読み取り 0、先読み読み取り 0、LOB 論理読み取り 0、LOB 物理読み取り 0、LOB 先読み読み取り 0。
SQL Server 実行時間: CPU 時間 = 1374 ミリ秒、経過時間 = 2140 ミリ秒。
SQL Server 実行時間: CPU 時間 = 1405 ミリ秒、経過時間 = 2165 ミリ秒。