アドホックの場合に使用される変数を、sp_executesqlを使用するときに渡すパラメーターに変換することを除いて、両方の場合に同じクエリを使用しています。私は当初、プランの唯一の違いは、sp_executesqlがすでにキャッシュにあるプランを再利用した場合であるという印象を受けていました。しかし、私が見つけたのは、プランのキャッシュが空の場合でもプランが異なる可能性があるということでした。
さらなるテストでは、sp_executesqlがパラメータースニッフィング(指定された特定のパラメーターに基づいて最適なプランを選択)を使用しているのに対し、アドホッククエリは使用していないことが示されているようです。アドホックケースの2つのバージョンをテストしたため、この結論に達しました。1つは通常で、もう1つはすべての変数でOPTIMIZE FOR UNKNOWNを使用し、計画は私が試したいくつかのケースで同一でした。
sp_executesqlがパラメーターを使用する場合のように、アドホッククエリが変数値に基づいて最適化されないことを誰かが確認できますか?