2012-06-11 39 views
6

Tôi có một câu lệnh chạy trên máy chủ cơ sở dữ liệu Oracle. Tuyên bố có khoảng 5 lần tham gia và không có gì bất thường ở đó. Nó trông khá giống như dưới đây:Sử dụng gợi ý Oracle "FIRST_ROWS" để cải thiện hiệu suất cơ sở dữ liệu Oracle

SELECT field1, field2, field3, ... 
FROM table1, table2, table3, table4, table5 
WHERE table1.id = table2.id AND table2.id = table3.id AND ... 
     table5.userid = 1 

Vấn đề (và những gì là thú vị) là tuyên bố cho userid = 1 mất 1 giây để trở lại 590 hồ sơ. Báo cáo cho userid = 2 mất khoảng 30 giây để trả về 70 bản ghi.

Tôi không hiểu tại sao sự khác biệt quá lớn.

Dường như kế hoạch thực hiện khác nhau được chọn cho tuyên bố với userid = 1 và khác nhau cho userid = 2.

Sau khi tôi thực hiện Oracle Gợi ý FIRST_ROW, hiệu suất trở nên tốt hơn đáng kể. Cả hai câu lệnh (cho cả hai id 1 và 2) đều trả về dưới 1 giây.

SELECT /*+ FIRST_ROWS */ 
     field1, field2, field3, ... 
FROM table1, table2, table3, table4, table5 
WHERE table1.id = table2.id AND table2.id = table3.id AND ... 
     table5.userid = 1 

Câu hỏi:
1) Những lý do có thể cho hiệu suất kém khi userid = 2 (khi gợi ý không được sử dụng)?
2) Tại sao kế hoạch thực hiện lại khác với kế hoạch thực hiện so với câu lệnh khác (khi gợi ý không được sử dụng)?
3) Có điều gì tôi nên cẩn thận khi quyết định thêm gợi ý này vào các truy vấn của tôi không?

Cảm ơn

+2

Thống kê bảng của bạn có cập nhật và chính xác không? – Tebbe

+0

hãy cẩn thận về bộ nhớ đệm khi chạy so sánh hiệu suất. – tbone

+0

Tebbe - Thống kê được cập nhật. Họ có chính xác không, tôi không biết. – bobetko

Trả lời

8

1) lý do có thể cho hiệu suất kém là gì khi userid = 2 (khi gợi ý không được sử dụng)?

Vì Oracle nghĩ rằng một trong những kết quả tạm thời đặt sử dụng gói từ (userid = 1) sẽ rất lớn - có thể không chính xác.

2) Tại sao kế hoạch thực hiện lại khác với một câu lệnh khác (khi gợi ý không được sử dụng)?

Histogram dựa chỉ số

3) Có điều gì mà tôi nên cẩn thận khi quyết định để thêm gợi ý này để truy vấn của tôi?

Miễn là số lượng hồ sơ được trả về nhỏ, gợi ý này sẽ không an toàn - không giống như trình tối ưu hóa sử dụng chỉ mục cụ thể, cách tiếp cận này cho phép Oracle chọn gói khác.

+0

Cảm ơn bạn đã phản hồi nhanh chóng. Điều khó hiểu nhất là chúng tôi đã không có vấn đề này trong 6 năm cho đến 1 tháng trước (khi chúng tôi nâng cấp lên phiên bản mới của Oracle). Kể từ đó hiệu suất bắt đầu trở nên tệ hơn và tệ hơn (đối với một số người dùng). Có bất kỳ hành động nào có thể được thực hiện trên máy chủ Oracle để tối ưu hóa hiệu suất không? Cảm ơn. – bobetko

+0

Bạn có cập nhật thống kê của mình không?Nó sẽ là tốt để thực sự phân tích cho dù bạn cần biểu đồ hay không – Sebas

+0

Bạn đang sử dụng các biến bị ràng buộc và chuyển sang một DBMS với bind-peeking kích hoạt? – symcbean

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