sql server大数据量单表访问

blackbery 2020-10-10 09:11:18
比如我有一张表tableA,2亿条记录,15个字段左右,没有特别建立索引,主键是一个ID列,不考虑按月份分表,分库的情况。目前是按年分表,这个查询的目的是要查询所有用户在指定的时间段内,最后的登陆时间的那条记录。
在sql server的ssms里运行了以下查询语句:
select t1.id,t1.姓名,t1.登陆时间,......
from tableA AS t1
right outer join
(
select 姓名,MAX(登陆时间)
from tableA where 登陆时间 between '开始时间' and '结束时间' group by 姓名
) as t2
on t1.姓名=t2.姓名 and t1.登陆时间=t2.登陆时间

整个语句运行大概需要10分钟左右,我单独测试了每条语句,以下这句话的查询时间大概在80秒左右:
select 姓名,MAX(登陆时间)
from tableA where 登陆时间 between '开始时间' and '结束时间' group by 姓名

后来测试了按月分表的情况,嵌套的类似上面的语句,大概在2秒多,总体的在20秒左右,情况有明显。目前我的疑问就是差距为什么这么大,我实在不想按月分表,临时表和存储过程能解决这个问题么?这两种方案我不熟,没有测试,数据库操作水平有限,边摸索边试验的,但是看了临时表和存储过程的介绍,感觉临时表和存储过程无法解决查询速度快慢的问题。
分数有限,请谅解,讨论技术



...全文
229 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoxiangqing 2020-10-19
  • 打赏
  • 举报
回复
建了索引,基本上会很快
吉普赛的歌 版主 2020-10-18
  • 打赏
  • 举报
回复
引用 6 楼 blackbery 的回复:
只是重新了登录时间这个索引,删除了两个索引
能解决就最好, 没事就结贴吧
blackbery 2020-10-15
  • 打赏
  • 举报
回复
只是重新了登录时间这个索引,删除了两个索引
blackbery 2020-10-15
  • 打赏
  • 举报
回复
引用 3 楼 qq_457565758的回复:
.姓名=t2.姓名 and t1.登陆时间=t2.登陆时间 表明要在姓名和登录时间上要创建索引
额,我终于解决这个问题了,谢谢。是索引出问题了,重建索引后,查询速度就成了2秒内
blackbery 2020-10-15
  • 打赏
  • 举报
回复
引用 2 楼 二月十六的回复:
楼主查询条件的时间跨度是什么样的,和分表的时间段匹配怎么样,如果就是一个月内的时间,肯定是按照月分表,月时间查询快,最起码查询的数据量就差了很多。 另外可以尝试ye版给的建议,建立索引。 ye版的查询语句可能会有时间和id不是同一条数据的问题,如果对id没有要求,这样写最好了。
额,我终于解决这个问题了,谢谢。是索引出问题了,重建索引后,查询速度就成了2秒内
lao_yunger 2020-10-13
  • 打赏
  • 举报
回复
.姓名=t2.姓名 and t1.登陆时间=t2.登陆时间 表明要在姓名和登录时间上要创建索引
二月十六 版主 2020-10-13
  • 打赏
  • 举报
回复
楼主查询条件的时间跨度是什么样的,和分表的时间段匹配怎么样,如果就是一个月内的时间,肯定是按照月分表,月时间查询快,最起码查询的数据量就差了很多。 另外可以尝试ye版给的建议,建立索引。 ye版的查询语句可能会有时间和id不是同一条数据的问题,如果对id没有要求,这样写最好了。
吉普赛的歌 版主 2020-10-13
  • 打赏
  • 举报
回复
--1. 增加聚集索引。(如果已有其它聚集索引而冲突,先删除其它索引)
CREATE CLUSTERED INDEX IX_tableA_登陆时间_姓名 ON IX_tableA(登陆时间, 姓名);
GO
--2. 查询改成这样,不要嵌套, 嵌套是万恶之源
SELECT MAX(id) AS id
        ,姓名
        ,MAX(登陆时间) AS 登陆时间
FROM   tableA
WHERE  登陆时间 BETWEEN '开始时间' AND '结束时间'
GROUP BY
        姓名

34,588

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧