Tôi có một truy vấn có các chỉ mục thích hợp và được hiển thị trong kế hoạch truy vấn với chi phí ước tính là khoảng 1.5. Kế hoạch hiển thị Tìm kiếm chỉ mục, tiếp theo là Tra cứu khóa - sẽ tốt cho truy vấn được mong đợi trả về 1 hàng từ một tập hợp từ 5 đến 20 hàng (ví dụ: Tìm kiếm chỉ mục sẽ tìm thấy từ 5 đến 20 hàng và sau 5 - 20 Key Tra cứu, chúng ta nên trả về 1 hàng).Cơ sở dữ liệu đọc khác nhau đáng kể trên một truy vấn với các chỉ mục
Khi chạy tương tác, truy vấn sẽ trả về gần như ngay lập tức. Tuy nhiên, DB theo dõi sáng nay cho thấy runtimes từ sống (một ứng dụng web) mà thay đổi dữ dội; thường là truy vấn đang dùng < 100 Đọc DB và thời gian chạy có hiệu quả ... nhưng chúng tôi đang nhận được một số hoạt động tiêu thụ> 170.000 lần đọc DB và thời gian chạy lên đến 60s (lớn hơn giá trị thời gian chờ của chúng tôi).
Điều gì có thể giải thích biến thể này trong đĩa đọc? Tôi đã thử so sánh các truy vấn một cách tương tác và sử dụng các kế hoạch Thực thi thực tế từ hai lần chạy song song với các giá trị lọc được lấy từ các lần chạy nhanh và chậm, nhưng tương tác cho thấy hiệu quả không có sự khác biệt trong kế hoạch được sử dụng.
Tôi cũng đã cố gắng xác định các truy vấn khác có thể khóa truy vấn này, nhưng tôi không chắc chắn sẽ ảnh hưởng đến DB đọc nhiều ... và trong mọi trường hợp, truy vấn này có xu hướng tồi tệ nhất cho thời gian chạy trong dấu vết của tôi nhật ký.
Cập nhật: Dưới đây là một ví dụ về các kế hoạch sản xuất khi truy vấn được điều hành một cách tương tác:
Hãy bỏ qua 'mất tích chỉ số' text. Nó là đúng là những thay đổi đối với các chỉ mục hiện tại có thể cho phép truy vấn nhanh hơn với ít tra cứu hơn, nhưng đó không phải là vấn đề ở đây (đã có chỉ mục thích hợp). Đây là Thực tế Kế hoạch thực hiện, nơi chúng tôi thấy các con số như Số lượng hàng thực tế. Ví dụ: trên Tìm kiếm chỉ mục, số hàng thực tế là 16 và chi phí I/O là 0,003. Chi phí I/O giống nhau trên Tra cứu chính.
Cập nhật 2: Các kết quả từ những dấu vết cho truy vấn này là:
exec sp_executesql N'select [...column list removed...] from ApplicationStatus where ApplicationGUID = @ApplicationGUID and ApplicationStatusCode = @ApplicationStatusCode;',N'@ApplicationGUID uniqueidentifier,@ApplicationStatusCode bigint',@ApplicationGUID='ECEC33BC-3984-4DA4-A445-C43639BF7853',@ApplicationStatusCode=10
Truy vấn được xây dựng bằng cách sử dụng lớp Gentle.Framework SqlBuilder, trong đó xây dựng các truy vấn parameterised như thế này:
SqlBuilder sb = new SqlBuilder(StatementType.Select, typeof(ApplicationStatus));
sb.AddConstraint(Operator.Equals, "ApplicationGUID", guid);
sb.AddConstraint(Operator.Equals, "ApplicationStatusCode", 10);
SqlStatement stmt = sb.GetStatement(true);
IList apps = ObjectFactory.GetCollection(typeof(ApplicationStatus), stmt.Execute());
Tôi không nghĩ vậy; sự hiểu biết của tôi là hồ sơ sẽ hiển thị đĩa logic đọc ngay cả khi chúng được lấy từ bộ nhớ cache. Không phải cái gì tôi chắc chắn, tuy nhiên. – Nij