gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 21:43:23 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com