Tôi đã gặp một tình huống kỳ lạ khi nối thêm OPTION (RECOMPILE)
vào truy vấn của mình khiến nó chạy trong nửa giây, trong khi bỏ qua nó khiến truy vấn mất hơn năm phút.
Đây là trường hợp khi truy vấn được thực thi từ Trình phân tích truy vấn hoặc từ chương trình C # của tôi thông qua SqlCommand.ExecuteReader()
. Gọi (hoặc không gọi) DBCC FREEPROCCACHE
hoặc DBCC dropcleanbuffers
không có sự khác biệt; Kết quả truy vấn luôn được trả về ngay lập tức với OPTION (RECOMPILE)
và lớn hơn năm phút mà không có nó. Truy vấn luôn được gọi với cùng tham số [vì mục đích kiểm tra này].
Tôi đang sử dụng SQL Server 2008.
Tôi khá thoải mái với việc viết SQL nhưng chưa bao giờ sử dụng một OPTION
lệnh trong truy vấn trước đây và không quen thuộc với toàn bộ khái niệm về bộ đệm kế hoạch cho đến khi quét các bài đăng trên diễn đàn này. Sự hiểu biết của tôi từ các bài viết OPTION (RECOMPILE)
là một hoạt động đắt tiền. Nó rõ ràng tạo ra một chiến lược tra cứu mới cho truy vấn. Vậy tại sao sau đó, các truy vấn tiếp theo mà bỏ qua OPTION (RECOMPILE)
rất chậm? Không nên sử dụng các truy vấn tiếp theo bằng cách sử dụng chiến lược tra cứu được tính trên cuộc gọi trước đó có bao gồm gợi ý biên dịch lại không?
Có phải là rất bất thường khi có một truy vấn yêu cầu gợi ý biên dịch lại trên mỗi cuộc gọi không?
Xin lỗi cho câu hỏi cấp độ đầu vào nhưng tôi thực sự không thể thực hiện đầu hoặc đuôi của vấn đề này.
CẬP NHẬT: Tôi đã được yêu cầu gửi truy vấn ...
select acctNo,min(date) earliestDate
from(
select acctNo,tradeDate as date
from datafeed_trans
where feedid=@feedID and feedDate=@feedDate
union
select acctNo,feedDate as date
from datafeed_money
where feedid=@feedID and feedDate=@feedDate
union
select acctNo,feedDate as date
from datafeed_jnl
where feedid=@feedID and feedDate=@feedDate
)t1
group by t1.acctNo
OPTION(RECOMPILE)
Khi chạy thử nghiệm từ Trình phân tích truy vấn, tôi thêm vào các dòng sau:
declare @feedID int
select @feedID=20
declare @feedDate datetime
select @feedDate='1/2/2009'
Khi gọi nó từ chương trình C # của tôi, các tham số được truyền qua thuộc SqlCommand.Parameters
tính.
Đối với mục đích của cuộc thảo luận này, bạn có thể giả sử rằng các tham số không bao giờ thay đổi để chúng tôi có thể loại trừ tham số phụ tối ưu có mùi là nguyên nhân.
X = @X OR @X IS NULL
lại X=@X
và thực hiện tìm kiếm Xem tại đây hoặc đẩy các vị từ xuống xa hơn so với chế độ xem với các chức năng của cửa sổ
RECOMPILE
. Trong mọi trường hợp, nắm bắt các kế hoạch thực hiện và xem xét sự khác biệt.