我有一个包含 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/