Mengapa rencana dengan optimasi LENGKAP menunjukkan parameterisasi sederhana?

Jawaban:

7

Parameterisasi sederhana dicoba ketika rencana sepele ditemukan. Upaya parameterisasi dapat dianggap aman atau tidak aman .

Poin kuncinya adalah bahwa rencana sepele ditemukan dan dianggap aman . Jika biaya rencana sepele melebihi cost threshold for parallelism, pengoptimal akan melanjutkan ke tahap optimalisasi selanjutnya, di mana rencana paralel dapat dipertimbangkan. Apakah hasil akhirnya adalah rencana serial atau paralel, itu akan menjadi parameter sederhana jika rencana sepele yang aman ditemukan ( tetapi tidak pada akhirnya digunakan ) telah diparameterisasi.

Dalam contoh pertanyaan, pengaturan yang cost threshold for parallelismlebih tinggi daripada biaya rencana sepele akan memungkinkan pengoptimal berhenti pada tahap itu.


Melihat paket permintaan tidak selalu cukup untuk mengetahui apakah permintaan Anda sebenarnya adalah Parameter Sederhana.

Cara teraman adalah memeriksa beberapa DMV untuk memverifikasi:

/*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';

Selain itu, Anda juga dapat menggunakan tanda jejak yang tidak berdokumen 8607, tetapi tidak sebagai OPTIONpetunjuk klausa. Menggunakan OPTIONklausa mencegah rencana sepele.

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);

Jika paket tersebut dianggap aman untuk Parameterisasi Sederhana, Anda akan melihat pesan yang mengonfirmasi di sini.

********************

** Query marked as Cachable

** Query marked as Safe for Auto-Param
Erik Darling
sumber