.NET 4.0 を使用して、次の sqlcommand を定義しました。何も変更せずに sqlcommand を連続して複数回実行すると、SQL Server はクエリ プランのキャッシュを拒否します。
string[] colors = new string[] { "red", "blue", "yellow", "green" };
string cmdText = "SELECT * FROM ColoredProducts WHERE Color IN ({0})";
string[] paramNames = tags.Select(
(s, i) => "@color" + i.ToString()
).ToArray();
string inClause = string.Join(",", paramNames);
using (SqlCommand cmd = new SqlCommand(string.Format(cmdText, inClause))) {
for(int i = 0; i < paramNames.Length; i++) {
cmd.Parameters.AddWithValue(paramNames[i], tags[i]);
}
//Execute query here
}
次のクエリが連続して実行された後、わずかな時間で実行されていたため、プランのキャッシュを拒否していることがわかります。
string[] colors = new string[] { "red", "blue", "yellow", "green" };
string cmdText = "SELECT * FROM ColoredProducts WHERE Color IN ({0})";
string inClause = string.Join(",", colors);
using (SqlCommand cmd = new SqlCommand(string.Format(cmdText, inClause))) {
//Execute query here
}
私の実際のテスト ケースでは、param リストは正確に 2000 のサイズに固定されています。最適化しようとしているシナリオは、非常に大きなテーブルから 2000 レコードの特定のセットを選択することです。クエリをできるだけ高速にしたいので、本当にキャッシュしたいです。
Sleepy post Edit: 問題は、なぜこのプランがキャッシュされないのかということです。はい、sys.dm_exec_cached_plans と sys.dm_exec_sql_test を使用して、クエリがキャッシュにないことを確認しました。