Đây là những gì tôi đã học được cho đến nay từ nghiên cứu của mình.
.NET gửi cài đặt kết nối không giống như những gì bạn nhận được khi đăng nhập vào quản lý studio. Đây là những gì bạn thấy nếu đánh hơi thấy kết nối với Sql Profiler:
-- network protocol: TCP/IP
set quoted_identifier off
set arithabort off
set numeric_roundabort off
set ansi_warnings on
set ansi_padding on
set ansi_nulls off
set concat_null_yields_null on
set cursor_close_on_commit off
set implicit_transactions off
set language us_english
set dateformat mdy
set datefirst 7
set transaction isolation level read committed
Bây giờ tôi đang dán các cài đặt đó bên trên mọi truy vấn mà tôi chạy khi đăng nhập vào máy chủ sql, để đảm bảo các cài đặt đều giống nhau.
Đối với trường hợp này, tôi đã thử từng cài đặt riêng lẻ, sau khi ngắt kết nối và kết nối lại và nhận thấy rằng việc thay đổi arithabort từ tắt thành bật đã giảm truy vấn sự cố từ 90 giây xuống 1 giây.
Lời giải thích có thể xảy ra nhất là liên quan đến đánh giá tham số, đây là một kỹ thuật mà Sql Server sử dụng để chọn những gì nó cho là kế hoạch truy vấn hiệu quả nhất. Khi bạn thay đổi một trong các cài đặt kết nối, trình tối ưu hóa truy vấn có thể chọn một gói khác và trong trường hợp này, dường như nó đã chọn một gói không hợp lệ.
Nhưng tôi không hoàn toàn bị thuyết phục về điều này. Tôi đã thử so sánh các kế hoạch truy vấn thực tế sau khi thay đổi cài đặt này và tôi vẫn chưa thấy sự khác biệt cho thấy bất kỳ thay đổi nào.
Có điều gì khác về cài đặt arithabort có thể khiến truy vấn chạy chậm trong một số trường hợp không?
Giải pháp có vẻ đơn giản:Chỉ cần đặt arithabort thiết lập vào đầu thủ tục được lưu trữ. Nhưng điều này có thể dẫn đến vấn đề ngược lại:thay đổi các tham số truy vấn và đột nhiên nó chạy nhanh hơn khi "tắt" hơn là "bật".
Hiện tại, tôi đang chạy quy trình 'biên dịch lại' để đảm bảo kế hoạch được tạo lại mỗi lần. Không sao cho báo cáo cụ thể này, vì có thể mất một giây để biên dịch lại và điều này không quá đáng chú ý đối với một báo cáo mất 1-10 giây để trả về (đó là một con quái vật).
Nhưng nó không phải là một tùy chọn cho các truy vấn khác chạy thường xuyên hơn nhiều và cần trả lại càng nhanh càng tốt, chỉ trong vài mili giây.