我的查询结构如下:
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
答案 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 )