实际项目中有如下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 p
where p.TaskID in (2488,2499)
group by TaskID

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

select TaskID, StartDate = min(UpdateTime), EndDate = max(UpdateTime)
from BFDB_Code.dbo.packcodeinfo p
where 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 t
where t.Status in(2,3)
and createdate >= '2016-05-01'; Return @csv end;

修改存储过程如:

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’命令。

SQL IN查询优化的更多相关文章

  1. SQL高性能查询优化语句(总结)

    SQL 高性能查询优化语句,一些经验总结 1.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where ...

  2. SQL Server 查询优化 索引的结构与分类

    一.索引的结构 关系型数据库中以二维表来表达关系模型,表中的数据以页的形式存储在磁盘上,在SQL SERVER中,数据页是磁盘上8k的连续空间,那么,一个表的所有数据页在磁盘上是如何组织的呢?分两种情 ...

  3. SQL高性能查询优化语句

    1.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null可以在num上设置 ...

  4. SQL Server查询优化方法(查询速度慢的原因很多,常见如下几种) .

    今天看到一位博友的文章,觉得不错,转载一下,希望对大家有帮助,更多文章,请访问:http://blog.haoitsoft.com 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺 ...

  5. 提高mysql千万级数据SQL的查询优化30条总结

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  6. SQL Server查询优化器的工作原理

    SQL Server的查询优化器是一个基于成本的优化器.它为一个给定的查询分析出很多的候选的查询计划,并且估算每个候选计划的成本,从而选择一个成本最低的计划进行执行.实际上,因为查询优化器不可能对每一 ...

  7. SQL Server查询优化中的两个选项

    本文中,我们将介绍两个SQL Server中的可用概念,它们是使用SQL Server时值得注意的技术. 1.        OPTIMIZE FOR Unknown SQL Server 2005版 ...

  8. MS SQL Server查询优化方法 查询速度慢的原因很多,常见如下几种

    1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 5.网络速度慢 6.查询出的数据量过大 ...

  9. SQL Server 查询优化器运行方式

    一.结合实际,谈索引使用的误区 理论的目的是应用.虽然我们刚才列出了何时应使用聚集索引或非聚集索引,但在实践中以上规则却很容易被忽视或不能根据实际情况进行综合分析.下面我们将根据在实践中遇到的实际问题 ...

  10. 深入浅出的 SQL Server 查询优化

    目前网络数据库的应用已经成为最为广泛的应用之一了,并且关于数据库的安全性,性能都是企业最为关心的事情.数据库渐渐成为企业的命脉,优化查询就解决了每个关于数据库应用的性能问题,在这里microsoft ...

随机推荐

  1. 设备重力感应 window.DeviceOrientationEvent

    设备屏幕方向与运动 https://developers.google.cn/web/fundamentals/native-hardware/device-orientation/ MDN devi ...

  2. Mysql 全文搜索 Match Against用法

    全文检索在 MySQL 中就是一个 FULLTEXT 类型索引.FULLTEXT 索引用于 MyISAM 表,可以在 CREATE TABLE 时或之后使用 ALTER TABLE 或 CREATE ...

  3. 180623、Git新建远程分支和删除

    Git新建远程分支和删除 现在我在master分支上,工作目标是干净的,也没有需要commit的: $ git branch * master release $ git status On bran ...

  4. ThinkPHP框架 AJAX方法返回 AJAX实现分页例子:

    在模块控制器Controller文件夹里创建一个 FenyeController.class.php控制器 <?php namespace Admin\Controller; use Think ...

  5. 百万级数据下的mysql深度解析

    首先,数据量大的时候,应尽量避免全表扫描,应考虑在 where 及 order by 涉及的列上建立索引,建索引可以大大加快数据的检索速度.但是,有些情况索引是不会起效的: 1.应尽量避免在 wher ...

  6. Django----djagorestframwork使用

    restful(表者征状态转移,面向资源编程)------------------------------------------->约定 从资源的角度审视整个网络,将分布在网络中某个节点的资源 ...

  7. [No0000181]改善C#程序的建议9:使用Task代替ThreadPool和Thread

    一:Task的优势 ThreadPool相比Thread来说具备了很多优势,但是ThreadPool却又存在一些使用上的不方便.比如: 1: ThreadPool不支持线程的取消.完成.失败通知等交互 ...

  8. linux中使用ps -ef

    常操作linux系统的都会用到:ps -ef 命令,是一个非常强大的进程查看命令. 在训练模型中使用python,那么我会要看这个python相关的进程,可以使用如下命令”: ps -ef | fgr ...

  9. 数学用语中的 透明 transitive property

    1.透明 https://en.wikipedia.org/wiki/Equivalence_relation In mathematics, an equivalence relation is a ...

  10. Server:www121 Server:www120 Server:NWS_SP

    Request URL:http://www.biyao.com/minisite/bzzx Request Method:GET Status Code:200 OK Remote Address: ...