Cardinality là quá xa thực tế


7

Tôi đã có một bảng trong đó mức độ chính xác cho các kế hoạch dường như quá cao - mặc dù đã cập nhật số liệu thống kê và thậm chí đang thử lấy mẫu động cho Oracle 11gR2.

select count(*) 
from table1 
where col1 = 123 
and col2 = '1';

Giá trị cardinality ước tính cho một giá trị của col1 là khoảng 29k, khi các hàng thực tế mà nó trả về là 637. Đối với một giá trị khác, cardinality kế hoạch của nó là 460k khi các hàng thực tế là 67k. Nói chung, điều này khiến nó chọn các kế hoạch rất xấu ..

Tôi đã thử cập nhật số liệu thống kê:

exec DBMS_STATS.gather_table_stats (ownname => 'ME', tabname =>'table1');

hoặc là

exec DBMS_STATS.gather_table_stats (ownname => 'ME', tabname =>'table1',estimate_percent =>100);

Và tôi đã thử các giá trị khác nhau của Dynamic_s Kẹp (1-10), nhưng không có gì thay đổi đáng kể:

select /*+ dynamic_sampling(t1 10) */ count(*) 
from table1 t1 
where col1 = 123 
and col2 = '1';

dyanmic_sampling sẽ thay đổi, nhưng nó vẫn tắt gần gấp 50 đến 100 lần.

Làm thế nào tôi có thể có được ước tính tốt hơn?

Câu trả lời:


9

Điều đầu tiên tôi làm là kiểm tra các số liệu thống kê cho từng cột với các truy vấn sau:

  • select count(*) from table1 where col1 = 123;
  • select count(*) from table1 where col2 = '1';

Nếu các số lượng ước tính ở đây đồng ý tốt hơn nhiều với số lượng hàng thực tế, điều đó có nghĩa là có một số mối tương quan giữa các cột mà CBO không thể đoán dựa trên biểu đồ được tạo bởi một vanilla gather_table_stats. Lấy mẫu động sẽ cải thiện mọi thứ với chi phí tăng thời gian phân tích cú pháp, nhưng không phải là viên đạn bạc.

Ngoài ra, với 11g, " Cơ sở dữ liệu Oracle cũng có thể thu thập số liệu thống kê về một nhóm cột trong bảng "

  1. tạo một nhóm cột
  2. thu thập số liệu thống kê về một nhóm cột
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.