为了账号安全,请及时绑定邮箱和手机立即绑定

sql查询性能低下

sql查询性能低下

largeQ 2018-12-07 08:44:03
With ZBS AS( select zb.ZUser_RefererUrl as RefererUrl,zb.ZUser_Id as ID, zb.ZUser_Key as UserKey,zb.ZUser_SousuoKeyword as SousuoKeyword,zb.ZUser_BMobile as BMobile,zb.ZUser_Mobile as Mobile, zb.ZUser_Email as Email,zb.ZUser_Int1 as QQ,zb.ZUser_Str1 as UserPUK,zb.ZUser_Nickname as Nickname,zb.ZUser_StayTotalSecs as StayTotalSecs,ZUser_AddTime as AddTime from ZbsUserInfo as zb where ZUser_AddTime between '2015/10/14 0:00:00' and '2015/10/15 23:59:59' and zb.ZUser_StayTotalSecs>=-1 and zb.Sp_Id in ( 1,2,3,4,5,6,7,8,9,-1) and zb.ZUser_Int1 >0 ) select * from ( select ROW_NUMBER() OVER (ORDER BY AddTime desc ) as ZS,Count(*) over() as Total,* from ZBS where ID in (select min(ID) from ZBS group by UserKey having count(UserKey )>=1 ) ) as T where ZS between 1 and 30   ZbsUserInfo 这个表的数据量有几十万..然后放在数据库查询的时候需要几十秒. .单表查询性能都这么地下.欲哭无泪..导致web服务器都奔溃.搜了sql性能化相关资料发现大多都是尽量使用索引查询不要使sql语句导致全表查询.本人才疏学浅.特此来寻求优化解决方法.或者其他解决方法.
查看完整描述

7 回答

?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

 

 

1. in语句影响性能,换成别的试试. 

2. 尽量避免在where子句中对字段进行函数操作,否则将导致全表扫描。

3. 建议你分段执行看看到底哪一段代码耗时多.

例如With 那一块执行一次. 然后Select 那一段执行一次. 看看具体耗时比较长的是在哪一段.

然后再慢慢排查是因为哪个where条件导致时间变长.

 

 

查看完整回答
反对 回复 2019-01-07
?
万千封印

TA贡献1891条经验 获得超3个赞

1、建索引原则,一般根据所查询的条件或关联的条件来建,如ZbsUserInfo:

ZUser_AddTime,ZUser_StayTotalSecs,Sp_Id,ZUser_Int1 这些列

可能会是这样子的


CREATE NONCLUSTERED INDEX [索引名] ON [dbo].[ZbsUserInfo]
(
ZUser_AddTime,

ZUser_StayTotalSecs,

Sp_Id,

ZUser_Int1
)
INCLUDE (

ZUser_RefererUrl,
ZUser_Id,
ZUser_Key,
ZUser_SousuoKeyword,
ZUser_BMobile,
ZUser_Mobile,

........

) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO

这种手动建索引。

2、如果你使用的是MsSql2008及以上的版本就更好办了MSSMS提供了一个方案自动提示你要建什么索引非常方便

查询->包括实际的执行计划,点击一下就执行你人慢SQL语句吧

下面为:结果、消息、执行计划

答案就是执行计划中会显示为“缺少索引(...”右键-》缺少索引详细信息

查看完整回答
反对 回复 2019-01-07
?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

这个之前创建了.采用的你说的第二种方法创建的.

查看完整回答
反对 回复 2019-01-07
?
慕容3067478

TA贡献1773条经验 获得超3个赞

试试用SQL Server profile看看具体哪里是性能瓶颈,然后再优化

查看完整回答
反对 回复 2019-01-07
?
森栏

TA贡献1810条经验 获得超5个赞

我表中2,30个字段..这里读取不是所有列,其中一部分

查看完整回答
反对 回复 2019-01-07
?
慕的地10843

TA贡献1785条经验 获得超8个赞

in我正按照2楼所说的试一试...

查看完整回答
反对 回复 2019-01-07
  • 7 回答
  • 0 关注
  • 495 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信