如何在查询中使用Oracle索引字段

时间:2017-02-21 22:56:44

标签: oracle plsqldeveloper

我有一个带有索引date_time字段的大型Oracle表:“DISCONNECT_DATE”

当我使用以下where子句时,我的查询会快速运行:

DISCONNECT_DATE > TO_DATE('01-DEC-2016', 'DD-MON-YYYY') AND 
DISCONNECT_DATE < TO_DATE('01-JAN-2017', 'DD-MON-YYYY')

当我使用以下where子句时,我的查询运行(非常)缓慢:

extract(month from disconnect_date) = '12' and 
extract(year from disconnect_date) = '2016' 

他们的意图或多或少都相同。为什么前者工作而后者不工作? (我认为我在SQL SERVER中没有这个问题)

(我正在使用PL SQL Developer编写查询)

1 个答案:

答案 0 :(得分:4)

问题在于使用索引。在第一个中,所有函数都在“常量”侧,而不是在“列”侧。因此,Oracle可以很容易地看到可以应用索引。

但是,编制索引的逻辑不理解extract(),因此索引不会被使用。如果要使用该构造,可以在函数调用上创建索引:

create index idx_t_ddyear_ddmonth on t(extract(month from disconnect_date), extract(year from disconnect_date));

注意:extract()返回的数字不是字符串,因此您应该删除单引号。混合数据类型也会使优化器混淆。