现在执行需要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里的值被重新计算了。