SQLSERVER查询语句超时问题

今天遇到了一个问题,一个查询语句,在测试环境执行没问题,但是正式环境就一直超时。研究了好久,发现是因为时间checktime如果设置为

CheckTime >= '2020-05-01'
	AND CheckTime < '2020-05-31'

就一直超时(最后发现要执行80多秒才能显示结果)
checkdata表有1600多条数据,子查询查出来是6条数据。
但如果时间设为

CheckTime >= '2020-04-01'
	AND CheckTime < '2020-05-31'

就能在1秒内查询出语句。就很奇怪,不知道为啥。
sql如下:

SELECT
	CheckUser,
	UserName,
	COUNT (
	DISTINCT ( ApplyID )) AS NUM 
FROM
	CheckData
	LEFT JOIN UserData ON CheckData.CheckUser = UserData.UserID 
WHERE
	CheckTime >= '2020-05-01'
	AND CheckTime < '2020-05-10'
	AND CheckUser IN (
SELECT DISTINCT 
VALUE
	= SUBSTRING (
	a.ProManagerJobNum,
	b.number,
CASE
	
	WHEN charindex( ',', a.ProManagerJobNum + ',', b.number ) - b.number > 0 THEN
	charindex( ',', a.ProManagerJobNum + ',', b.number ) - b.number 
	WHEN charindex( ',', a.ProManagerJobNum + ',', b.number ) - b.number <= 0 THEN
	0 
END 
	) 
FROM
	ProjectMainInfo a
	JOIN master..spt_values b ON b.type = 'p' 
	AND b.number BETWEEN 1 
	AND len( a.ProManagerJobNum ) 
WHERE
	SUBSTRING ( ',' + a.ProManagerJobNum, b.number, 1 ) = ',' 
	) 
GROUP BY
	CheckUser,
	UserID,
	UserName 
ORDER BY
CheckUser DESC offset ( 0 ) ROWS FETCH NEXT 10 ROWS ONLY

解决方案:
1.把checktime 长时间类型“2020-05-01 00:00:00”
转为字符类型

AND CONVERT(VARCHAR(100),CheckTime,23)>= '2020-05-01'
AND CONVERT(VARCHAR(100),CheckTime,23)< '2020-05-31'

查询就很快了。
后来同事告诉我说,是因为SQL server的优化器,当时间为2020-05-01至2020-05-31时,checkdata表有300多条数据,sqlserver就不进行优化,子查询也不会进行优化。就导致时间很慢。当把时间转化使用convert函数时,就会默认为当前语句进行优化。(主要还是由于sqlserver优化器的判断,所以同事不建议写子查询。)

2.改写sql,因为子查询与主表没有关联。所以把子查询的表当作主表去关联checkdata表与userdata表。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值