Oracle
Oracle 在 where 子句中使用 > 時不使用索引
我們有一個相對經典的場景,其中應用程序生成的查詢的日期子句對給定日期使用“大於”。
因為日期範圍沒有結束子句,oracle 沒有選擇使用日期索引,而是最終進行了非常昂貴的表掃描。但是我們知道這些數據是暫時的,所以我們知道未來沒有數據。因此,如果我們修改 sql 以包含該時間段的 sysdate 結束日期,那麼查詢將使用索引並且它變得非常便宜。
不幸的是,由於我們使用的應用程序存在錯誤,我們無法更改應用程序。那麼在 Oracle 中有什麼方法可以“教”oracle 該表中的最大數據是今天,所以它可以做出明智的決定,或者是在數據庫級別解決這個問題的唯一真正方法來固定計劃?
Rgds, Dan
(Oracle 10 Solaris Sparc)
如果您使它們保持最新,Oracle 應該能夠使用統計資訊來確定任何列的高值和低值:
drop table foo; create table foo(id date primary key); insert into foo select sysdate-level from dual connect by level<31; select low_value, high_value from dba_tab_columns where table_name='FOO'; /* LOW_VALUE HIGH_VALUE -------------------------------------------- ------------------------------------------ */ execute dbms_stats.gather_table_stats('JDOUGLAS', 'FOO'); select low_value, high_value from dba_tab_columns where table_name='FOO'; /* LOW_VALUE HIGH_VALUE -------------------------------------------- ------------------------------------------ 786F0C0A0E0837 787001080E0837 */