使用 NOT IN 优化查询(选择...)

Posted

技术标签:

【中文标题】使用 NOT IN 优化查询(选择...)【英文标题】:optimize queries with a NOT IN (select...) 【发布时间】:2014-05-05 05:30:39 【问题描述】:
-- tf_wfget_appvr_records
create function [dbo].[tf_wfget_appvr_records] ( @cls_id int, @start_date datetime, @end_date datetime,  @approver_id int, @co_id varchar( 5))
returns @wfapp_approver_status
table
( app_recgid bigint,
  app_status varchar(1),
  app_status_desc varchar( 80)
)
as
begin
 insert into @wfapp_approver_status
 ( app_recgid, app_status, app_status_desc)
 select a.recgid, a.status, p.action
 from cm_wfapp a
  inner join cm_process p on a.proc_id = p.recgid
 where a.co_id = @co_id and a.cls_id = @cls_id  
  and a.apply_date between @start_date and @end_date
  and a.approver_id = @approver_id

 -- insert others from cm_wftrn
 insert into @wfapp_approver_status
 ( app_recgid, app_status, app_status_desc)
 select distinct a.recgid, a.status, p.action
 from cm_wftrn c
  inner join cm_process p on c.proc_id = p.recgid and p.action is not null
  inner join cm_wfapp a on a.recgid = c.wfapp_id 
 where a.co_id = @co_id and a.cls_id = @cls_id  
  and a.apply_date between @start_date and @end_date
  and c.wfapp_id not in ( select app_recgid from @wfapp_approver_status ) 
  and c.appr_id = @approver_id 
return
end
GO

它包含 NOT IN 约束,这需要花费大量时间从数据库中提取结果。 数据库显然很大。

如何优化此查询? 有没有办法使用 NOT IN (select...) 优化查询?

请帮忙谢谢。

【问题讨论】:

1. 第二个插入语句将从不返回任何东西。您已在第一次插入中插入的所有 app_regcid。 2 为什么要使用函数? 【参考方案1】:

将您的NOT IN 替换为NOT EXISTS 这样的运算符......

 insert into @wfapp_approver_status
 ( app_recgid, app_status, app_status_desc)
 select distinct a.recgid, a.status, p.action
 from cm_wftrn c
  inner join cm_process p on c.proc_id = p.recgid and p.action is not null
  inner join cm_wfapp a on a.recgid = c.wfapp_id 
 where a.co_id = @co_id and a.cls_id = @cls_id  
  and a.apply_date between @start_date and @end_date 
  and c.appr_id = @approver_id 
  and not exists ( select 1 
                   from @wfapp_approver_status 
                   WHERE c.wfapp_id = app_recgid) 

【讨论】:

感谢它加快了一切。非常感谢:)

以上是关于使用 NOT IN 优化查询(选择...)的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)