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?