FULL最適化のプランが単純なパラメーター化を示すのはなぜですか?


8

私はそれが読み取り専用些細な計画はシンプルなパラメータ化することができ、そしてすべてのクエリは、(計画が簡易であっても)ではないことをパラメータ化されたシンプルなことができます

では、なぜこの計画は完全な最適化と単純なパラメータ化を同時に示しているのでしょうか?

ナッツ

回答:


7

単純計画が見つかると、単純なパラメーター化が試行されます。パラメータ化の試みは安全安全でないと考えられるかもしれません

重要な点は、簡単な計画が見つかり安全であると見なされることです。自明な計画のコストがを超える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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.