一个存储过程还有速度的问题,高手请进。

gengxl 2005-01-10 11:47:56
我的存储过程功能,从表sheet1取出符合条件的记录(加的条件太多了吗?)如下:


select * into #aaa from sheet1$ where 被访问网站 like '%chat%' or 被访问网站 like '%sex%' or 被访问网站 like '%game%' or 被访问网站 like '%women%' or 被访问网站 like '%club%' or 被访问网站 like '%job%' or 被访问网站 like '%chinahr%' or 被访问网站 like '%book%' or 被访问网站 like '%love%' or 被访问网站 like '%xxx%' or 被访问网站 like '%pic%' or 详细目录 like '%xxx%' or 详细目录 like '%pic%' order by ip地址,被访问网站,时间

select * into #bbb from #aaa a where (select count(*) from log where 被访问网站 = a.被访问网站 and ip地址=a.ip地址) > 15
drop table #aaa
select * from #bbb order by ip地址,被访问网站


现在表中只有6万条数据,就超时了,asp的超时时间设置是999秒,数据库的连接超时也改过(挺大的,多少忘记了),到底什么原因呢?内网白兆网卡,win2000 server加sql2000。
...全文
130 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
gengxl 2005-01-11
  • 打赏
  • 举报
回复
tigerjacky(林石--抢滩VC) 兄弟的写法我试过,有了这个or后,速度降低了很多。
yunshiyu 2005-01-11
  • 打赏
  • 举报
回复
长见识!学习!
WorldMobile 2005-01-10
  • 打赏
  • 举报
回复
select * into #aaa from sheet1$ where 被访问网站 like '%chat%' or 被访问网站 like '%sex%' or 被访问网站 like '%game%' or 被访问网站 like '%women%' or 被访问网站 like '%club%' or 被访问网站 like '%job%' or 被访问网站 like '%chinahr%' or 被访问网站 like '%book%' or 被访问网站 like '%love%' or 被访问网站 like '%xxx%' or 被访问网站 like '%pic%' or 详细目录 like '%xxx%' or 详细目录 like '%pic%' order by ip地址,被访问网站,时间

这么写,如果你的表时数据量比较大时,速度会很慢的,因为不可能用到索引,只能进行全表扫描

建议你把初访向的网站那一个关键词库,然后是关键词库里用like '内容%'之类来来用,就会用到索引

速度就会很快的,也就不会存在超时了
Andy__Huang 2005-01-10
  • 打赏
  • 举报
回复
把你like後面的內容放到一個表中,如把sex,game,women.........

然後用
select * into #aaa from sheet1$ where 被访问网站 in(select 被访问网站 from tb)

這樣試試
zengzhengliang 2005-01-10
  • 打赏
  • 举报
回复
含有or 还有 like 的执行效率都很低啊
你最好使每列都建立索引,
pbsql 2005-01-10
  • 打赏
  • 举报
回复
是因为那样的条件没法使用索引,必须扫描全表,所以也不能优化

另外如果log中记录较多也将大大降低效率

将超时时间设置为0(永不超时)
tigerjacky 2005-01-10
  • 打赏
  • 举报
回复
select * into #aaa from sheet1$ a
where exists(select * from #t where a.被访问网站 like s and a.详细目录 like '%xxx%' or a.详细目录 like '%pic%') ?
gengxl 2005-01-10
  • 打赏
  • 举报
回复
谢谢各位兄弟以及邹老大,现在把改进的情况说明一下,并希望各位能继续关注,讨论,我只能给出试验的结果,原因我还不能完全解释。
我首先根据邹老大的第二个建议,修改了此过程的第2部分,查询分析器中运行存储过程的时间从31秒将低倒28秒。(时间都是连续运行三次不变,应该又参考价值,环境是双p4至强,2g内存,scsi(10000转) raid5。)后来我自己发现一个书写的错误,改正后时间降低为22秒。
过程的第一部分:
select * into #aaa from sheet1$ where 被访问网站 like '%chat%' or 被访问网站 like '%sex%' or 被访问网站 like '%game%' or 被访问网站 like '%women%' or 被访问网站 like '%club%' or 被访问网站 like '%job%' or 被访问网站 like '%chinahr%' or 被访问网站 like '%book%' or 被访问网站 like '%love%' or 被访问网站 like '%xxx%' or 被访问网站 like '%pic%' or 详细目录 like '%xxx%' or 详细目录 like '%pic%' order by ip地址,被访问网站,时间

此语句where后比较了'被访问网站'(11次)和‘详细目录’(2次),如果只比较前者,并且用邹老大提供的第一个方法改写为
create table #t(s varchar(10))
insert #t select '%chat%'
union all select '%sex%'
union all select '%game%'
union all select '%women%'
union all select '%xxx%'
union all select '%book%'
union all select '%job%'
union all select '%chinahr%'
union all select '%club%'
union all select '%pic%'
union all select '%love%'

select * into #aaa from sheet1$ a
where exists(select * from #t where a.被访问网站 like s)
order by ip地址,被访问网站,时间

整个过程只需要9秒!!!!
可以看出like和or对速度的损害。但是用户要求必须要有对‘详细目录’的判断,所以这个好写法就不能采用了。
zjcxc 2005-01-10
  • 打赏
  • 举报
回复
--2.
select * into #bbb from #aaa a where (select count(*) from log where 被访问网站 = a.被访问网站 and ip地址=a.ip地址) > 15
drop table #aaa
select * from #bbb order by ip地址,被访问网站


--改为:

select a.* into #bbb from #aaa a,(select 被访问网站,ip地址 from log group by 被访问网站,ip地址 having count(*) > 15 )b
where a.被访问网站=b.被访问网站 and a.ip地址=b.ip地址
drop table #aaa
select * from #bbb order by ip地址,被访问网站
zjcxc 2005-01-10
  • 打赏
  • 举报
回复

--1.
select * into #aaa from sheet1$ where 被访问网站 like '%chat%' or 被访问网站 like '%sex%' or 被访问网站 like '%game%' or 被访问网站 like '%women%' or 被访问网站 like '%club%' or 被访问网站 like '%job%' or 被访问网站 like '%chinahr%' or 被访问网站 like '%book%' or 被访问网站 like '%love%' or 被访问网站 like '%xxx%' or 被访问网站 like '%pic%' or 详细目录 like '%xxx%' or 详细目录 like '%pic%' order by ip地址,被访问网站,时间

这个没有办法利用索引,因此效率低是正常的,可以试试用全文检索,全文检索配置参考
http://community.csdn.net/Expert/topic/3295/3295983.xml?temp=.1481592

也可以试试改用
create table #t(s varchar(10))
insert #t select '%chat%'
union all select '%sex%'
...
union all select '%pic%'

select * into #aaa from sheet1$ a
where exists(seelct * from #t where a.被访问网站 like s)
order by ip地址,被访问网站,时间

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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