sqlserver not in 语句使程充崩溃

两张表 组织架构表(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 我想是很多人没想到的.

(0)

相关推荐

  • Android 如何收集已发布程序的崩溃信息

    我们写程序的时候都希望能写出一个没有任何Bug的程序,期望在任何情况下都不会发生程序崩溃.不过理想是丰满的,现实是骨感的.没有一个程序员能保证自己写的程序绝对不会出现异常崩溃.特别是针对用户数达到几十万几百万的程序,当你用户数达到一定数量级后,就算你的程序出现个别异常崩溃情况也不用惊讶. 既然我们写的程序都有可能发生异常崩溃,如果是还没发布的程序,我们可以通过测试抓取Log来分析.不过针对已经发布的程序,我们没法重现现象,所以让用户反馈程序异常信息就很重要.下面我们说说如何收集程序运行过程的异常

  • js中关于一个分号的崩溃示例

    复制代码 代码如下: if ($("span", $("#txtStere").siblings("div")).text() === "*"); { if (!IsNum("#txtStere")) { $("#txtStere").next().text("您选择的运费模板是按体积计价,物流体积不能为空且需是数字"); return false; } else {

  • Android实现将应用崩溃信息发送给开发者并重启应用的方法

    本文实例讲述了Android实现将应用崩溃信息发送给开发者并重启应用的方法.分享给大家供大家参考,具体如下: 在开发过程中,虽然经过测试,但在发布后,在广大用户各种各样的运行环境和操作下,可能会发生一些异想不到的错误导致程序崩溃.将这些错误信息收集起来并反馈给开发者,对于开发者改进优化程序是相当重要的.好了,下面就来实现这种功能吧. (更正时间:2012年2月9日18时42分07秒) 由于为历史帖原因,以下做法比较浪费,但抓取异常的效果是一样的. 1.对于UI线程(即Android中的主线程)抛

  • jquery.uploadify插件在chrome浏览器频繁崩溃解决方法

    jquery.uploadify插件在chrome浏览器频繁崩溃问题,一直困扰了好久,网上很多人说是由于chrome缓存的原因,插件初始化时,需要引用js,而chrome的缓存导致没有没有请求到jquery.uploadify-3.1_min.js,所以引起崩溃,可以在引用js时,加入随机数:<script type="text/javascript" src="/js/jquery.uploadify-3.1_min.js?ver=<?php echo rand

  • 数据库崩溃,利用备份和日志进行灾难恢复

    在实际的工作中,我们可能经常会遇到数据库宕机,数据丢失的情况,下面,我将演示一个模拟环境 1.数据库正常启动插入数据: [root@client103 ~]# mysql -uroot -pkongzhong mysql> use test; mysql> insert into a select * from a; #注: 这里不演示建表,默认大家都懂 # 下面进行一次全备 [root@client103 ~]# innobackupex --user=root --password=kon

  • linux下监视进程 崩溃挂掉后自动重启的shell脚本

    ================================================= 本文为khler原作,转载必须确保本文完整并完整保留原作者信息及本文原始链接 Author: HeYuanHui E-mail: khler@163.com QQ: 23381103 MSN: pragmac@hotmail.com ================================================= 如何保证服务一直运行?如何保证即使服务挂掉了也能自动重启?在写服务

  • 解决iOS7上UITextField限制字数输入导致崩溃问题的方法

    在一些场景中,需要限制用户的输入字数,例如在textField里进行控制(textView也类似,崩溃原因也相同),如图所示 系统会监听文本输入,需要注意的第一点是输入法处于联想输入还未确定提交的时候,对于第三方输入法例如搜狗,联想状态下的输入,是监听不到,除非点击确定输入到textField,才会触发changed事件. 但对于系统键盘,联想状态下的输入也会监听,这里如果不处理就容易发生崩溃,例如当快要达到字数限制时,继续输入,此时textField.text =联想输入文字+textFiel

  • 详解Android中处理崩溃异常

    大家都知道,现在安装Android系统的手机版本和设备千差万别,在模拟器上运行良好的程序安装到某款手机上说不定就出现崩溃的现象,开发者个人不可能购买所有设备逐个调试,所以在程序发布出去之后,如果出现了崩溃现象,开发者应该及时获取在该设备上导致崩溃的信息,这对于下一个版本的bug修复帮助极大,所以今天就来介绍一下如何在程序崩溃的情况下收集相关的设备参数信息和具体的异常信息,并发送这些信息到服务器供开发者分析和调试程序. 我们先建立一个crash项目,项目结构如图: 在MainActivity.ja

  • iOS 捕获程序崩溃日志

    iOS开发中遇到程序崩溃是很正常的事情,如何在程序崩溃时捕获到异常信息并通知开发者? 下面就介绍如何在iOS中实现: 1. 在程序启动时加上一个异常捕获监听,用来处理程序崩溃时的回调动作 复制代码 代码如下: NSSetUncaughtExceptionHandler (&UncaughtExceptionHandler); 官方文档介绍:Sets the top-level error-handling function where you can perform last-minute lo

  • php对外发包引发服务器崩溃的终极解决方法分享[推荐]

    一.php对外发包分析 用php代码调用sockets,直接用服务器的网络攻击别的IP,常见代码如下: 复制代码 代码如下: $packets = 0; $ip = $_GET[\'ip\']; $rand = $_GET[\'port\']; set_time_limit(0); ignore_user_abort(FALSE); $exec_time = $_GET[\'time\']; $time = time(); print \"Flooded: $ip on port $rand \

随机推荐