私はそれが読み取り専用些細な計画はシンプルなパラメータ化することができ、そしてすべてのクエリは、(計画が簡易であっても)ではないことをパラメータ化されたシンプルなことができます。
では、なぜこの計画は完全な最適化と単純なパラメータ化を同時に示しているのでしょうか?
私はそれが読み取り専用些細な計画はシンプルなパラメータ化することができ、そしてすべてのクエリは、(計画が簡易であっても)ではないことをパラメータ化されたシンプルなことができます。
では、なぜこの計画は完全な最適化と単純なパラメータ化を同時に示しているのでしょうか?
回答:
単純な計画が見つかると、単純なパラメーター化が試行されます。パラメータ化の試みは安全か安全でないと考えられるかもしれません。
重要な点は、簡単な計画が見つかり、安全であると見なされることです。自明な計画のコストがを超えるcost threshold for parallelism
場合、オプティマイザは最適化の後の段階に進み、並列計画が検討されます。最終結果がシリアルプランでもパラレルプランでも、見つかった(ただし最終的には使用されない)安全な簡単なプランがパラメーター化されていれば、単純にパラメーター化されます。
質問の例でcost threshold for parallelism
は、簡単な計画のコストよりも高く設定すると、オプティマイザはその段階で停止できます。
クエリプランを確認するだけでは、クエリが実際に単純なパラメーター化されているかどうかを判断できるとは限りません。
最も安全な方法は、いくつかのDMVをチェックして確認することです。
/*Unsafe auto param*/
SELECT *
FROM sys.dm_os_performance_counters AS dopc
WHERE dopc.counter_name LIKE '%Unsafe Auto-Params/sec%';
/*Safe auto param*/
SELECT *
FROM sys.dm_os_performance_counters AS dopc
WHERE dopc.counter_name LIKE '%Safe Auto-Params/sec%';
/*Trivial Plans*/
SELECT *
FROM sys.dm_exec_query_optimizer_info AS deqoi
WHERE deqoi.counter = 'trivial plan';
さらに、文書化されていないトレースフラグ8607を使用することもできますが、OPTION
句のヒントとしては使用できません。このOPTION
句を使用すると、簡単な計画ができなくなります。
DBCC TRACEON(8607, 3604);
/*Wait*/
/*Run*/
SELECT u.CreationDate, u.Id
FROM dbo.Users AS u
WHERE u.Reputation = 2;
/*Clean up*/
DBCC TRACEOFF(8607, 3604);
プランがSimple Parameterizationに対して安全であると考えられる場合、それを確認するメッセージがここに表示されます。
******************** ** Query marked as Cachable ** Query marked as Safe for Auto-Param