求优化

gw6328 2010-12-16 07:40:28

declare @startTime datetime
,@endTime datetime
set @startTime='2010-12-16 10:00:00'
set @endTime='2010-12-16 10:10:00'

SELECT x.[siteId],x.[adid],count(x.ip) as ip
from
(
SELECT A.[SiteId],A.[AdId],A.[Ip] FROM PEE_DATA_Show_20101216 A WHERE A.[RecTime]>=@startTime AND A.[RecTime]<@endTime
GROUP BY A.[SiteId],A.[AdId],A.[Ip]
EXCEPT
SELECT A1.[AdId],A1.[SiteId],A1.[Ip] FROM PEE_DATA_Show_20101216 A1 WHERE A1.[RecTime]<@startTime
GROUP BY A1.[AdId],A1.[SiteId],A1.[Ip]
) x
group by x.[siteId],x.[adid]

大神们,求优化!这个是统计IP的,要去除相同IP,所以用了一个Except 。我用过 left join 比Except还要慢一些
...全文
137 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
gw6328 2010-12-17
  • 打赏
  • 举报
回复

.....
gw6328 2010-12-17
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 dawugui 的回复:]
SQL code
最好给出完整的表结构,测试数据,计算方法和正确结果.否则耽搁的是你宝贵的时间。
如果有多表,表之间如何关联?



发帖注意事项
http://topic.csdn.net/u/20091130/21/fb718680-98ff-4afb-98d8-cff2f8293ed5.html?24281
[/Quote]
谢谢提醒,我下班发得太急了。没有整好。以后我会注意的。
gw6328 2010-12-17
  • 打赏
  • 举报
回复
问题很严重了。我在rectime上建了聚集索引,或者在 adid与siteId上建了非聚集索引,发现都比以前更慢了。这是什么情况。是数据量大了的原因吗?千万级的数据。
dawugui 2010-12-16
  • 打赏
  • 举报
回复
最好给出完整的表结构,测试数据,计算方法和正确结果.否则耽搁的是你宝贵的时间。
如果有多表,表之间如何关联?


发帖注意事项
http://topic.csdn.net/u/20091130/21/fb718680-98ff-4afb-98d8-cff2f8293ed5.html?24281

飘零一叶 2010-12-16
  • 打赏
  • 举报
回复
把GROUP BY换成DISTINCT,并在RecTime列上建立聚集索引。
楼主试下看效率如何
gw6328 2010-12-16
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 qianjin036a 的回复:]
SQL code
create table PEE_DATA_Show_20101216(siteid int,adid int,ip nvarchar(15),RecTime datetime)
insert into PEE_DATA_Show_20101216 select 1,1,'1.1.1.1','2010-12-16 9:28:28'--在starttime前,不计
union……
[/Quote]
睛天大哥

insert into PEE_DATA_Show_20101216
select 1,1,'1.1.1.1','2010-12-16 9:28:28'--在starttime前,不计
union all select 1,1,'10.10.10.10','2010-12-16 9:29:00' --这种情况
union all select 1,1,'10.10.10.10','010-12-16 10:02:18'
union all select 1,1,'10.10.10.101','010-12-16 10:05:28'
union all select 1,1,'10.10.10.10','010-12-16 10:06:28' ---IP与前面相同
union all select 1,1,'10.10.101.10','010-12-16 10:10:28' -- 在endtime后,不计
/* 我想要的是这种结果。因为IP一天的只能算一个
siteId adid ip
----------- ----------- -----------
1 1 1

*/
-晴天 2010-12-16
  • 打赏
  • 举报
回复
create table PEE_DATA_Show_20101216(siteid int,adid int,ip nvarchar(15),RecTime datetime)
insert into PEE_DATA_Show_20101216 select 1,1,'1.1.1.1','2010-12-16 9:28:28'--在starttime前,不计
union all select 1,1,'10.10.10.10','010-12-16 10:02:18'
union all select 1,1,'10.10.10.101','010-12-16 10:05:28'
union all select 1,1,'10.10.10.10','010-12-16 10:06:28' ---IP与前面相同
union all select 1,1,'10.10.101.10','010-12-16 10:10:28' -- 在endtime后,不计
go
declare @startTime datetime
,@endTime datetime
set @startTime='2010-12-16 10:00:00'
set @endTime='2010-12-16 10:10:00'

SELECT x.[siteId],x.[adid],count(x.ip) as ip
from
(
SELECT distinct [SiteId],[AdId],[Ip] FROM PEE_DATA_Show_20101216 A WHERE A.[RecTime]>=@startTime AND A.[RecTime]<@endTime
) x
group by x.[siteId],x.[adid]
go
drop table PEE_DATA_Show_20101216
/*
siteId adid ip
----------- ----------- -----------
1 1 2

(1 行受影响)

*/
billpu 2010-12-16
  • 打赏
  • 举报
回复
rectime上建聚集索引
-晴天 2010-12-16
  • 打赏
  • 举报
回复
后面有条件的,怎么会没排除呢!
WHERE A.[RecTime]>=@startTime AND A.[RecTime]<@endTime

对你这样的表和我这样的查询,建索引必定会加快查询速度.
gw6328 2010-12-16
  • 打赏
  • 举报
回复
才一个哥回我。我感觉好凄凉。大哥些,帮忙啊。
gw6328 2010-12-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 qianjin036a 的回复:]
SQL code
SELECT x.[siteId],x.[adid],count(x.ip) as ip
from
(
SELECT distinct [SiteId],[AdId],[Ip] FROM PEE_DATA_Show_20101216 A WHERE A.[RecTime]>=@startTime AND A.[RecTime]<@endTime
) x
group ……
[/Quote]
睛天哥,谢谢,可能是我没有说清楚,刚才下班太急了。
是这样的。你那个只是算到了@startTime 到@endTime的时段的独立IP。但是@startTime以前的没有排除。
如果给三列建了索引查入数据时会不会很慢。
-晴天 2010-12-16
  • 打赏
  • 举报
回复
建议:为这三个列创建索引.
-晴天 2010-12-16
  • 打赏
  • 举报
回复
SELECT x.[siteId],x.[adid],count(x.ip) as ip
from
(
SELECT distinct [SiteId],[AdId],[Ip] FROM PEE_DATA_Show_20101216 A WHERE A.[RecTime]>=@startTime AND A.[RecTime]<@endTime
) x
group by x.[siteId],x.[adid]

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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