次のクエリを使用して、DB から上位 100 行と 101 行を抽出し、経過時間に従って取得しますが、これは完全に異なります (2 番目のクエリは最初よりも 8 倍遅くなります)。
SELECT TOP (100) *
FROM PhotoLike WHERE photoAccountId=@accountId AND accountId<>@accountId
ORDER BY createDate DESC
GO
SQL Server 実行時間: CPU 時間 = 187 ミリ秒、経過時間 = 202 ミリ秒。
SELECT TOP (101) *
FROM PhotoLike WHERE photoAccountId=@accountId AND accountId<>@accountId
ORDER BY createDate DESC
GO
SQL Server 実行時間: CPU 時間 = 266 ミリ秒、経過時間 = 1644 ミリ秒。
最初の 2 つのケースの実行計画:
しかし、@acoundId 変数を取り除くと、次の結果が得られます。これは、この質問の最初のクエリとほぼ同じで、2 倍以上高速です。
SELECT TOP (100) *
FROM PhotoLike WHERE photoAccountId=10 AND accountId<>10
ORDER BY createDate DESC
GO
SQL Server 実行時間: CPU 時間 = 358 ミリ秒、経過時間 = 90 ミリ秒。
SELECT TOP (101) *
FROM PhotoLike WHERE photoAccountId=10 AND accountId<>10
ORDER BY createDate DESC
GO
SQL Server 実行時間: CPU 時間 = 452 ミリ秒、経過時間 = 93 ミリ秒。
2 番目の 2 つのケースの実行計画:
なぜこれが起こるのですか?どうすれば変数を使用してパフォーマンスを向上させることができますか?
アップデート
実行計画を追加しました。