关于存储过程执行速度的问题

AMinfo 2013-12-28 05:30:01
之前的发贴求助的内容:
http://bbs.csdn.net/topics/390680794

现测试的MainTable表中只有2000条记录,SubTable中有200万条记录

1、原先用外部VBS编写查询
sql = "select id from SubTable Where Description like '%" & Title & "%' order by id"
rs.open sql,conn,1,1
然后再通过rs.movenext一条一条记录SubTable的id号后再存到MainTable的SubId字段中

平均每条记录的时间在1秒左右,2000条记录也就是2000秒,大概要33分钟即可完成,由于嫌慢,所以求助网友用了第2种方法;

2、现在用http://bbs.csdn.net/topics/390680794贴中的方法,存储过程执行后已经过了40分钟,还是显示“正在执行查询...”,这种方法速度更慢,而且如果中途不小心中断就得重新来过。

请问有没有办法优化加快速度?
...全文
200 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 17 楼 AMinfo 的回复:
试过了,建议索引后,速度还是慢,平均每分钟才能处理5条记录左右。
看来,在vbs程序中循环处理数据,要比在sql server中处理,效率还高。 实战不行,可以考虑在 SubTable 表上的Description字段上建个全文索引,这样应该能从本质上提升速度,改善一般like '%xxx%'无法使用索引的问题
AMinfo 2013-12-29
  • 打赏
  • 举报
回复
非常感谢您!
AMinfo 2013-12-29
  • 打赏
  • 举报
回复
试过了,建议索引后,速度还是慢,平均每分钟才能处理5条记录左右。
AMinfo 2013-12-28
  • 打赏
  • 举报
回复
好的,谢谢!我试试看。
  • 打赏
  • 举报
回复
引用 14 楼 AMinfo 的回复:
由于记录有200万多条,给Description建一个索引会不会增加数据库容量,影响其他方面的?
如果,这个200万条的表,有很多字段,那么可以考虑建个索引,可能会对insert 操作会有轻微的影响,不过影响不大的。
AMinfo 2013-12-28
  • 打赏
  • 举报
回复
由于记录有200万多条,给Description建一个索引会不会增加数据库容量,影响其他方面的?
  • 打赏
  • 举报
回复
引用 11 楼 AMinfo 的回复:
刚才那个存储过程终于执行完成了,用了02:29:00 (2377 行受影响)
对了 你的SubTable表,一共几个字段,都占用多少字节,如果字段多,可以考虑给 description建一个索引
  • 打赏
  • 举报
回复
引用 11 楼 AMinfo 的回复:
刚才那个存储过程终于执行完成了,用了02:29:00 (2377 行受影响)
看来,主要的开销在这个SubTable表的聚集索引扫描上,84%的开销。
AMinfo 2013-12-28
  • 打赏
  • 举报
回复


刚才那个存储过程终于执行完成了,用了02:29:00
(2377 行受影响)
  • 打赏
  • 举报
回复
引用 6 楼 AMinfo 的回复:
SubTable表中的Description是不规则的字符,有中文也有英文也有数字,nvarchar类型,长度150 MainTable表中的Title也是不规则的字符,有中文也有英文也有数字,nvarchar类型,长度50
能了 能显示一下执行计划不,就是一个图,看看里面开销最大的是那一部分?
  • 打赏
  • 举报
回复
引用 6 楼 AMinfo 的回复:
SubTable表中的Description是不规则的字符,有中文也有英文也有数字,nvarchar类型,长度150 MainTable表中的Title也是不规则的字符,有中文也有英文也有数字,nvarchar类型,长度50
这样就不能采用分拆的方法了
AMinfo 2013-12-28
  • 打赏
  • 举报
回复
SubTable表的记录有200万多条,非常多,目前通过原来的第1种方法在MainTable有6万条记录的情况下,大概需要17个小时完成。但是由于每天都要做这类的工作,所以每天都得花17个小时运行,CPU占用率特别高。 本来是想如果通过内部存储过程来执行可能会减少时间。
  • 打赏
  • 举报
回复
哦 ,对了,是那个显示估计的执行计划,把执行计划贴出来看看:
AMinfo 2013-12-28
  • 打赏
  • 举报
回复
SubTable表中的Description是不规则的字符,有中文也有英文也有数字,nvarchar类型,长度150 MainTable表中的Title也是不规则的字符,有中文也有英文也有数字,nvarchar类型,长度50
  • 打赏
  • 举报
回复
引用 3 楼 AMinfo 的回复:
update语句如下: update [MainDataBase].[dbo].[MainTable] set SubId =cast([MainTable].[dbo].[MainTable].SubId as nvarchar) + (select ','+ CAST(t.ID as nvarchar) from [SubDataBase].[dbo].[SubTable] t where t.Description like '%'+[MainDataBase].[dbo].[MainTable].Title+'%' for xml path('') ) Where SubId = '0'
对了,这种情况,关键是是like '%xxx%',用不上索引,所以才会这么慢,能不能反向,就是把 SubTable表中的Description 给拆分成 title,这个可行不?
AMinfo 2013-12-28
  • 打赏
  • 举报
回复
引用 2 楼 yupeigu 的回复:
能把第二种方法,执行的update语句的执行计划,贴出来看一下不
update [MainDataBase].[dbo].[MainTable] set SubId =cast([MainDataBase].[dbo].[MainTable].SubId as nvarchar) + (select ','+ CAST(t.ID as nvarchar) from [SubDataBase].[dbo].[SubTable] t where t.Description like '%'+[MainDataBase].[dbo].[MainTable].Title+'%' for xml path('') ) Where SubId = '0' MainTable中有2000条记录,SubTable中有200万条记录,现在已经执行了2个多小时,但还未结束。 如果按原先的方法,在33分钟左右即可完成。
AMinfo 2013-12-28
  • 打赏
  • 举报
回复
update语句如下: update [MainDataBase].[dbo].[MainTable] set SubId =cast([MainTable].[dbo].[MainTable].SubId as nvarchar) + (select ','+ CAST(t.ID as nvarchar) from [SubDataBase].[dbo].[SubTable] t where t.Description like '%'+[MainDataBase].[dbo].[MainTable].Title+'%' for xml path('') ) Where SubId = '0'
  • 打赏
  • 举报
回复
能把第二种方法,执行的update语句的执行计划,贴出来看一下不
AMinfo 2013-12-28
  • 打赏
  • 举报
回复
补充一下: 用第1种方法时,CPU占用率会很高,速度每秒1条记录; 用第2种方法时,CPU占用率很低,但速度更慢。

34,576

社区成员

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

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