it-swarm-vi.tech

Làm thế nào để bạn giải thích kế hoạch giải thích của một truy vấn?

Khi cố gắng hiểu cách một câu lệnh SQL đang thực thi, đôi khi nên xem xét kế hoạch giải thích. Quá trình người ta phải trải qua trong việc diễn giải (có ý nghĩa) của một kế hoạch giải thích là gì? Điều gì nên nổi bật như, "Ồ, điều này đang làm việc tuyệt vời?" so với "Ồ không, điều đó không đúng."

87
user290

Tôi rùng mình bất cứ khi nào tôi thấy các bình luận rằng toàn bộ bảng là xấu và truy cập chỉ mục là tốt. Quét toàn bộ bảng, quét phạm vi chỉ mục, quét chỉ mục đầy đủ nhanh, vòng lặp lồng nhau, nối hợp nhất, tham gia băm, v.v ... là các cơ chế truy cập đơn giản phải được nhà phân tích hiểu và kết hợp với kiến ​​thức về cấu trúc cơ sở dữ liệu và mục đích của truy vấn trong để đạt được bất kỳ kết luận có ý nghĩa.

Quét toàn bộ đơn giản là cách hiệu quả nhất để đọc một tỷ lệ lớn các khối của phân đoạn dữ liệu (bảng hoặc phân vùng bảng), và, trong khi nó thường có thể chỉ ra vấn đề về hiệu năng, chỉ xảy ra trong ngữ cảnh cho dù đó là một cơ chế hiệu quả để đạt được các mục tiêu của truy vấn. Nói như một kho dữ liệu và anh chàng BI, cờ cảnh báo số một về hiệu suất của tôi là một phương thức truy cập dựa trên chỉ mục và một vòng lặp lồng nhau.

Vì vậy, đối với cơ chế cách đọc kế hoạch giải thích, tài liệu Oracle là một hướng dẫn tốt: http://doad.Oracle.com/docs/cd/B28359_01/server.111/b28274/ex_plan.htmlm# PFGRF009

Có một đọc tốt thông qua Hướng dẫn điều chỉnh hiệu suất cũng.

Cũng có một google cho "phản hồi cardinality", một kỹ thuật trong đó một kế hoạch giải thích có thể được sử dụng để so sánh các ước tính của cardinality ở các giai đoạn khác nhau trong một truy vấn với các thông số thực tế có được trong quá trình thực hiện. Tôi tin rằng Wolfgang Breitling là tác giả của phương pháp này.

Vì vậy, điểm mấu chốt: hiểu các cơ chế truy cập. Hiểu cơ sở dữ liệu. Hiểu ý định của truy vấn. Tránh quy tắc của ngón tay cái.

78
David Aldridge

Chủ đề này quá lớn để trả lời trong một câu hỏi như thế này. Bạn nên dành chút thời gian để đọc Hướng dẫn điều chỉnh hiệu suất của Oracle

13
Tony Andrews

Hai ví dụ dưới đây cho thấy quét ĐẦY ĐỦ và quét NHANH CHÓNG bằng INDEX.

Tốt nhất là tập trung vào Chi phí và Cardinality của bạn. Nhìn vào các ví dụ, việc sử dụng chỉ mục giúp giảm chi phí chạy truy vấn.

Nó phức tạp hơn một chút (và tôi không xử lý 100% về vấn đề này) nhưng về cơ bản, Chi phí là chức năng của CPU và IO chi phí và Cardinality là số hàng của Oracle mong đợi để phân tích. Giảm cả hai điều này là một điều tốt.

Đừng quên rằng Chi phí của một truy vấn có thể bị ảnh hưởng bởi truy vấn của bạn và mô hình tối ưu hóa của Oracle (ví dụ: CHI PHÍ, CHỌN, v.v.) và tần suất bạn chạy số liệu thống kê của mình.

Ví dụ 1:

QUÉT http://docs.google.com/a/shanghainetwork.org/File?id=dd8xj6nh_7fj3cr8dx_b

Ví dụ 2 sử dụng Chỉ mục:

INDEX http://docs.google.com/a/fukuoka-now.com/File?id=dd8xj6nh_9fhsqvxcp_b

Và như đã đề xuất, coi chừng BẢNG QUÉT. Bạn thường có thể tránh những điều này.

5
Mark Nold

Tìm kiếm những thứ như quét tuần tự có thể hơi hữu ích, nhưng thực tế là trong các con số ... ngoại trừ khi các con số chỉ là ước tính! Điều thường là xa hữu ích hơn là nhìn vào một kế hoạch truy vấn đang xem xét thực tế thực thi . Trong Postgres, đây là sự khác biệt giữa EXPLAIN và EXPLAIN ANALYZE. GIẢI THÍCH ANALYZE thực sự thực hiện truy vấn và nhận thông tin thời gian thực cho mỗi nút. Điều đó cho phép bạn thấy những gì thực sự xảy ra , thay vì những gì người lập kế hoạch nghĩ sẽ xảy ra. Nhiều lần bạn sẽ thấy rằng việc quét tuần tự hoàn toàn không phải là một vấn đề, thay vào đó là một thứ khác trong truy vấn.

Chìa khóa khác là xác định bước đắt tiền thực sự là gì. Nhiều công cụ đồ họa sẽ sử dụng các mũi tên có kích thước khác nhau để chỉ ra các phần khác nhau của chi phí kế hoạch. Trong trường hợp đó, chỉ cần tìm các bước có mũi tên mỏng đi vào và một mũi tên dày để lại. Nếu bạn không sử dụng GUI, bạn cần phải đánh số và tìm nơi chúng đột nhiên lớn hơn nhiều. Với một chút thực hành, nó trở nên khá dễ dàng để chọn ra các khu vực có vấn đề.

4
decibel

Thực sự đối với các vấn đề như thế này, điều tốt nhất để làm là ASKTOM . Cụ thể, câu trả lời của anh cho câu hỏi đó chứa các liên kết đến tài liệu Oracle trực tuyến, nơi có rất nhiều loại quy tắc được giải thích.

Một điều cần ghi nhớ, đó là giải thích các kế hoạch thực sự là dự đoán tốt nhất.

Sẽ là một ý tưởng tốt khi học cách sử dụng sqlplus và thử nghiệm với lệnh AUTOTRACE. Với một số con số khó, bạn thường có thể đưa ra quyết định tốt hơn.

Nhưng bạn nên ASKTOM. Anh ấy biết tất cả về nó :)

3
EvilTeach

Đầu ra của giải thích cho bạn biết mỗi bước đã thực hiện trong bao lâu. Điều đầu tiên là tìm các bước đã mất một thời gian dài và hiểu ý nghĩa của chúng. Những thứ như quét tuần tự cho bạn biết rằng bạn cần các chỉ mục tốt hơn - chủ yếu là vấn đề nghiên cứu cơ sở dữ liệu và kinh nghiệm cụ thể của bạn.

2
Tom Leys

Một "Ồ không, điều đó không đúng" thường ở dạng quét bảng. Quét bảng không sử dụng bất kỳ chỉ mục đặc biệt nào và có thể góp phần thanh lọc mọi hữu ích trong bộ nhớ đệm. Ví dụ, trong postgreSQL, bạn sẽ thấy nó trông như thế này.

Seq Scan on my_table  (cost=0.00..15558.92 rows=620092 width=78)

Đôi khi, quét bảng là lý tưởng hơn, giả sử, sử dụng một chỉ mục để truy vấn các hàng. Tuy nhiên, đây là một trong những mẫu cờ đỏ mà bạn dường như đang tìm kiếm.

2
convex hull

Về cơ bản, bạn hãy xem từng thao tác và xem các hoạt động "có ý nghĩa" có cho bạn kiến ​​thức về cách nó có thể hoạt động không.

Ví dụ: nếu bạn tham gia hai bảng, A và B trên các cột C và D tương ứng (AC = BD) và kế hoạch của bạn hiển thị quét chỉ mục cụm (thuật ngữ SQL Server - không chắc chắn về thuật ngữ Oracle) trên bảng A, sau đó một vòng lặp lồng nhau tham gia vào một loạt các chỉ mục được tìm kiếm trên bảng B, bạn có thể nghĩ rằng có một vấn đề. Trong kịch bản đó, bạn có thể mong đợi công cụ thực hiện một cặp quét chỉ mục (trên các chỉ mục trên các cột được nối) theo sau là một phép nối hợp nhất. Điều tra sâu hơn có thể tiết lộ số liệu thống kê xấu khiến trình tối ưu hóa chọn mô hình tham gia đó hoặc chỉ mục không thực sự tồn tại.

2
Jonathan Rupp

nhìn vào tỷ lệ phần trăm thời gian dành cho mỗi phần của kế hoạch và xem xét động cơ đang làm gì. ví dụ: nếu nó đang quét một bảng, hãy xem xét đưa một chỉ mục vào (các) trường đang quét

1
Steven A. Lowe

Tôi chủ yếu tìm kiếm chỉ mục hoặc quét bảng. Điều này thường cho tôi biết tôi đang thiếu một chỉ mục trên một cột quan trọng trong câu lệnh where hoặc câu lệnh tham gia.

Từ http://www.sql-server-performance.com/tips/query_execut_plan_analysis_p1.aspx :

Nếu bạn thấy bất kỳ điều nào sau đây trong kế hoạch thực hiện, bạn nên xem xét chúng là dấu hiệu cảnh báo và điều tra chúng về các vấn đề hiệu suất tiềm năng. Mỗi người trong số họ đều kém lý tưởng từ góc độ hiệu suất.

* Index or table scans: May indicate a need for better or  additional indexes.
* Bookmark Lookups: Consider changing the current clustered index,
  consider using a covering index, limit
  the number of columns in the SELECT
  statement.
* Filter: Remove any functions in the WHERE clause, don't include wiews
  in your Transact-SQL code, may need
  additional indexes.
* Sort: Does the data really need to be sorted? Can an index be used to
  avoid sorting? Can sorting be done at
  the client more efficiently? 

Không phải lúc nào cũng có thể tránh được những điều này, nhưng bạn càng có thể tránh chúng, hiệu suất truy vấn sẽ càng nhanh.

1
dpollock