使用条件而不是简单或条件的巨大低效率

时间:2015-04-21 18:12:34

标签: sql oracle

我的查询结构如下:

select
  distinct items,
  invoice
from
  table_name
where
  location = 'warehouse'
  and invoice in 
   (select 
      t.invoice
    from
      list_name t
    where
      t.invoice_date > to_date (('2015-04-18'),'yyyy-mm-dd')
   )

子查询应该给我一张发票清单,然后我将其返回主查询以查找发票中的所有项目。发票数量不是静态的,这就是我想嵌套子查询的原因。

此查询的问题是可能需要数小时才能处理,而不是:

select
  distinct items,
  invoice
from
  table_name
where
  location = 'warehouse'
  and t.invoice = 'invoice1'
  or  t.invoice = 'invoice2'

大约需要0.3秒。我尝试将我的条件限制为两个值:

select
  distinct items,
  invoice
from
  table_name
where
  location = 'warehouse'
  and invoice in ('invoice1','invoice2')

此查询仍需要大约4分钟才能运行。任何想法为什么这么长时间?我之前使用的是in条件,它从来没有这么慢,但我无法弄清楚为什么这个特定的实现不起作用。

编辑*这是解释计划。在修复@hines指出的问题之后,第二和第三个代码块的内容相同。

Description                               object                  cost

select statement, goal=all_rows                                   422542
  hash unique                                                     422542
    view                                 index$_join$_001         422541
      hash join
        index range scan                 PKHIR_IX19               31382
        index fast full scan             PKHIR_IX16               351172

2 个答案:

答案 0 :(得分:1)

您使用的标准在第二个和第三个代码块之间是不同的。如果您正在尝试复制IN编码,那么您可能希望围绕'或'语句进行括号。目前,'或'语句将返回t.invoice ='invoice2'的任何行,即使该位置不等于'仓库'。

select
  distinct items,
  invoice
from
  table_name
where
  location = 'warehouse'
  and (invoice = 'invoice1'
       or invoice = 'invoice2')

答案 1 :(得分:0)

有一天我有类似的情况,并重建查询到这样的东西创造了奇迹:

select distinct items, invoice
  from table_name a
  where location = 'warehouse'
     and exists (
       select 1
         from list_name t
         where t.invoice_date > to_date (('2015-04-18'),'yyyy-mm-dd') 
           and t.invoice = a.invoice )