我们遇到了Oracle查询(Query1)的问题,执行时间太长:
查询1:
Select *
from table
where status NOT IN ('IN_PROGRESS', 'SUCCESS', 'FAILURE');
- >表格大小为200,000的2分钟带来4000的记录。
查询2:
Select *
from table
where status ='WAITING';
- >对于相同的音量,在2秒内返回。
如果有人可以解释为什么会发生这种情况,那将会很棒。
答案 0 :(得分:3)
您可能在状态列上有索引。 (请核实)。
如果你想到电话簿中的索引,有人说'找到等待先生的电话号码'然后你沿着第一个字母放大,直到找到W并找到他,然后你知道你已经完成了。如果有人说'找到姓氏不是等待的所有人的电话号码,那么从逻辑上完成此操作的唯一方法是通过整个索引,直到您检查每个条目以验证它不是' Mr Waiting' (当你到达W但你仍然需要做更多的工作时,你可能会足够聪明地停下来)
换句话说,=
更容易被攻击'比NOT IN
。你可能想研究一下sargable。您可能还想按照建议查看查询计划。一开始你可能无法理解,但练习会变得完美。