Tìm kiếm của tôi về chủ đề đã đưa tôi đến đây, vì vậy tôi chỉ muốn chia sẻ kinh nghiệm gần đây của tôi về chủ đề này.
Tôi đã chạy SQL 2014, vì vậy tôi nhận ra rằng tôi sẽ an toàn khi phải quan tâm đến 4199 một chút ... nhưng điều đó không đúng ...
Cách chẩn đoán nếu bạn cần 4199
Nếu truy vấn của bạn có vẻ chạy kém , đặc biệt là khi bạn cảm thấy không nên, thì hãy thử thêm phần sau vào phần cuối của câu hỏi để xem nó có khắc phục được tất cả các vấn đề của bạn không, vì bạn có thể cần 4199 ("Kích hoạt tất cả các bản sửa lỗi Trình tối ưu hóa truy vấn." )
SELECT SomeColumn
FROM SomeTable
OPTION(QUERYTRACEON 4199)
Trong tình huống của tôi, tôi đã có một mệnh đề top 10 thổi bùng lên một truy vấn chạy tốt mà không có, đó là điều khiến tôi nghĩ rằng điều gì đó đáng nghi đang xảy ra, và 4199 có thể giúp ích.
Khoảng 4199
Bất kỳ sửa lỗi / hiệu suất Trình tối ưu hóa truy vấn SQL Server nào được tạo sau khi phát hành phiên bản chính mới thực sự bị ẩn và chặn. Đây là trong trường hợp họ thực sự có thể gây hại cho một số chương trình tối ưu hóa hoàn hảo về mặt lý thuyết. Vì vậy, cài đặt các bản cập nhật như bạn có thể, các thay đổi tối ưu hóa truy vấn thực tế không được bật theo mặc định. Do đó, một khi một sửa chữa hoặc cải tiến duy nhất đã được thực hiện, 4199 trở thành một điều cần thiết nếu bạn muốn tận dụng nó. Khi nhiều bản sửa lỗi xuất hiện, cuối cùng bạn sẽ thấy mình bật cái này lên khi một trong số chúng ảnh hưởng đến bạn. Các bản sửa lỗi này thường được gắn với cờ theo dõi riêng của chúng, nhưng 4199 được sử dụng làm chủ "Bật mọi sửa chữa".
Nếu bạn biết bản sửa lỗi nào bạn cần, bạn có thể kích hoạt chúng theo bữa ăn thay vì sử dụng 4199. Nếu bạn muốn bật tất cả các bản sửa lỗi, hãy sử dụng 4199.
Ok, bạn muốn 4199 trên toàn cầu ...
Chỉ cần tạo Công việc Tác nhân SQL chạy mỗi sáng với dòng sau để bật cờ theo dõi trên toàn cầu. Điều này đảm bảo nếu bất cứ ai tắt chúng hoặc vv, rằng chúng được bật lại. Bước công việc này có sql khá đơn giản:
DBCC TRACEON (4199, -1);
Trong đó -1 chỉ định phần Toàn cầu trong DBCC TRACEON. Để biết thêm thông tin xem:
https://msdn.microsoft.com/en-us/l Library / ms187329.aspx? f = 255 & MSPPError =-2347217394
Kế hoạch truy vấn "biên dịch lại"
Trong nỗ lực gần đây nhất của tôi, tôi đã phải kích hoạt 4199 trên toàn cầu và sau đó cũng xóa các gói truy vấn được lưu trong bộ nhớ cache hiện có :
sp_recompile 'dbo.SomeTable'
https://msdn.microsoft.com/en-us/l Library / ms181647.aspx? f = 255 & MSPPError =-2347217394
Trong đó thủ tục lưu trữ biên dịch lại tìm thấy bất kỳ kế hoạch truy vấn nào liên quan đến đối tượng cơ sở dữ liệu (như bảng) và xóa các kế hoạch truy vấn đó, yêu cầu lần thử tiếp theo để chạy một truy vấn tương tự để biên dịch chúng.
Vì vậy, trong trường hợp của tôi, 4199 giữ cho các kế hoạch truy vấn xấu không được tạo, nhưng tôi cũng phải xóa những kế hoạch vẫn được lưu trong bộ nhớ cache thông qua sp_recompile. Chọn bất kỳ bảng nào từ truy vấn đã biết bị ảnh hưởng và bạn nên thử lại truy vấn đó, giả sử bạn đã bật 4199 trên toàn cầu và xóa kế hoạch truy vấn được lưu trong bộ nhớ cache vi phạm.
Kết luận về 4199
Khi bạn sử dụng các chỉ mục, tối ưu hóa kế hoạch truy vấn thông minh trở nên quan trọng để thực sự sử dụng các chỉ mục đó một cách thông minh và giả sử rằng theo thời gian, một số sửa chữa cho quy trình tối ưu hóa truy vấn sẽ được phát hành, nói chung bạn đang ở trong nước an toàn để chạy với 4199 trên toàn cầu, miễn là bạn nhận ra rằng một số sửa chữa mới có thể không thực sự chơi tốt với cơ sở dữ liệu được tối ưu hóa cao đã được tối ưu hóa như vậy trong môi trường trước đó trước khi sửa. Nhưng 4199 làm gì? Nó chỉ cho phép tất cả các bản sửa lỗi.