MS Sql 优化步骤及优化not in一例
今天接到客户投诉说系统卡死了,经过一翻努力,终于解决了。现将解决步骤记录一下,以便下次参考:
因为客户系统集中在阿里云上面,使用的是ms sql2008数据库,上面有N个客户,一下子无法知道是哪个客户。
第一步,先打开任务管理器,看看cpu使用情况,

一看就知道是 ms sql server有大查询占用了所有的CPU时间,所以卡死系统 。
第二步,打开ms sql server 的活动监控器,查看是哪条语句卡死。
打开活动监控器的方法。在

中的对象资源管理器,找到服务器,右击。可以看到“活动监控器”,或者用快捷键ctrl+alt+A .。

第三步,找到有问题 的语句。点开进程, 通过任务状态,筛选 running的进程 。

逐个查看运行中的语句,分析最有可能卡住 系统的语句,去运行一下。就可以查到是哪条语句卡住 了。
我的情况就是下面这句:
SELECT A.cCrm, A.cCode AS cOrderCode, A.dRequire, A.dSubmit, B.*,
C.cCode AS cProductCode, B.cProductSpec BcProductSpec, A.dConfirm,
A.dCheck1, C.cParamter, C.cSpec AS cProductSpec, C.cColor, A.cCreator
FROM Orders A WITH ( NOLOCK )
LEFT JOIN Orders_Product B WITH ( NOLOCK ) ON A.cID = B.cOrdersID
LEFT JOIN Product C WITH ( NOLOCK ) ON B.cProductID = C.cID
LEFT JOIN (
--生产的产品ID
SELECT DISTINCT A1.cProductID
FROM dbo.Product_Item A1
LEFT JOIN dbo.Orders_ProductItem A2 ON A1.cProductID = A2.cProductID
WHERE A1.iProduct != 0
) D ON B.cProductID = D.cProductID
WHERE 1 = 1
AND B.cProductID = D.cProductID
AND A.iCancel = ''
AND ( iStatus = 30
OR ( iStatus = 20
AND iNewCRM != 1
AND NOT EXISTS ( SELECT 1
FROM Orders_ProductItem WITH ( NOLOCK )
WHERE iCustom = 1
AND cOrdersID = A.cID )
)
)
AND ( A.iStatusPP = 0
OR A.iStatusPP = 1
)
AND NOT EXISTS ( SELECT 1
FROM MOrders_Product
LEFT JOIN dbo.MOrders ON MOrders.cID = MOrders_Product.cMOrdersID
WHERE cOrdersProductID = B.cSubID
AND dbo.MOrders.iStatus != 2 )
AND B.iCancelM = 0
AND B.cSubID NOT IN (
SELECT B.cOrdersProductID
FROM DOrders A
LEFT JOIN DOrders_Sub B ON A.cID = B.cDOrdersID
WHERE iStatus = 3 )
ORDER BY A.dUDate DESC;
经过分析定位到:not in 导至系统卡顿:
B.cSubID NOT IN (
SELECT B.cOrdersProductID
FROM DOrders A
LEFT JOIN DOrders_Sub B ON A.cID = B.cDOrdersID
WHERE iStatus = 3
将not in 改为 not exists问题得以解决,系统正常运作。
改后的代码为:
SELECT A.cCrm, A.cCode AS cOrderCode, A.dRequire, A.dSubmit, B.*,
C.cCode AS cProductCode, B.cProductSpec BcProductSpec, A.dConfirm,
A.dCheck1, C.cParamter, C.cSpec AS cProductSpec, C.cColor, A.cCreator
FROM Orders A WITH ( NOLOCK )
LEFT JOIN Orders_Product B WITH ( NOLOCK ) ON A.cID = B.cOrdersID
LEFT JOIN Product C WITH ( NOLOCK ) ON B.cProductID = C.cID
LEFT JOIN (
--生产的产品ID
SELECT DISTINCT A1.cProductID
FROM dbo.Product_Item A1
LEFT JOIN dbo.Orders_ProductItem A2 ON A1.cProductID = A2.cProductID
WHERE A1.iProduct != 0
) D ON B.cProductID = D.cProductID
WHERE 1 = 1
AND B.cProductID = D.cProductID
AND A.iCancel = ''
AND ( iStatus = 30
OR ( iStatus = 20
AND iNewCRM != 1
AND NOT EXISTS ( SELECT 1
FROM Orders_ProductItem WITH ( NOLOCK )
WHERE iCustom = 1
AND cOrdersID = A.cID )
)
)
AND ( A.iStatusPP = 0
OR A.iStatusPP = 1
)
AND NOT EXISTS ( SELECT 1
FROM MOrders_Product
LEFT JOIN dbo.MOrders ON MOrders.cID = MOrders_Product.cMOrdersID
WHERE cOrdersProductID = B.cSubID
AND dbo.MOrders.iStatus != 2 )
AND B.iCancelM = 0
AND NOT EXISTS (
SELECT 1
FROM DOrders AA
LEFT JOIN DOrders_Sub BB ON AA.cID = BB.cDOrdersID
WHERE iStatus = 3 AND B.cSubID=bb.cOrdersProductID)
ORDER BY A.dUDate DESC;
原因可以参考以下文章:
https://www.cnblogs.com/totian/p/7597300.html
https://blog.csdn.net/zxu_1995/article/details/82388395
MS Sql 优化步骤及优化not in一例的更多相关文章
- 数据库优化实践【MS SQL优化开篇】
		
数据库定义: 数据库是依照某种数据模型组织起来并存在二级存储器中的数据集合,此集合具有尽可能不重复,以最优方式为特定组织提供多种应用服务,其数据结构独立于应用程序,对数据的CRUD操作进行统一管理和控 ...
 - MS SQL优化
		
数据库优化实践[MS SQL优化开篇] 数据库定义: 数据库是依照某种数据模型组织起来并存在二级存储器中的数据集合,此集合具有尽可能不重复,以最优方式为特定组织提供多种应用服务,其数据结构独立于应 ...
 - [置顶] 数据库优化实践【MS SQL优化开篇】
		
数据库定义: 数据库是依照某种数据模型组织起来并存在二级存储器中的数据集合,此集合具有尽可能不重复,以最优方式为特定组织提供多种应用服务,其数据结构独立于应用程序,对数据的CRUD操作进行统一管理和控 ...
 - MS SQL语句优化
		
MS SQL Server查询优化方法查询速度慢的原因很多,常见如下几种 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计 ...
 - 复杂sql优化步骤与技巧
		
数据管理型系统,由于用户的要求或者系统设计要求,会出现大量表进行join,还要进行大量统计性数据查询展示,甚至数据权限控制等操作.最后会导致sql异常复杂,随着数据量增加,或者只是应用到生产环境(正式 ...
 - 温故知新-Mysql的体系结构概览&sql优化步骤
		
文章目录 Mysql的体系结构概览 连接层 服务层 引擎层 存储层 存储引擎 存储引擎概述 存储引擎特性是Oracle10g中推出的帮助DBA优化工具,它的特点是简单.智能,DBA值需要调用函数就可以给出一个性能很差的语句的优化结果.下面介绍一 ...
 - SQL Server数据库性能优化之索引篇【转】
		
http://www.blogjava.net/allen-zhe/archive/2010/07/23/326966.html 性能优化之索引篇 近期项目需要, 做了一段时间的SQL Server性 ...
 
随机推荐
- isinstance、issubbclass
			
目录 isinstance issubclass subclasses Python提供了如下两个函数来检查类型: isinstance(obj, class_or_tuple):检查 obj 是否为 ...
 - 记一次排错经历,requests和fake_useragent
			
在部署tornado项目上线时, 首次重启服务后第一次请求必然会报错, 后续的就能正常访问, 长报错urllib.error.URLError,如图排查多次依然发现不了问题 报的最多的依然是上图中的错 ...
 - Signal ()函数用法和总结
			
void(* signal(int sig,void(* func)(int)))(int); 设置处理信号的功能 指定使用sig指定的信号编号处理信号的方法. 参数func指定程序可以处理信号的三种 ...
 - 洛谷P3232[HNOI2013]游走
			
有一个无向简单连通图,顶点从 \(1\) 编号到 \(n\),边从 \(1\) 编号到 \(m\) 小Z在该图上进行随机游走,初始时小Z在\(1\)号顶点,每一步小Z以相等的概率随机选 择当前顶点的某 ...
 - Golang 基础语法介绍及对比(二)
			
传值与传参 Golong func main() { a := fmt.Println("a = ", a) // 应该输出 "a= 3" a1 := add1 ...
 - 【活动公告】Hackathon —— 腾讯云AI API接入迷你赛
			
一. 活动简介 编程马拉松(Hackathon)是将热爱软硬件开发的人聚集起来所举办的一项比赛,本次活动由腾讯云AI联合云+社区发起,希望让广大开发者体验到腾讯云AI的魅力.比赛过程中,参赛者可以尽情 ...
 - 逆天的化妆CSS
			
初涉前端之CSS 1.css介绍  CSS是前端在HTML之前所走的后续工作,CSS的学名叫做层叠样式,他是用来定义如何来显示我们写的HTML元素的:当一个浏览器读取到了一个样式表,他就会按照这个样 ...
 - 带lambda参数的宏定义
			
我们知道有些宏的参数是表达式,在DEBUG启用的使用,可以输出一些日志,在RELEASE的时候,可以节省性能. 如下的宏定义是基于lambda表达式,可以处理一些复杂的逻辑. #ifdef debug ...
 - 在 C++ 中使用 QML 对象
			
看过了如何在 QML 中使用 C++ 类型或对象,现在来看如何在 C++ 中使用 QML 对象. 我们可以使用 QML 对象的信号.槽,访问它们的属性,都没有问题,因为很多 QML 对象对应的类型,原 ...
 - win10下MYSQL的下载、安装以及配置超详解教程(转)
			
下载MYSQL 官网下载MYSQL5.7.21版本,链接地址https://www.mysql.com/downloads/.下载流程图如下: 进入官网点击Community,下载社区版. 找到MYS ...