sqlserver not in 语句使程充崩溃

 更新时间:2011年12月17日 01:52:04   作者:  
以前一直以为优化在百万级的表中才会有意义,这次的事件改变了我的看法
两张表 组织架构表(Organise) 和 工资发放历史记录表 (WagePerMonthHis)
两张表通过 Organise.Item_id 和 WagePerMonthHis.OrgIdS 进行关联
Organise表(以下简称O表)中大约有6000条记录11个字段 ,WagePerMonthHis(以下简称W表)计有 125万条记录 和 25个字段

原程序中一段如下的语句
是查询所有不在W表的组织架构层级为2的记录
复制代码 代码如下:

select OrgId as 公司编码,OrgName as 公司名称
from Organise
where OrgLev=2
and item_id not in
(select OrgidS from WagesPerMonthHis
where WagesYear='2010' and WagesMonth=
'01' Group by OrgidS,OrgNameS)
order by Orgid

语句执行要33秒之久,服务器的配置是比较高的:16核心4CPU,24G内存,且内存和CPU在执行时都没有出现瓶颈,开始以为是 (select OrgidS from WagesPerMonthHis
where WagesYear='2010' and WagesMonth=
'01' Group by OrgidS,OrgNameS) 这条语句执行缓慢所致,单独执行这条却发现执行速度很快,大约不到2秒就出来了,于是症结出来了,是not in 这个全扫描关键词带来的性能下降.最直接的是导致页面失去响应,一个关键功能使用不了.

试了not exist语句,发现效果是一样的,并不象网上所说可以提高很多性能.

于是重新优化语句如下
复制代码 代码如下:

select a.OrgId as 公司编码,a.OrgName as 公司名称,a.item_id
from Organise a
left outer join (select distinct b.OrgIdS from WagesPerMonthHis b
where WagesYear='2010' and WagesMonth='01') as b
on a.item_id = b.OrgidS
where a.OrgLev = 2
and b.OrgIdS is Null
order by 公司编码

改用左外连接(其实左连接也可以)后,整个语句执行速度为400ms, 33秒与400ms 我想是很多人没想到的.

相关文章

  • sqlserver 数据库压缩与数据库日志(ldf)压缩方法分享

    sqlserver 数据库压缩与数据库日志(ldf)压缩方法分享

    数据库在使用中,冗余的数据不断的增加(数据删除也不会减小),导致数据库不断的增大!所以该给你的数据库减减肥了
    2011-12-12
  • 如何创建支持FILESTREAM的数据库示例探讨

    如何创建支持FILESTREAM的数据库示例探讨

    FILESTREAM使用一种特殊类型的文件组,因此在创建数据库时,必须至少为一个文件组指定 CONTAINS FILESTREAM 子句接下来为你详细介绍下如何创建支持 FILESTREAM 的数据库
    2013-03-03
  • SQL Server数据库生成与执行SQL脚本详细教程

    SQL Server数据库生成与执行SQL脚本详细教程

    为了方便可以把需要连续执行的SQL语句写到一个文本文件中,并且用.SQL作为扩展名,这种文件叫做SQL脚本文件,下面这篇文章主要给大家介绍了关于SQL Server数据库生成与执行SQL脚本的相关资料,需要的朋友可以参考下
    2023-01-01
  • sqlserver2017共享功能目录路径不可改的解决方法

    sqlserver2017共享功能目录路径不可改的解决方法

    这篇文章主要介绍了sqlserver2017共享功能目录路径不可改的解决方法,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • 数据库性能优化三:程序操作优化提升性能

    数据库性能优化三:程序操作优化提升性能

    程序访问优化也可以认为是访问SQL语句的优化,一个好的SQL语句是可以减少非常多的程序性能的,下面列出常用错误习惯,并且提出相应的解决方案
    2013-01-01
  • SQL server中字符串逗号分隔函数分享

    SQL server中字符串逗号分隔函数分享

    继SQl -Function创建函数数据库输出的结果用逗号隔开,在开发中也有许多以参数的形式传入带逗号字条串参数,需要的朋友可以参考下
    2016-10-10
  • 积分获取和消费的存储过程学习示例

    积分获取和消费的存储过程学习示例

    这篇文章主要介绍了积分获取和消费的存储过程学习示例,这个只是学习一下存储过程的使用方法,需要的朋友可以参考下
    2014-03-03
  • sql 聚集索引和非聚集索引(详细整理)

    sql 聚集索引和非聚集索引(详细整理)

    这篇文章主要介绍了聚集索引和非聚集索引的相关知识,比较详细整理了一些知识点,需要的朋友可以参考下
    2014-07-07
  • sql语句中临时表使用实例详解

    sql语句中临时表使用实例详解

    当需要的结果需要经过多次处理后才能最终得到我们需要的结果时,就可以使用临时表,这里临时表就起到了一个中间处理的作用,实现了分步处理,简化了问题,这篇文章主要介绍了sql语句中临时表使用方法,需要的朋友可以参考下
    2023-02-02
  • SQL 将一列拆分成多列的三种方法

    SQL 将一列拆分成多列的三种方法

    这篇文章主要介绍了SQL 将一列拆分成多列的方法,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07

最新评论