SQL查询优化:花费大量时间

SQL查询优化:花费大量时间,sql,oracle,sqlperformance,Sql,Oracle,Sqlperformance,我使用以下查询检索一组订单: select count(distinct po.orderid) from PostOrders po, ProcessedOrders pro where pro.state IN ('PENDING','COMPLETED') and po.comp_code in (3,4) and pro.orderid = po.orderid 查询返回的结果是4323,速度足够快 但我必须设置另一个条件,使其仅在另一个表Discarder

我使用以下查询检索一组订单:

select count(distinct po.orderid) 
from PostOrders po, 
     ProcessedOrders pro 
where pro.state IN ('PENDING','COMPLETED') 
  and po.comp_code in (3,4) 
  and pro.orderid = po.orderid
查询返回的结果是4323,速度足够快

但我必须设置另一个条件,使其仅在另一个表DiscarderOrders中不存在时返回,为此我向查询中添加了一个额外的条件:

select count(distinct po.orderid) 
from PostOrders po, 
     ProcessedOrders pro 
where pro.state IN ('PENDING','COMPLETED') 
  and po.comp_code in (3,4) 
  and pro.orderid = po.orderid 
  and po.orderid not in (select do.order_id from DiscardedOrders do)

上面的查询花费了很多时间,只是一直在运行。我能对查询做些什么,使它执行得更快吗?或者我是否需要先执行第一个查询,然后根据条件通过触发另一个查询进行筛选?

您可以尝试替换:

and po.orderid not in (select do.order_id from DiscardedOrders do)


您可以尝试替换:

and po.orderid not in (select do.order_id from DiscardedOrders do)

尝试使用JOIN而不是notin

还是不存在

尝试使用JOIN而不是notin

还是不存在

与distinct相同:

SELECT count(po.orderid) 
  FROM PostOrders po 
 WHERE po.comp_code IN (3,4) 
   AND EXISTS 
   (
   SELECT 1 FROM ProcessedOrders pro 
    WHERE pro.orderid = po.orderid
      AND pro.state IN ('PENDING','COMPLETED') 
   )
  ....
 /
与distinct相同:

SELECT count(po.orderid) 
  FROM PostOrders po 
 WHERE po.comp_code IN (3,4) 
   AND EXISTS 
   (
   SELECT 1 FROM ProcessedOrders pro 
    WHERE pro.orderid = po.orderid
      AND pro.state IN ('PENDING','COMPLETED') 
   )
  ....
 /

请提供查询和表结构的执行计划,在哪些列上有索引?请提供查询和表结构的执行计划,您在哪些列上有索引?您可能希望添加连接不一定等同于不在状态,例如,如果DiscardedOrders可以多次包含相同的orderid,则可能不是这里的情况,尽管您可能希望添加连接不一定等同于不在状态,例如,如果DiscardedOrders可以包含同一个orderid不止一次,但这里的情况可能不是这样
SELECT count(po.orderid) 
  FROM PostOrders po 
 WHERE po.comp_code IN (3,4) 
   AND EXISTS 
   (
   SELECT 1 FROM ProcessedOrders pro 
    WHERE pro.orderid = po.orderid
      AND pro.state IN ('PENDING','COMPLETED') 
   )
  ....
 /