Đây là những gì tôi đã học được cho đến nay từ nghiên cứu của tôi.
.NET gửi trong cài đặt kết nối không giống với những gì bạn nhận được khi đăng nhập vào studio quản lý. Đây là những gì bạn nhìn thấy nếu bạn sniff các 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
Tôi bây giờ dán những thiết lập trong 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 thiết lập đề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à thấy rằng việc thay đổi arithabort từ tắt sang giảm truy vấn vấn đề từ 90 giây xuống còn 1 giây.
Giải thích có thể xảy ra nhất liên quan đến đánh hơi thông số, là một kỹ thuật mà Sql Server sử dụng để chọn những gì nó nghĩ 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, nó dường như đã chọn một thiết lập xấu.
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 chưa thấy sự khác biệt hiển thị 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 vào phần đầu của quy trình đượ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 với 'off' hơn 'on'.
Hiện tại, tôi đang chạy quy trình 'với biên dịch lại' để đảm bảo gói được khôi phục mỗi lần. Đó là Ok cho báo cáo đặc biệt này, vì nó có thể mất một giây để biên dịch lại, và điều này không quá đáng chú ý trên một báo cáo mất 1-10 giây để trở lại (đó là một con quái vật).
Nhưng đó không phải là 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 phải quay lại nhanh nhất có thể, chỉ trong vài phần nghìn giây.
Tôi gặp vấn đề tương tự và http://stackoverflow.com/questions/250713/sqldataadapter-fill-method-slow giải quyết được vấn đề của mình – David