Tham số hóa đơn giản được thử khi tìm thấy một kế hoạch tầm thường . Nỗ lực tham số hóa có thể được coi là an toàn hoặc không an toàn .
Điểm mấu chốt là một kế hoạch tầm thường được tìm thấy và được coi là an toàn . Nếu chi phí của kế hoạch tầm thường vượt quá cost threshold for parallelism
, trình tối ưu hóa sẽ chuyển sang các giai đoạn tối ưu hóa sau này, trong đó các kế hoạch song song có thể được xem xét. Cho dù kết quả cuối cùng là một kế hoạch nối tiếp hoặc song song, nó sẽ được tham số hóa đơn giản nếu kế hoạch tầm thường an toàn được tìm thấy ( nhưng cuối cùng không được sử dụng ) được tham số hóa.
Trong ví dụ câu hỏi, đặt giá cost threshold for parallelism
cao hơn chi phí của kế hoạch tầm thường sẽ cho phép trình tối ưu hóa dừng ở giai đoạn đó.
Nhìn vào kế hoạch truy vấn không phải lúc nào cũng đủ để biết liệu truy vấn của bạn có thực sự được Tham số hóa đơn giản hay không.
Cách an toàn nhất là kiểm tra một số DMV để xác minh:
/*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';
Ngoài ra, bạn cũng có thể sử dụng cờ theo dõi không có giấy tờ 8607, nhưng không phải là một OPTION
gợi ý mệnh đề. Sử dụng OPTION
mệnh đề ngăn chặn một kế hoạch tầm thường.
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);
Nếu gói được coi là an toàn cho Tham số đơn giản, bạn sẽ thấy một thông báo xác nhận nó ở đây.
********************
** Query marked as Cachable
** Query marked as Safe for Auto-Param