Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Hiểu kết quả của Kế hoạch Giải thích Thực thi trong Nhà phát triển SQL Oracle

Đầu ra của EXPLAIN PLAN là đầu ra gỡ lỗi từ trình tối ưu hóa truy vấn của Oracle. COST là kết quả cuối cùng của công cụ tối ưu hóa dựa trên chi phí (CBO), mục đích của công cụ này là chọn phương án nào trong số nhiều phương án có thể có sẽ được sử dụng để chạy truy vấn. CBO tính toán Chi phí tương đối cho mỗi gói, sau đó chọn gói có chi phí thấp nhất.

(Lưu ý:trong một số trường hợp, CBO không có đủ thời gian để đánh giá mọi kế hoạch khả thi; trong những trường hợp này, CBO chỉ chọn kế hoạch có chi phí thấp nhất cho đến nay)

Nói chung, một trong những yếu tố góp phần lớn nhất dẫn đến truy vấn chậm là số hàng được đọc để phục vụ truy vấn (chính xác hơn là khối), vì vậy chi phí sẽ được một phần về số hàng, ước tính của trình tối ưu hóa sẽ cần được đọc.

Ví dụ:giả sử bạn có truy vấn sau:

SELECT emp_id FROM employees WHERE months_of_service = 6;

(months_of_service có ràng buộc NOT NULL trên nó và một chỉ mục bình thường trên đó.)

Có hai kế hoạch cơ bản mà người tối ưu hóa có thể chọn ở đây:

  • Kế hoạch 1:Đọc tất cả các hàng từ bảng "nhân viên", đối với mỗi hàng, kiểm tra xem vị từ có đúng không (months_of_service=6 ).
  • Kế hoạch 2:Đọc chỉ mục trong đó months_of_service=6 (điều này dẫn đến một tập hợp ROWID), sau đó truy cập vào bảng dựa trên ROWID được trả về.

Hãy tưởng tượng bảng "nhân viên" có 1.000.000 (1 triệu) hàng. Hãy tưởng tượng thêm rằng các giá trị cho months_of_service nằm trong khoảng từ 1 đến 12 và được phân phối khá đồng đều vì một số lý do.

Chi phí của Gói 1 , liên quan đến QUÉT ĐẦY ĐỦ, sẽ là chi phí để đọc tất cả các hàng trong bảng nhân viên, xấp xỉ bằng 1.000.000; nhưng vì Oracle thường có thể đọc các khối bằng cách đọc nhiều khối, nên chi phí thực tế sẽ thấp hơn (tùy thuộc vào cách cơ sở dữ liệu của bạn được thiết lập) - ví dụ:hãy tưởng tượng số lần đọc nhiều khối là 10 - chi phí tính toán của toàn bộ quá trình quét sẽ là 1.000.000 / 10; Chi phí miệng =100.000.

Chi phí của Kế hoạch 2 , liên quan đến QUÉT NGUỒN CHỈ SỐ và tra cứu bảng theo ROWID, sẽ là chi phí quét chỉ mục, cộng với chi phí truy cập bảng theo ROWID. Tôi sẽ không đi sâu vào chi phí quét phạm vi chỉ mục như thế nào nhưng hãy tưởng tượng chi phí quét phạm vi chỉ mục là 1 trên mỗi hàng; chúng tôi hy vọng sẽ tìm thấy kết quả phù hợp trong 1 trong số 12 trường hợp, vì vậy chi phí quét chỉ mục là 1.000.000 / 12 =83.333; cộng với chi phí truy cập bảng (giả sử 1 khối được đọc cho mỗi lần truy cập, chúng ta không thể sử dụng các lần đọc nhiều khối ở đây) =83,333; Tổng chi phí =166,666.

Như bạn có thể thấy, chi phí của Kế hoạch 1 (quét toàn bộ) thấp hơn chi phí của Kế hoạch 2 (quét chỉ mục + truy cập theo hàng) - có nghĩa là CBO sẽ chọn quét TOÀN BỘ.

Nếu các giả định do người tối ưu đưa ra ở đây là đúng, thì trên thực tế, Kế hoạch 1 sẽ thích hợp hơn và hiệu quả hơn nhiều so với Kế hoạch 2 - điều này bác bỏ lầm tưởng rằng quét TOÀN BỘ là "luôn luôn xấu".

Kết quả sẽ hoàn toàn khác nếu mục tiêu của trình tối ưu hóa là FIRST_ROWS (n) thay vì ALL_ROWS - trong trường hợp đó, trình tối ưu hóa sẽ ưu tiên Kế hoạch 2 vì nó thường sẽ trả về một số hàng đầu tiên nhanh hơn, với chi phí kém hiệu quả hơn cho toàn bộ truy vấn .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sử dụng bí danh trong khi một phần của một câu lệnh tình huống trong Oracle SQL

  2. Tìm các mục trùng lặp trong một cột

  3. Mất điện với EMCLI

  4. Cách thay đổi định dạng ngày trong phiên Oracle của bạn

  5. Làm thế nào để loại bỏ nhiều phân vùng khoảng thời gian dựa trên ngày?