2008-10-24 41 views
17

Tôi đã được giao nhiệm vụ tối ưu hóa một số truy vấn sql tại nơi làm việc. Tất cả mọi thứ tôi đã tìm thấy điểm để sử dụng Explain Plan để xác định các khu vực có vấn đề. Vấn đề tôi không thể tìm ra chính xác những gì giải thích kế hoạch đang nói với tôi. Bạn nhận được Chi phí, Cardinality và byte.Cách sử dụng Giải thích Kế hoạch để tối ưu hóa các truy vấn?

Điều này cho biết điều gì và làm cách nào để sử dụng điều này làm hướng dẫn. Số thấp có tốt hơn không? Tốt hơn? Bất kỳ đầu vào sẽ được đánh giá rất nhiều.

Hoặc nếu bạn có cách tốt hơn để tối ưu hóa truy vấn, tôi sẽ quan tâm.

Trả lời

8

Bạn nhận được nhiều hơn thực tế tùy thuộc vào những gì bạn đang làm. Hãy xem trang explain plan này. Tôi giả định một chút ở đây rằng bạn đang sử dụng Oracle và biết làm thế nào để chạy kịch bản để hiển thị đầu ra kế hoạch. Điều gì có thể quan trọng hơn để bắt đầu với là nhìn vào phía bên tay trái cho việc sử dụng một chỉ số cụ thể hay không và làm thế nào chỉ số đó đang được sử dụng. Bạn sẽ thấy những thứ như "(Đầy đủ)", "(Theo chỉ mục Rowid)", v.v. nếu bạn đang tham gia. Chi phí sẽ là điều tiếp theo để xem xét với chi phí thấp hơn là tốt hơn và bạn sẽ nhận thấy rằng nếu bạn đang làm một tham gia mà không phải là sử dụng một chỉ số bạn có thể nhận được một chi phí rất lớn. Bạn cũng có thể muốn đọc chi tiết về số explain plan columns.

+0

Tôi đánh giá cao sự trợ giúp của bạn và đặc biệt là các liên kết. Nó bắt đầu làm cho tôi kể từ bây giờ. Cảm ơn một lần nữa vì sự giúp đỡ. –

+1

Tham gia không sử dụng các chỉ mục có thể xấu, chúng có thể là tuyệt đối tốt nhất.Tất cả phụ thuộc vào. không, không, không cố gắng loại bỏ tất cả các bảng quét toàn bộ với các chỉ mục. –

6

Bạn có đầu mờ của kẹo. Hoàn toàn không có cách nào, trong sự cô lập, không có nhiều thông tin và kinh nghiệm bổ sung, để xem xét một kế hoạch giải thích và xác định xem cái gì (nếu có) gây ra ít hơn hiệu suất tối ưu. Nếu điều chỉnh truy vấn có thể được giảm xuống một quy trình 10 bước, nó sẽ được thực hiện bởi một quá trình tự động. Tôi sắp liệt kê tất cả những điều bạn cần hiểu để có hiệu quả nhưng đây sẽ là một danh sách rất dài.

câu trả lời ngắn duy nhất tôi có thể nghĩ đến ... là tìm các bước trong kế hoạch đang trải qua nhiều byte hơn bạn dự đoán. Sau đó, suy nghĩ về cách bạn có thể giảm số đó ... thông qua chỉ mục hoặc phân vùng.

Nghiêm túc, có được cuốn sách Lewis Jonathan về Chi phí Dựa Oracle Fundementals

Mua sách Tom Kyte về kiến ​​trúc cơ sở dữ liệu Oracle và thuê một cabin trong rừng trong một vài tuần.

+0

Tôi đã bắt đầu có được cảm giác rằng điều này không đơn giản như ban đầu nó được mô tả cho tôi tại nơi làm việc. Cảm ơn các đề xuất về sách, chúng sẽ được thêm vào danh sách sách của tôi để đọc. –

+1

Không chỉ thêm chúng vào hàng đợi ... di chuyển chúng lên đầu và làm bất cứ điều gì bạn có thể đọc chúng. Tôi sẽ nói cuốn sách của Lewis trước. Đó là hoàn toàn về những gì một kế hoạch giải thích có nghĩa là - mặc dù nó không được viết theo cách đó. –

4

Đây là một lĩnh vực chuyên môn lớn (còn gọi là nghệ thuật đen).

Cách tiếp cận tôi thường thực hiện là:

  1. Chạy câu lệnh SQL trong câu hỏi,
  2. Lấy kế hoạch thực tế (nhìn lên dbms_xplan),
  3. Hãy so sánh số ước tính của hàng (cardinality) vs số hàng thực tế. Một sự khác biệt lớn cho thấy một vấn đề cần được khắc phục (ví dụ: chỉ mục, biểu đồ)
  4. Hãy cân nhắc xem bạn có thể tạo chỉ mục để tăng tốc một phần quy trình hay không. Hãy thử một số chỉ mục.

Bạn cần hiểu tác động O() của các chỉ mục khác nhau trong ngữ cảnh của những gì bạn đang yêu cầu cơ sở dữ liệu. Nó giúp bạn hiểu các cấu trúc dữ liệu như b-tree, bảng băm, vv. Sau đó, tạo một chỉ mục có thể làm việc và lặp lại quá trình.

Nếu Oracle quyết định không sử dụng chỉ mục của bạn, hãy áp dụng gợi ý INDEX() và xem gói mới. Chi phí sẽ lớn hơn kế hoạch mà nó đã chọn - đây là lý do tại sao nó không chọn chỉ mục của bạn.Kế hoạch gợi ý có thể dẫn đến một số thông tin chi tiết về lý do tại sao chỉ mục của bạn không tốt.

+0

Oracle không chọn sử dụng một chỉ mục có vẻ lạ với tôi lúc đầu, cho đến khi giải thích của bạn ở trên, và bây giờ tôi nhận ra tôi đang ở sâu hơn tôi từng nhận ra. Nếu chỉ có họ sẽ giúp chúng tôi có một DBA có kinh nghiệm làm việc với chúng tôi, chúng tôi sẽ tốt hơn. –

7

Tôi cũng giả sử bạn đang sử dụng Oracle. Và tôi cũng khuyên bạn nên kiểm tra trang web của kế hoạch giải thích, để bắt đầu. Có rất nhiều để tối ưu hóa, nhưng nó có thể được học.

Một vài lời khuyên làm theo:

Đầu tiên, khi nhiệm vụ ai đó bạn tối ưu hóa, họ hầu như luôn luôn tìm kiếm hiệu quả chấp nhận được chứ không phải là hoạt động cuối cùng. Nếu bạn có thể giảm thời gian chạy của truy vấn từ 3 phút xuống còn 3 giây, đừng đổ mồ hôi giảm xuống còn 2 giây, cho đến khi bạn được yêu cầu.

Thứ hai, thực hiện kiểm tra nhanh để đảm bảo các truy vấn bạn đang tối ưu hóa là chính xác về mặt logic. Nghe có vẻ ngớ ngẩn, nhưng tôi không thể nói với bạn số lần tôi được yêu cầu tư vấn về truy vấn chạy chậm, chỉ để biết rằng thỉnh thoảng nó đưa ra câu trả lời sai! Và khi nó quay ra, gỡ lỗi truy vấn thường bật ra để tăng tốc độ nó lên là tốt.

Cụ thể, tìm cụm từ "Tham gia Descartes" trong kế hoạch giải thích. Nếu bạn nhìn thấy nó ở đó, cơ hội là rất tốt mà bạn đã tìm thấy một tham gia cartesian không chủ ý. Các mẫu thông thường cho một tham gia cartesian không chủ ý là mệnh đề FROM liệt kê các bảng được phân tách bằng dấu phẩy và các điều kiện kết nối nằm trong mệnh đề WHERE. Ngoại trừ một trong những điều kiện tham gia bị thiếu, vì vậy mà Oracle không có sự lựa chọn nào khác ngoài việc thực hiện một tham gia Descartes. Với các bảng lớn, đây là một thảm họa hiệu suất.

Có thể thấy một Descartes Tham gia trong kế hoạch giải thích hợp truy vấn là một cách logic đúng, nhưng tôi liên kết này với phiên bản cũ của Oracle.

Cũng tìm chỉ mục hợp chất chưa sử dụng. Nếu cột đầu tiên của một chỉ mục hợp chất không được sử dụng trong truy vấn, Oracle có thể sử dụng chỉ mục không hiệu quả hoặc hoàn toàn không. Hãy để tôi đưa ra một ví dụ:

Truy vấn là:

select * from customers  
where 
    State = @State 
    and ZipCode = @ZipCode 

(DBMS không Oracle, vì vậy cú pháp là khác nhau, và tôi đã quên cú pháp gốc).

Xem nhanh chỉ mục cho biết chỉ mục trên Khách hàng có các cột (Quốc gia, Tiểu bang, Mã zip) theo thứ tự đó. Tôi đã thay đổi truy vấn để đọc

select * from customers 
    where Country = @Country 
     and State = @State 
     and ZipCode = @ZipCode 

và bây giờ nó chạy trong khoảng 6 giây thay vì khoảng 6 phút, bởi vì trình tối ưu hóa có thể sử dụng chỉ mục để thuận lợi. Tôi hỏi các lập trình viên ứng dụng tại sao họ đã bỏ qua quốc gia khỏi tiêu chí, và đây là câu trả lời của họ: họ biết rằng tất cả các địa chỉ đều có quốc gia tương đương với 'USA' để họ đoán họ có thể tăng tốc truy vấn bằng cách bỏ tiêu chí đó ra!

Thật không may, tối ưu hóa việc truy xuất cơ sở dữ liệu không thực sự giống như cạo micro giây ra khỏi thời gian tính toán. Nó liên quan đến việc hiểu thiết kế cơ sở dữ liệu, đặc biệt là các chỉ mục, và ít nhất là một tổng quan về cách trình tối ưu hóa thực hiện công việc của nó.

Bạn thường nhận được kết quả tốt hơn từ trình tối ưu hóa khi bạn học cách cộng tác với trình tối ưu hóa thay vì cố gắng vượt qua nó.

Chúc may mắn đến với tốc độ tối ưu hóa!

+0

Cảm ơn lời khuyên. Tôi cũng đã chạy vào vấn đề Tham gia Descartes mà bạn đã đề cập ở trên trong một vài truy vấn khác đang làm việc và điều đó đã tạo ra sự khác biệt lớn về thời gian và bây giờ các truy vấn thực sự trả về những gì chúng được cho là. Đi con số. –

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