博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL IN查询优化
阅读量:5297 次
发布时间:2019-06-14

本文共 1443 字,大约阅读时间需要 4 分钟。

实际项目中有如下SQL, 发现效率很低,用时超过1分钟

       select TaskID, StartDate = min(UpdateTime), EndDate = max(UpdateTime)            from BFDB_Code.dbo.packcodeinfo p            inner join Task t on p.TaskID = t.ID            where datediff(day, t.EndDate, getdate()) < @day                      and t.Status in(4,5)             group by TaskID

通过查询计划可知上面语句进行了全表扫描,所以效率很低

 

单个查询时并不慢,因为在TaskID上已经建立索引

select TaskID, StartDate = min(UpdateTime), EndDate = max(UpdateTime)from BFDB_Code.dbo.packcodeinfo pwhere p.TaskID  in (2488,2499)group by TaskID

但如果是这样查询,仍然会全表扫描

select TaskID, StartDate = min(UpdateTime), EndDate = max(UpdateTime)from BFDB_Code.dbo.packcodeinfo pwhere p.TaskID  in (    SELECT id FROM task t where t.Status in(2,3))group by TaskID

 

优化方案

去除inner join,写一个函数返回类似(2488,2499)值,然后动态构造SQL语句执行。

函数定义get_begin_task

create function [dbo].[get_begin_task]()returns varchar(1000) as begin  DECLARE @csv VARCHAR(1000)SELECT @csv = COALESCE(@csv + ',', '') + Convert(varchar(10), ID)FROM task twhere t.Status in(2,3)    and createdate  >= '2016-05-01';Return @csvend;

修改存储过程如:

declare @sql varchar(8000);set @sql= '    select TaskID, StartDate = min(UpdateTime), EndDate = max(UpdateTime)            from BFDB_Code.dbo.packcodeinfo p            where p.TaskID  in (' + dbo.get_begin_task() +')            group by TaskID'exec(@sql);

小插曲:

因为用到了跨数据库查询,动态执行SQL语句需要执行 EXEC sp_addlinkedserver  ‘BFDB_Code’命令。

 

转载于:https://www.cnblogs.com/season2009/p/6423462.html

你可能感兴趣的文章
安卓当中的线程和每秒刷一次
查看>>
随机颜色值
查看>>
每日一库:Modernizr.js,es5-shim.js,es5-safe.js
查看>>
目录相关的操作
查看>>
C++----练习--引用头文件
查看>>
ajax连接服务器框架
查看>>
wpf样式绑定 行为绑定 事件关联 路由事件实例
查看>>
利用maven管理项目之POM文件配置
查看>>
FUSE-用户空间文件系统
查看>>
 VS2012 C#调用C++ dll
查看>>
TCL:表格(xls)中写入数据
查看>>
Oracle事务
查看>>
String类中的equals方法总结(转载)
查看>>
bash使用规则
查看>>
AVL数
查看>>
C语言程序设计II—第九周教学
查看>>
全栈12期的崛起之捡点儿有用的说说
查看>>
基础类型
查看>>
属性动画
查看>>
标识符
查看>>