sql - 使用 OR 时忽略 Oracle SQL 索引

标签 sql oracle indexing multiple-columns

我有一个包含 2 列和大约 800 万行的表格。 equip_no 和 op_id。这些列在单个索引中单独索引或一起索引。两者的值几乎都是唯一的。

我发现在执行一个在 2 列上使用 AND 的查询时,索引使用良好并且性能非常好,800 万行的响应时间为亚秒级。

select *
from asset_table
where equip_no like 'something%'
AND op_id like 'somethingElse%'

但是,如果我采用完全相同的查询并将 AND 更改为 OR,我突然在我的计划中以 TABLE ACCESS FULL 结束并且查询需要 20 或 30 秒。

select *
from asset_table
where equip_no like 'something%'
OR op_id like 'somethingElse%'    

我的 Oracle 版本如下,以防有帮助。

Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bi

所以我对索引并不完全陌生,但我从来没有真正专门研究过它们。我想知道这是已知行为还是我没有做我应该做的事情。我使用以下命令创建了索引...

create index IDX_asset_TABLE_EQ_OPID
on asset_table(equip_no, op_id)

create index IDX_asset_TABLE_EQ
on asset_table(equip_no)

create index IDX_asset_TABLE_OPID
on asset_table(op_id)

感谢任何帮助。我已经用谷歌搜索了很长一段时间,但到目前为止还没有成功。

谢谢

最佳答案

检查您的表、列和索引统计信息以及解释计划中的信息。没有这些信息,很难给出一个好的答案。但我可以解释基础知识。

“and”使您的查询更具选择性(返回的行数更少),这正是索引的用武之地。

“或”使您的查询选择性降低(返回更多行),这使得全表扫描看起来更便宜。

例子:

 born in june and female  (1/12 * 1/2) = 1/24 of the rows 
 born in june or  female  (1/12 + 1/2) = 7/12 of the rows

关于sql - 使用 OR 时忽略 Oracle SQL 索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35333814/

相关文章:

mysql - 优化mysql索引

sql - SQL中的索引是什么?

php - MYSQL 将行提取到页面中

ALTER TABLE 中的 MySQL 语法错误

c# - 如何使用Oracle和.Net客户端实现密码更改功能?

java - java中的ExecuteBatch方法返回值-2的数组

MySQL:在多边形内获取记录

mysql - 如果在 HAVING 比较中使用某个列,MySQL 是否使用该列中的第一个值?

c# - ODP.Net Managed API - 字符串数组绑定(bind) > 1000 个字符

sql - MySQL 检索索引列中具有最大值的行的速度很慢