大佬,怎么优化这段sql脚本呢?

现在执行需要7s,还能不能优化呢?谢谢

select  from (

     select 

     emp.EmployeeID,

     emp.EmployeeCode,

     emp.EmployeeName,

     SUBSTRING(cast(DATEADD(month,number,esg.BeginTime)as nvarchar),0,8) CurrentMonth,

     sg.SalaryGradeType,

     sg.JobLevelID,

     sg.SalaryGradeName,

     org.[Order] DepartmentOrder,

     org.CompanyID CompanyID

     from (

     SELECT 

     EmployeeSalaryGradeID,

     SalaryGradeID,

     EmployeeID,

     BeginDate as BeginTime,

     ISNULL(EndDate,DATEADD(YEAR,5,getdate())) as EndTime

     FROM dbo.RP_EmployeeSalaryGrade

     ) esg

     right join (select number from master..spt_values where type='P') aa on number>=0 and dateadd(mm,number,esg.BeginTime)<=esg.EndTime

     left join dbo.HR_Employee emp on emp.EmployeeID = esg.EmployeeID

     left join dbo.SEC_Organization org on org.Id=emp.OrgID

     LEFT JOIN dbo.RP_SalaryGrade sg ON sg.SalaryGradeID=esg.SalaryGradeID

     where 1=1 

     and emp.JobStatus=1--在职的

     AND org.CompanyID='E1F55145-25F8-4485-867D-7751D73532B9'--运营分公司的

     ) tb1 where substring(tb1.CurrentMonth,0,5)='2019'

你这段SQL人为添加了许多不合理的写法,基本用不到索引。
不好怎么跟你说。你先看看 SARG 吧:

https://baike.baidu.com/item/SARG/10337663?fr=aladdin
 

连接字段必须有索引,不要包装字段,这两个你先改过来。
where后面的条件也可以建立索引。

跟着XX园系列

而反XX园的常年在编码第一线的人告诉你,扔掉XX园那些东西。我想问的是你们XX园的,到底基于何种想法,会非要写成一句话??

无论XX园告诉你join多么多么美妙,多么多么高级。

我们只能说近乎高级的弱智,当几百万join 几千万,真高级的啊

所有性能的第一步扔掉XX园的高级,实事求是的做。所有的目标都是尽量先过滤条件,先形成小数据。哪怕他不是一条sql

当几百条 和几十条数据联合的时候,你还真和XX园一样纠结啥left join就是比like,比from 子查询高级么??

请问一下,如果要改的话,具体怎么改呢?

建议放存储过程里,,,用临时表来操作,使用起索引

仔细思考3楼的话(吐槽部分除外),然后按照5楼的方法做。思路就是能加索引的表加索引,但是不要多加。复杂逻辑使用存储过程,大量数据使用临时表,通过 传参将大数据表拆分成小数据表,数据范围缩小后,怎么折腾都行因为处理大幅量降低了。顺带一提滥用临时表将大量占用内存,而且临时表要及时删除。

大概看了一下,除了上面各楼说的,资源代下载
SUBSTRING(cast(DATEADD(month,number,esg.BeginTime)as nvarchar),0,8),
substring(tb1.CurrentMonth,0,5)='2019'  不要有对字段进行运算的,什么索引都失效了。
substring(tb1.CurrentMonth,0,5)='2019'是不是等同于
tb1.CurrentMonth >= '2019-01-01 00:00:00'  and tb1.CurrentMonth<'2020-01-01 00:00:00'??
SUBSTRING(cast(DATEADD(month,number,esg.BeginTime)as nvarchar),0,8) CurrentMonth在程序端转换不行吗?

不要在判断表达式或join条件中使用函数表达式,这个绝对是性能杀手。
更不能把内层查询里的计算列用于上层查询的条件比较。

使用函数表达式不是不行,类似字段=dateadd(dd,1,getdate())这样的是可以的,但是函数表达式里不能对字段进行计算,象字段=dateadd(dd,1,字段1) 这样就不行了,会引起索引无效。因为字段1里的值被重新计算了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值