cpu-mssql 视图语句优化 很慢

问题描述

mssql 视图语句优化 很慢

这个视图只要count(1)就很慢,同时CPU也会很高,需要怎么样来写会快些

ALTER VIEW [dbo].[V_SynthesizeAsyn]
AS
SELECT a.Sysnumber ,
a.OrderId ,
a.OrderTime ,
a.MemberId ,
a.AvType ,
a.AvObject ,
a.AvDescription ,
CASE a.AvObject
WHEN 'gs' THEN '金牌供应商'
WHEN 'etp' THEN '企业诚信通'
WHEN 'itp' THEN '海外TP'
WHEN 'zg' THEN '中供'
ELSE a.AvObject
END AS AvObjectCn ,
a.CompanyNameCn ,
a.MemberNameCn ,
a.DangerDetail ,
a.IfRenew ,
CASE a.IfRenew
WHEN 'y' THEN '是'
ELSE '否'
END AS IfRenewCn ,
b.WarningGrade ,
d.CompanyProvince ,
d.CompanyProvince AS Province ,
d.CompanyCity ,
d.CompanyCity AS city ,
rs.Name AS CompanyCityCN ,
Ps.Name AS CompanyProvinceCN ,
b.CurrentNodeID ,
b.CurrentNodeName ,
b.IfProveCheck ,
b.IfBusiCheck ,
b.IfRenew_Again ,
CASE b.IfRenew_Again
WHEN 'y' THEN '是'
ELSE '否'
END AS IfRenew_AgainCn ,
b.IsFeedBack ,
CASE b.IsFeedBack
WHEN '1' THEN '是'
ELSE '否'
END AS IsFeedBackCn ,
b.FeedBackTime ,
e.Operator ,
d.CompanyName ,
e.OperatorName ,
d.CeoName ,
d.Tel ,
f.Result ,
( CASE UPPER(ISNULL(f.Result, ''))
WHEN 'YES' THEN '完全正确'
WHEN 'NO' THEN '完全不正确'
WHEN 'OTHER' THEN '部分正确'
ELSE ''
END ) AS Result_Name ,
b.ErrorDot ,
a.MakerID ,
a.Maker ,
d.CompanyAddr ,
d.LicenseNumber ,
b.IfTranslate ,
b.TranslateAudit ,
f.Content ,
d.CompanyEntityType ,
z.Name AS EntityTypeName ,
y.USERNAME ,
x.Maker AS LastVerify ,
a.VeriScope ,
a.ExpireDate ,
a.Priority
FROM dbo.T_SendAVInfo AS a WITH ( NOLOCK )
INNER JOIN dbo.T_OrderStateInfo AS b WITH ( NOLOCK ) ON a.Sysnumber = b.SendAVInfoSysnumber
AND b.IfRemove = '0'
LEFT JOIN dbo.T_DataCollectInfo AS d WITH ( NOLOCK ) ON a.Sysnumber = d.SendAVInfoSysnumber
LEFT JOIN dbo.T_DataDispense AS e WITH ( NOLOCK ) ON e.OperateState = '1'
AND a.Sysnumber = e.SendAVInfoSysnumber
LEFT JOIN dbo.T_SideVerifyRecords AS f WITH ( NOLOCK ) ON a.Sysnumber = f.SendAVInfoSysnumber

        LEFT JOIN ( SELECT  Name ,
                            Number
                    FROM    dbo.Base_DDTree WITH ( NOLOCK )
                    WHERE   ( PareNumber = 'ST0906100004' )
                  ) AS z ON z.Number = d.CompanyEntityType
        LEFT JOIN ( ( SELECT    Name ,
                                Number
                      FROM      dbo.Base_DDTree
                      WHERE     DataType = 'hzst_tree_area'
                                AND DELETEED = '0'
                                AND IfLeaf = 0
                    ) ) AS rs ON rs.Number = d.CompanyCity
        LEFT JOIN ( ( SELECT    Name ,
                                Number
                      FROM      dbo.Base_DDTree
                      WHERE     DataType = 'hzst_tree_area'
                                AND DELETEED = '0'
                    ) ) AS Ps ON Ps.Number = d.CompanyProvince
        LEFT  JOIN ( SELECT USERID ,
                            USERNAME
                     FROM   dbo.T_IA_USERS WITH ( NOLOCK )
                   ) AS y ON e.Operator = y.USERID
         --获取审核人
        LEFT JOIN ( SELECT  loga.SendAVInfoSysnumber ,
                            logb.Maker
                    FROM    ( SELECT    SendAVInfoSysnumber ,
                                        MAX(CreateTime) AS CreateTime
                              FROM      dbo.T_Operationlog WITH ( NOLOCK )
                              WHERE     CurrentNodeID = '111' AND T_Operationlog.SendAVInfoSysnumber='111'
                              GROUP BY  SendAVInfoSysnumber
                            ) loga
                            LEFT JOIN ( SELECT  SendAVInfoSysnumber ,
                                                CreateTime ,
                                                Maker ,
                                                CurrentNodeID
                                        FROM    dbo.T_Operationlog WITH ( NOLOCK )
                                      ) logb ON loga.SendAVInfoSysnumber = logb.SendAVInfoSysnumber
                                                AND loga.CreateTime = logb.CreateTime
                  ) x ON a.Sysnumber = x.SendAVInfoSysnumber;
        LEFT JOIN ( SELECT TOP 1
                            SendAVInfoSysnumber ,
                            Maker
                    FROM    T_Operationlog
                    ORDER BY CreateTime DESC
                  ) x ON a.Sysnumber = x.SendAVInfoSysnumber;

GO

SQL Server 分析和编译时间:
CPU 时间 = 3656 毫秒,占用时间 = 3691 毫秒。

(1 行受影响)
表 'Base_DDTree'。扫描计数 19,逻辑读取 22 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'T_OrderStateInfo'。扫描计数 9,逻辑读取 6138 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'T_SendAVInfo'。扫描计数 9,逻辑读取 4747 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'T_DataCollectInfo'。扫描计数 9,逻辑读取 24325 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'Worktable'。扫描计数 0,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'T_DataDispense'。扫描计数 9,逻辑读取 5456 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'T_SideVerifyRecords'。扫描计数 9,逻辑读取 5960 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'Worktable'。扫描计数 0,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

SQL Server 执行时间:
CPU 时间 = 25026 毫秒,占用时间 = 3613 毫秒。

解决方案

在这两个字段Sysnumber,b.SendAVInfoSysnumber上分别建立索引试试看

解决方案二:

我是不知道,坐等大神

解决方案三:

你这个只是简单的表连接,也没有聚合之类的,在所有涉及到的条件列上建立索引试试;
另外把CASE 语句都去掉试试;

解决方案四:

从两个方面优化试下:1)从你贴出的执行计划中可以看到T_DataCollectInfo的逻辑读是最大的,而你又建立了索引考虑下把这个表的数据帅选下再做连接查询,也就是减小连接查询中表的大小;
2)left join是连接查询中效率较低的(相对join和inner join),前面几个左连结查询查询可能无法避免,但是后面几个什么获取审核人的一些可以考虑前嵌套的查询;
3)针对同一个查询目标不同的人写的代码也不同,有可能你对业务理解和查询逻辑理解不够,写的这种实现逻辑效率较低,你自己再思考下,或者你详细描述下你的需求,提供用到的几张表的字段定义说明,大家帮你参考下。

时间: 2024-08-31 08:37:29

cpu-mssql 视图语句优化 很慢的相关文章

sql语句优化,很着急,在线等,sql如下

问题描述 sql语句优化,很着急,在线等,sql如下 SELECT t1.user_id AS user_id, t1.user_name AS user_name, t1.serv_num AS serv_num, t1.create_date AS create_date, t1.connect_type AS connect_type, t1.login_device AS login_device, t1.login_time AS login_time, ( SELECT timest

SQL语句优化提高数据库性能_MsSql

性能不理想的系统中除了一部分是因为应用程序的负载确实超过了服务器的实际处理能力外,更多的是因为系统存在大量的SQL语句需要优化.为了获得稳定的执行性能,SQL语句越简单越好.对复杂的SQL语句,要设法对之进行简化. 常见的简化规则如下: 1)不要有超过5个以上的表连接(JOIN) 2)考虑使用临时表或表变量存放中间结果 3)少用子查询 4)视图嵌套不要过深,一般视图嵌套不要超过2个为宜 一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出S

sql语句优化之SQL Server(详细整理)_MsSql

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

SQL语句优化提高数据库性能

性能不理想的系统中除了一部分是因为应用程序的负载确实超过了服务器的实际处理能力外,更多的是因为系统存在大量的SQL语句需要优化.为了获得稳定的执行性能,SQL语句越简单越好.对复杂的SQL语句,要设法对之进行简化. 常见的简化规则如下: 1)不要有超过5个以上的表连接(JOIN) 2)考虑使用临时表或表变量存放中间结果 3)少用子查询 4)视图嵌套不要过深,一般视图嵌套不要超过2个为宜 一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出S

加速MySQL SQL语句优化的一些命令方法

引言 优化SQL,是DBA常见的工作之一.如何高效.快速地优化一条语句,是每个DBA经常要面对的一个问题.在日常的优化工作中,我发现有很多操作是在优化过程中必不可少的步骤.然而这些步骤重复性的执行,又会耗费DBA很多精力.于是萌发了自己编写小工具,提高优化效率的想法. 那选择何种语言来开发工具呢? 对于一名DBA来说,掌握一门语言配合自己的工作是非常必要的.相对于shell的简单.perl的飘逸,Python是一种严谨的高级语言.其具备上手快.语法简单.扩展丰富.跨平台等多种优点.很多人把它称为

如何用一款小工具大大加速MySQL SQL语句优化(附源码)

作者介绍 韩锋,宜信技术研发中心数据库架构师.精通多种关系型数据库,曾任职于当当网.TOM在线等公司,曾任多家公司首席DBA.数据库架构师等职,多年一线数据库架构.设计.开发经验.著有<SQL优化最佳实践>一书.   引言   优化SQL,是DBA常见的工作之一.如何高效.快速地优化一条语句,是每个DBA经常要面对的一个问题.在日常的优化工作中,我发现有很多操作是在优化过程中必不可少的步骤.然而这些步骤重复性的执行,又会耗费DBA很多精力.于是萌发了自己编写小工具,提高优化效率的想法.   那

select-sql 语句优化,求帮忙

问题描述 sql 语句优化,求帮忙 Select t9.Product_IDa.Product_Namea.Product_BuyNum b.Org_Price b.Sale_Price c.Img_Small c.Img_Middleisnull((select SubShop_Price from subshop_product where subshop_id=1057 and product_id=a.product_id)b.Sug_Price) as SubShop_Price b.

SQL语句优化

前一段时间一直在优化系统,看了一些关于SQL语句优化的东西,在这里分享一下. 1.统一SQL语句的写法 对于以下两句SQL语句,程序员认为是相同的,数据库查询优化器认为是不同的. select*from dual select*From dual 其实就是大小写不同,查询分析器就认为是两句不同的SQL语句,必须进行两次解析.生成2个执行计划.所以作为程序员,应该保证相同的查询语句在任何地方都一致,多一个空格都不行! 2.使用"临时表"暂存中间结果 简化SQL语句的重要方法就是采用临时表

Mysql查询语句优化技巧_Mysql

索引优化,查询优化,查询缓存,服务器设置优化,操作系统和硬件优化,应用层面优化(web服务器,缓存)等等.这里的记录的优化技巧更适用于开发人员,都是从网络上收集和自己整理的,主要是查询语句上面的优化,其它层面的优化技巧在此不做记录. 查询的开销指标: 执行时间 检查的行数 返回的行数 建立索引的几个准则: (1).合理的建立索引能够加速数据读取效率,不合理的建立索引反而会拖慢数据库的响应速度. (2).索引越多,更新数据的速度越慢. (3).尽量在采用MyIsam作为引擎的时候使用索引(因为My