首页新闻找找看学习计划

如何从SQL Server表中查询同IP不同用户名的资料

0
悬赏园豆:30 [已解决问题] 解决于 2018-06-21 18:46

公司的业务有个功能需要查询哪些用户在某个时间内跟指定的某个用户使用相同的IP登录,

也就是查询条件是 userid='xxx', addtime>'2018-06-06 00:00:00'

Log表的结构是:

id int pk,

userid varchar(20),

ip varchar(50),

addtime datetime

目前做了组合索引

索引1:ip

索引2:userid,addtime

索引3:userid,addtime,ip

当数据达到25W条的时候,根据查询的条件所消耗的时间很长

下面是我目前使用的语句

select top 50 [userid],[ip],[addtime] from log
where [userid]<>'xxx' and addtime>'2018-06-06 00:00:00' and ip in (
select ip from log where [userid]='xxx' and addtime>'2018-06-06 00:00:00' group by ip)

大家如果有好的办法,请帮我解决一下,谢谢。

亦续缘的主页 亦续缘 | 初学一级 | 园豆:80
提问于:2018-06-21 11:13
< >
分享
最佳答案
0

我有一个跟你差不多结构的表,45W记录,按你的需求查询,200毫秒,甚至连非聚集索引都没建。

 

建议:先把索引去掉,然后跑这个SQL,再看 执行计划。

收获园豆:20
西漠以西 | 小虾三级 |园豆:1670 | 2018-06-21 14:26

能否将您的语句贴下,谢谢。 

亦续缘 | 园豆:80 (初学一级) | 2018-06-21 16:06

@亦续缘: 跟你的语句几乎一样的,只不过我这边 userid是个整数,但明显和这个无关。

明显不是语句的问题。

西漠以西 | 园豆:1670 (小虾三级) | 2018-06-21 16:09

@西漠以西: 好的谢谢

亦续缘 | 园豆:80 (初学一级) | 2018-06-21 17:08
其他回答(1)
0

这个你在写业务逻辑的时候

1. list<##> a  = select ip from log where [userid]='xxx' and addtime>'2018-06-06 00:00:00' group by ip  先把ip查出来

2.然后在select top 50 [userid],[ip],[addtime] from log
where [userid]<>'xxx' and addtime>'2018-06-06 00:00:00' and ip in (a[i])  循环去把信息查出来   分开来执行这个sql 语句   

收获园豆:10
竜咚咚 | 园豆:738 (小虾三级) | 2018-06-21 11:26

那如果传进去的list a 数据很多的话,就不合适了吧

支持(0) 反对(0) 亦续缘 | 园豆:80 (初学一级) | 2018-06-21 11:49

@亦续缘: 在某个时间内跟指定的某个用户使用相同的IP登录 你的list a  一次能查出来多少数据 这样肯定比你的sql 执行效率要高的

支持(0) 反对(0) 竜咚咚 | 园豆:738 (小虾三级) | 2018-06-21 13:36

@竜咚咚: 嗯,我试试看。我这边有些用户的IP在几十,上百个。

支持(0) 反对(0) 亦续缘 | 园豆:80 (初学一级) | 2018-06-21 16:05
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册