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 = ‘0‘
        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 = ‘0‘
        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

原文地址:https://www.cnblogs.com/KevinMO/p/11407588.html

时间: 2024-08-29 07:10:04

MS Sql 优化步骤及优化not in一例的相关文章

MS SQL语句优化

MS SQL Server查询优化方法查询速度慢的原因很多,常见如下几种 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 5.网络速度慢 6.查询出的数据量过大(可以采用多次查询,其他的方法降低数据量) 7.锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷) 8.sp_lock,sp_who,活动的用户查看,原因是读写竞争资源. 9.返回了不必要的行和列 10.查询语句不好,没

MS Sql优化(转自网络)

MS SQL Server查询优化方法查询速度慢的原因很多,常见如下几种 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 5.网络速度慢 6.查询出的数据量过大(可以采用多次查询,其他的方法降低数据量) 7.锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷) 8.sp_lock,sp_who,活动的用户查看,原因是读写竞争资源. 9.返回了不必要的行和列 10.查询语句不好,没

复杂sql优化步骤与技巧

数据管理型系统,由于用户的要求或者系统设计要求,会出现大量表进行join,还要进行大量统计性数据查询展示,甚至数据权限限制等等操作. 最后会导致sql异常复杂,随着数据量增加,或者只是应用到生产环境(正式环境)就会出现系统反应慢,体验极差的现象,这个时候不得不对这些 复杂的sql进行优化.没有经验的程序员会感觉无从下手,这么复杂的sql语句看一眼就头疼,怎么办呢? 根据个人的工作经验提供一下优化步骤: 首先要对sql语句进行格式化,使sql条理清晰,甚至分步骤添加注释,弄清楚每个步骤是为了得到什

SQL优化相关(MS SQL)

1.With T AS () 中语句会单独生成执行计划 2.MS SQL数据库中已"页"的方式按顺序存储数据,如插入数据,会增加新的页,并将两页中数据平均分配,每一张未填满数据的页称为数据库碎片. 3.避免使用GUID等无序列作为索引 4.页压缩 5.表分区,利用CPU多核特性并行操作数据库 6.数据表数据量较大或join次数较多时时,join方式的自动选择会出现问题,需要在sql中手动设定hash join.merge join或loop join 下面我们通过一个表格简单总结这几种

SQL优化笔记—CPU优化

补充:常规服务器动态管理对象包括,下面有些资料可能会应用到 dm_db_*:数据库和数据库对象dm_exec_*:执行用户代码和关联的连接dm_os_*:内存.锁定和时间安排dm_tran_*:事务和隔离dm_io_*:网络和磁盘的输入/输出 优化性能的常用方法是检索速度最慢的查询构成您 SQL Server 实例上的正常. 每日工作负载的一部分,然后调整它们,一个接一个的"Top 10"列表. 跟踪会话. 请求 和 SQL Server 基础架构中的最耗费大量资源,查询和执行时间最长

SQL业务审核与优化

审核   什么是业务审核 类似与code review 评审业务Schema和SQL设计 偏重关注性能 是业务优化的主要入口之一 审核提前发现问题,进行优化 上线后通过监控或巡检发现问题,进行优化 Schema设计审核 表和字段命名是否合规 字段类型,长度设计是否适当 表关联关系是否合理 主键,更新时间保留字段等是否符合要求 约束,默认值等配置是否恰当 了解业务,表数据量,增长模式 数据访问模式,均衡度 根据业务需求,表是否需要分区,是否有数据什么周期 SQL语句审核 SQL语句的执行频率 表上

SQL Server数据库性能优化之SQL语句篇(转载)

SQL Server数据库性能优化之SQL语句篇 原文地址:http://www.blogjava.net/allen-zhe/archive/2010/07/23/326927.html 期项目需要,做了一段时间的SQL Server性能优化,遇到了一些问题,也积累了一些经验,现总结一下,与君共享.SQL Server性能优化涉及到许多方面,如良好的系统和数据库设计,优质的SQL编写,合适的数据表索引设计,甚至各种硬件因素:网络性能.服务器的性能.操作系统的性能,甚至网卡.交换机等.这篇文章主

Mysql性能优化----SQL语句优化、索引优化、数据库结构优化、系统配置优化、服务器硬件优化

一.SQL语句优化 1-1.MySQL慢日志 1).慢日志开启方式和存储格式 如何发现有问题的SQL? 使用Mysql慢日志对有效率问题的SQL进行监控 前期准备 mysql> show variables like '%log_queri%'; +-------------------------------+-------+ | Variable_name | Value | +-------------------------------+-------+ | log_queries_no

SQL常见的可优化点

此文章系在SQL代码文件中写的... # ########################################### # 索引相关 # ########################################### – 查询(或更新,删除,可以转换为查询)没有用到索引 这是最基础的步骤,需要对sql执行explain查看执行计划中是否用到了索引,需要重点关注type=ALL, key=NULL的字段. – 在索引字段上施加函数 to_char(gmt_created, ‘mm