CHỌN TOP 1 gây hại cho hiệu năng truy vấn; Có cách nào để truy cập dba để khắc phục điều này?


13

Trong một ứng dụng sản xuất (C # nói chuyện với SQL Server 2014 Standard), có một truy vấn giống như thế này, bên dưới. Hầu hết thời gian nó chạy trong một phần nghìn giây. Nhưng đôi khi (đối với các giá trị nhất định @Id), nó trở nên tồi tệ và mất một phút hoặc lâu hơn. Thời gian này dài hơn thời gian chờ của ứng dụng, vì vậy ứng dụng không thành công cho người dùng.

Trong các trường hợp "go nut", tập kết quả trả về hoàn toàn trống, vì nó nằm trong nhiều trường hợp chứ không phải tất cả các trường hợp khác.

May mắn thay, điều này có thể tái sản xuất cả trong môi trường sản xuất và phát triển.

Nhà phát triển cho biết xóa "TOP 1" khỏi truy vấn, sau đó đảm bảo ứng dụng tiêu thụ thêm các hàng của tập kết quả, sẽ giải quyết vấn đề về hiệu suất.

Trình hoạch định truy vấn cho thấy không có chỉ mục khi TOP 1có mặt. (tính bằng dev).

Thay đổi truy vấn và sửa ứng dụng đang được tiến hành. Ra mắt mất một lúc.

Câu hỏi của tôi: Có cách nào có thể truy cập DBA để điều chỉnh hoặc điều chỉnh phiên bản SQL Server sản xuất để khắc phục vấn đề này trước khi ứng dụng thay đổi với truy vấn mới xuất hiện không?

SELECT TOP 1
       subscription_id 
  FROM subscription AS sub
  JOIN billing_info AS bi ON bi.billing_info_id = sub.billing_info_id   
  JOIN person_group AS apg ON apg.person_id = bi.person_id
  JOIN pplan ON pplan.plan_id = sub.plan_id
  JOIN product ON product.product_id = [plan].product_id 
  JOIN product_attribute ON product_attribute.product_id = product.product_id 
 WHERE apg.group_id = @Id
   AND apg.start_date < GETDATE()
   AND (apg.end_date IS NULL OR apg.end_date > GETDATE()) 
   AND (sub.end_date IS NULL OR sub.end_date > GETDATE()) 
   AND product_attribute.attribute_type = 'special feature' 
   AND product_attribute.attribute_data = '1' 
 ORDER BY sub.start_date ASC;

Bạn đã thử nó như là một truy vấn phụ? Ví dụ: chọn top 1
scribe_id

Có lẽ một số điều chỉnh truy vấn "bình thường" sẽ làm việc? Nếu các chỉ số đủ hấp dẫn, các bản quét sẽ biến mất. Đó là ít xâm lấn hơn một hướng dẫn kế hoạch.
usr

Vì vậy, các giá trị tương tự @ID luôn luôn làm cho nó "đi hạt"? Nếu vậy, sau đó kiểm tra bằng một trong các giá trị đó và nắm bắt kế hoạch truy vấn thực tế. Điều đó sẽ cho bạn biết những gì đang xảy ra. Nếu các giá trị "xấu" không nhất quán, thì có vẻ như đây là đánh hơi tham số (xem câu trả lời của @ MartinSmith để biết giải pháp) hoặc nếu không thì vấn đề khóa liên quan đến cách khách hàng thực sự yêu cầu và sử dụng tập kết quả.
RBarryYoung

Câu trả lời:


12

Nếu bạn không thể thay đổi truy vấn, bạn có thể sử dụng hướng dẫn kế hoạch.

Kiểm tra hiệu năng của truy vấn với OPTION (QUERYTRACEON 4138)(sẽ cần ai đó có sysadminquyền để thử điều này).

Nếu điều đó tạo ra hiệu suất thỏa đáng, bạn có thể áp dụng điều này với một hướng dẫn kế hoạch. Nếu nó không tạo ra hiệu suất thỏa đáng, hãy thử và tìm một gợi ý đó. Có thể OPTION (HASH JOIN, MERGE JOIN)nếu các vòng lặp lồng không phù hợp là vấn đề. Bạn có thể cần phải dùng đến USE PLAN N'...'gợi ý.

Một khi bạn biết (các) gợi ý cần thiết, bạn có thể áp dụng chúng bằng cách sử dụng thông tin ở đây .


OPTION (QUERYTRACEON 4138)đã lừa Cảm ơn. Bây giờ để sắp xếp ra hướng dẫn kế hoạch.
O. Jones

0

đối với các nụ cười, hãy thử
`> được thay đổi thành> = vì vậy không chính xác cùng một truy vấn

SELECT TOP 1
       subscription_id 
  FROM subscription AS sub
  JOIN billing_info AS bi 
        ON bi.billing_info_id = sub.billing_info_id   
  JOIN person_group AS apg 
        ON apg.person_id = bi.person_id 
       AND apg.group_id = @Id
       AND apg.start_date < GETDATE()
       AND isnnull(apg.end_date, GETDATE()) >= GETDATE()             
  JOIN pplan 
        ON pplan.plan_id = sub.plan_id
       AND isnnull(sub.end_date, GETDATE()) >= GETDATE()
  JOIN product 
        ON product.product_id = [plan].product_id 
  JOIN product_attribute 
        ON product_attribute.product_id = product.product_id 
       AND product_attribute.attribute_type = 'special feature' 
       AND product_attribute.attribute_data = '1' 
 ORDER BY sub.start_date ASC;

"Việc thay đổi truy vấn và sửa lỗi ứng dụng đang được tiến hành. Ra mắt mất một lúc." OP đang tìm kiếm một giải pháp khắc phục hiệu suất "như hiện tại".
Martin Smith

@MartinSmith Và khi họ đưa ra một bản sửa lỗi thì đây có thể là một bản sửa lỗi tốt hơn. Làm cho ứng dụng tiêu thụ các hàng thừa sẽ là những thay đổi chương trình khác.
paparazzo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.