0

我们需要不断地查询一个 800 万行的表,所以我们决定为这个作业创建一个索引。

在查询中,我们在 where 条件中使用 3 列,就像

SELECT something 
FROM my_table 
WHERE TRUNC(DATE) = TRUNC(SYSDATE) 
  AND IS_GREETED = 1 
 AND EMP_ID = 'JOHN.SMITH'

因此,我们仅使用 EMP_ID 创建索引 1,并使用所有这 3 个字段(DATE、IS_GREETED、EMP_ID)创建索引 2。

通过 SQL Developer 的自动跟踪功能,我们发现 Oracle 实际上使用的是索引 1,而不是索引 2,这与我们的想法相反。

这是什么原因?还有其他方法可以提高性能吗?谢谢。

4

2 回答 2

5

Oracle 通常不会对<column>引用 的 WHERE 子句使用索引function(<column>)

您可以尝试在(TRUNC(DATE), IS_GREETED, EMP_ID)

于 2013-06-04T15:42:33.743 回答
1

Oracle 不会考虑索引选择的字段(通常,无论如何,不​​确定是否有例外),因为在这种情况下DATE,您有一个围绕它的函数。TRUNC这更有可能选择您已经拥有的索引进行范围扫描:

SELECT something 
FROM my_table 
WHERE DATE >= TRUNC(SYSDATE) and DATE < (TRUNC(SYSDATE) + INTERVAL '1' DAY)
AND IS_GREETED = 1 
AND EMP_ID = 'JOHN.SMITH'

... 或使用 Tony 展示的基于函数的索引(不确定我在回答之前是如何没有看到的)。

根据字段的选择性,您可能会发现索引在以不同顺序排列的列(例如EMP_ID, IS_GREETED, DATE. 您需要查看计划并进行实验,看看什么能给您最好的结果。

顺便说一句,我希望你的字段没有真正被调用DATE,因为这是一个保留字......

于 2013-06-04T16:55:36.020 回答