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

Các tác động về hiệu suất của Mệnh đề Oracle IN không có phép nối là gì?

Nếu số liệu thống kê trên bảng của bạn là chính xác, thì rất ít khả năng trình tối ưu hóa sẽ chọn quét bảng thay vì sử dụng chỉ mục khóa chính khi bạn chỉ có 1000 phần tử được mã hóa cứng trong WHERE mệnh đề. Cách tiếp cận tốt nhất là thu thập (hoặc thiết lập) số liệu thống kê chính xác về các đối tượng của bạn vì điều đó sẽ khiến những điều tốt đẹp tự động xảy ra thay vì cố gắng thực hiện nhiều bài tập thể dục để giải quyết các số liệu thống kê không chính xác.

Nếu chúng tôi giả định rằng thống kê không chính xác ở mức độ mà trình tối ưu hóa sẽ tin rằng việc quét bảng sẽ hiệu quả hơn so với việc sử dụng chỉ mục khóa chính, bạn có thể thêm vào DYNAMIC_SAMPLING gợi ý rằng điều đó sẽ buộc trình tối ưu hóa thu thập số liệu thống kê chính xác hơn trước khi tối ưu hóa câu lệnh hoặc CARDINALITY gợi ý để ghi đè ước tính số lượng mặc định của trình tối ưu hóa. Không ai trong số đó yêu cầu biết bất kỳ điều gì về các chỉ mục có sẵn, nó sẽ chỉ yêu cầu biết bí danh bảng (hoặc tên nếu không có bí danh). DYNAMIC_SAMPLING sẽ là cách tiếp cận an toàn hơn, mạnh mẽ hơn nhưng sẽ thêm thời gian cho bước phân tích cú pháp.

Nếu bạn đang xây dựng một câu lệnh SQL với một số lượng thay đổi các tham số được mã hóa cứng trong IN , bạn có thể sẽ tự tạo ra các vấn đề về hiệu suất bằng cách làm ngập nhóm chia sẻ của mình bằng SQL không thể chia sẻ và buộc cơ sở dữ liệu dành nhiều thời gian để phân tích cú pháp từng biến thể riêng biệt. Sẽ hiệu quả hơn nhiều nếu bạn tạo một câu lệnh SQL có thể chia sẻ duy nhất có thể được phân tích cú pháp một lần. Tùy thuộc vào nơi IN của bạn giá trị mệnh đề đến từ, có thể trông giống như

SELECT *
  FROM table_name
 WHERE primary_key IN (SELECT primary_key
                         FROM global_temporary_table);

hoặc

SELECT *
  FROM table_name
 WHERE primary_key IN (SELECT primary_key
                         FROM TABLE( nested_table ));

hoặc

SELECT *
  FROM table_name
 WHERE primary_key IN (SELECT primary_key
                         FROM some_other_source);

Nếu bạn đã hiểu một câu lệnh SQL có thể chia sẻ duy nhất, thì ngoài việc tránh chi phí liên tục phân tích lại câu lệnh, bạn có một số tùy chọn để buộc một kế hoạch cụ thể không liên quan đến việc sửa đổi câu lệnh SQL. Các phiên bản khác nhau của Oracle có các tùy chọn khác nhau về độ ổn định của gói - có phác thảo được lưu trữ , Quản lý kế hoạch SQL Cấu hình SQL trong số các công nghệ khác tùy thuộc vào bản phát hành của bạn. Bạn có thể sử dụng chúng để buộc các kế hoạch cụ thể cho các câu lệnh SQL cụ thể. Tuy nhiên, nếu bạn tiếp tục tạo các câu lệnh SQL mới phải được phân tích cú pháp lại, thì việc sử dụng các công nghệ này sẽ trở nên rất khó khă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. Tại sao tôi dường như không thể buộc Oracle 11g tiêu thụ nhiều CPU hơn cho một truy vấn SQL duy nhất

  2. Cài đặt Oracle 12c Standard Edition trên Windows 10 Professional

  3. Lấy tổng một số cột từ hai bảng

  4. Cách chuyển số thành từ - ORACLE

  5. làm thế nào để chèn ngày và giờ trong oracle?