Oracle

Oracle 在 where 子句中使用 > 時不使用索引

  • January 9, 2012

我們有一個相對經典的場景,其中應用程序生成的查詢的日期子句對給定日期使用“大於”。

因為日期範圍沒有結束子句,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
*/

引用自:https://dba.stackexchange.com/questions/10388