6

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:

alt text

Hãy bỏ qua 'mất tích chỉ số' text. Nó đú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()); 

Trả lời

1

Dữ liệu có bị xóa khỏi bộ nhớ cache không? Đó có thể là giải thích tại sao với bộ nhớ đệm nóng (dữ liệu đã có trong bộ nhớ), số lần đọc được ghi lại rất thấp .... và sau đó khi dữ liệu không còn trong RAM, số lần đọc sẽ tăng vì nó phải đọc nó ra khỏi đĩa lần nữa.

Chỉ là một ý tưởng để mọi thứ chuyển động.

+0

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

1

Chạy trình thu thập thông tin để xem liệu thống kê có đang được cập nhật cùng một lúc hay không. Hoặc chỉ đơn giản là để xem những gì khác đang xảy ra.

Ngoài ra, vui lòng thêm truy vấn SQL cũng như mã khách hàng.

Suy nghĩ:

  • Nghe có vẻ như "5-20" hàng của bạn có thể là xa hơn thế nữa
  • Với một kế hoạch xấu/tham số sniffing bạn muốn có được hiệu suất liên tục xấu
  • Làm thế nào có thể viết xảy ra trên bảng này: đủ để cập nhật số liệu thống kê?
  • Có một số vấn đề về datatype không? (ví dụ: nối các thông số và giới thiệu chuyển đổi kiểu dữ liệu)
+0

@gbn: Thống kê về các chỉ mục liên quan đã được cập nhật khoảng 3 ngày trước theo như tôi thấy (chúng tôi có một công việc buộc nó). Tôi đã thêm một ảnh chụp màn hình của kế hoạch truy vấn (khi chạy tương tác). Tôi không tin rằng có một vấn đề datatype. Đây là một bảng có hồ sơ thêm vào nó (trên một bản sắc PK) thường xuyên ... Tôi sẽ cần phải làm một số nghiên cứu trong những trường hợp này có thể buộc các số liệu thống kê cập nhật và nếu điều đó sẽ hiển thị dưới một lần đọc của truy vấn. – Nij

+0

@Nij: Kế hoạch rõ ràng là OK (tốt, có thể được bảo hiểm) và không giúp đỡ ở đây ... đó là mã SQL và mã máy khách sẽ hữu ích. – gbn

+0

@gbn: Truy vấn được hiển thị trên ảnh chụp màn hình ở trên gần đầu. Tôi không phải là 100% trên những gì bạn có nghĩa là khi bạn nói mã khách hàng, nhưng nếu bạn có nghĩa là một cái gì đó giống như mã nguồn C#, tôi không chắc chắn như thế nào sẽ tác động DB đọc? – Nij

Các vấn đề liên quan