大数据量如何优化sql语句

zhangweitc123 2015-12-03 04:57:35

select * from ( select * from Login201511 union all select * from Login201512)x
where Explain like '%%' and Contents like '%%' and Id not in(
select top 0 Id from ( select * from Login201511 union all select * from Login201512) y
where Explain like '%%' and Contents like '%%'
and DATEDIFF(SECOND,'2015-11-01 16:34:42',time)>=0
and DATEDIFF(SECOND,time,'2015-12-01 16:34:51')>=0
order by time desc,Id desc )
and DATEDIFF(SECOND,'2015-11-01 16:34:42',time)>=0
and DATEDIFF(SECOND,time,'2015-12-01 16:34:51')>=0
order by time desc,id desc

说明:LoginyyyyMM表中,一张表的数据量大概是500万,现在查询用时为54秒,数据量为5408586条。中间的子查询是加的分页,也可以换成25,50,100等等。
请问如何优化当前sql语句,太慢了,请提出宝贵意见,最好写好并分析一下,不胜感激。
...全文
268 11 点赞 打赏 收藏 举报
写回复
11 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
feihong0233 2015-12-13
如果一个表的数据超多并且查询语句还很复杂,应该考虑修整数据存储结构,嵌套表适用于数据记录较少的数据表,当数据量较大时,应考虑建立带有时间戳的抽象汇总表,在cpu空闲时更新并在日常使用
  • 打赏
  • 举报
回复
feihong0233 2015-12-13
1、合理增加索引可以解决部分问题 2、增加架构,数据分段记录,并且生成分段统计表,使用汇总或者统计数据时直接使用统计表
  • 打赏
  • 举报
回复
mr_ding_860101 2015-12-11
这么多like ‘%%’ 导致全表扫描,铁定的
  • 打赏
  • 举报
回复
除了时间条件,别直接用datediff >=0之外,建议把not in去掉,至少也得改成not exists。
  • 打赏
  • 举报
回复
Yole 2015-12-04
看一下执行计划,有没有走time上的索引
  • 打赏
  • 举报
回复
zhangweitc123 2015-12-04
可是我试了一下,time<=xxx and time <=xxx没有原先的快
  • 打赏
  • 举报
回复
Yole 2015-12-04
把datediff函数去掉,直接用time 和 ‘xxxx-xx-xx ’时间比较 time<=xxx and time <=xxx
  • 打赏
  • 举报
回复
zhangweitc123 2015-12-04
还有其他的办法吗,并没有明显的提高
  • 打赏
  • 举报
回复
zhangweitc123 2015-12-03
嗯,明早试一下,刚才好像时间变成大于小于的变慢了
  • 打赏
  • 举报
回复
等不到来世 2015-12-03
id也必须有索引。
  • 打赏
  • 举报
回复
等不到来世 2015-12-03

--1. 请务必在time列上加索引。
--2. 更改如下条件:

and DATEDIFF(SECOND,'2015-11-01 16:34:42',time)>=0  
and DATEDIFF(SECOND,time,'2015-12-01 16:34:51')>=0  

--改为:
and time>='2015-11-01 16:34:42' and time <='2015-12-01 16:34:51'
  • 打赏
  • 举报
回复
相关推荐
发帖
疑难问题
创建于2007-09-28

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
帖子事件
创建了帖子
2015-12-03 04:57
社区公告
暂无公告