oracle - oracle select查询-多列索引

标签 oracle indexing

我正在处理一个sql查询,并尝试对其进行优化,因为执行时间太长。

我有几个选择和UNION之间。
每个选择都在同一张表上,但WHERE子句中的条件不同。
基本上我总是喜欢:

select * from A
where field1 <=TO_DATE ('01/01/2010', 'DD/MM/YYYY')
AND field1 >= TO_DATE(some date)
and field2 IN (...)

UNION 
select * from A
where field1 <=TO_DATE ('01/01/2010', 'DD/MM/YYYY')
AND field1 >= TO_DATE(some date2)
and field2 =(...)

UNION
....


我在field1上有一个索引(它是一个日期字段,而field2是一个数字)。
现在,当我执行选择并仅放置

WHERE field1 <TO_DATE ('01/01/2010', 'DD/MM/YYYY')


它不使用索引。
我正在用Toad看清楚的解释,它说:

SELECT STAITEMENT Optimiser Mode = CHOOSE
TABLE ACCESS FULL 


它是一个巨大的表,并且该列的索引在那里。

关于这个优化器有什么想法吗?为什么不使用索引?

另一个问题是,如果我在field1和field2上有where子句,我只需要创建一个索引,或者为每个字段创建一个索引?

最佳答案

如果没有Union,而是在不同的子句之间使用OR会更好吗?

select * from A
where (
  field1 <"toto"
  and field2 IN (...)
)
OR
(
  field1 >"toto2"
  and field2 IN (...)
)
OR
....


也可以在2列上建立索引。

CREATE INDEX index_name
ON A (field1, field2);

关于oracle - oracle select查询-多列索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2713438/

相关文章:

mysql - 做 "small_table LEFT JOIN large_table"是不好的做法吗?

SQL 组合两个 SQL 语句的输出以返回一个 bool 值

php - 更正 Oracle 上的 Doctrine 日期时间

从 11G 导入备份时出现 Oracle EDITIONABLE 属性错误

python - 在没有索引的 for 循环中引用列表条目,可能吗?

MySQL使用索引条件

oracle - 是否可以使用 liquibase 更新数据库中的现有行?

java - Hibernate Date Criteria 失败,但 HQL 有效

matlab - 如何使用混合索引格式访问 MATLAB 中的多维数组

python - 创建 3D 二值图像