求救达人帮解效率难题!

tulipcaicai 2010-03-19 11:07:41
各位达人,请教一下提高sql存储过程效率的问题:
我要完成一个从应用程序里每1000MS运行一次存储过程,这过程用于分割字符串并写到相对应表里的工作。
有A1到A100个表,数据量是100段,每段由“0.00000,0.00000,0.00000,0.00000,0.00000”组成,分割的方式是每段写入一个表内的5个字段。现在的问题是MSSQL完成这个数据量在1秒以内,但175表和数据段就得用超过1秒的时间了,各位达人看看我写的过程有没有可提高的方地或是更好的思路呢(分割字符最好在MSSQL内完成)。
另外这个数据量远远达不到我的需求,至少要500张表和数据段在700MS内完成分割字符串及写入相对应表的工作。

如果不能给一个最优范围的解决办法吧,比如多少张表及用时。

附:存储过程

SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO




ALTER PROCEDURE PROC_MU
(@STR1 VARCHAR(8000), @STR2 VARCHAR(8000), @FIRSTNAME VARCHAR(50),@COLNAME1 VARCHAR(50),@COLNAME2 VARCHAR(50),@COLNAME3 VARCHAR(50),@COLNAME4 VARCHAR(50))
AS
BEGIN
DECLARE @TBNAME1 VARCHAR(50)
DECLARE @TBNAME2 VARCHAR(50)
DECLARE @TBNAME3 VARCHAR(50)
DECLARE @TBNAME4 VARCHAR(50)
DECLARE @TBNAME5 VARCHAR(50)
--SELECT @STR='1,2,3',@FIRSTNAME='A',@COLNAME='COL1'
--BEGIN INSERT
SELECT @STR1=RTRIM(@STR1)+','
SELECT @STR2=RTRIM(@STR2)+','
WHILE CHARINDEX(',',@STR1)>0
BEGIN
SELECT @TBNAME1=LEFT(@STR1,CHARINDEX(',',@STR1)-1),@STR1=STUFF(@STR1,1,CHARINDEX(',',@STR1),'')
SELECT @TBNAME2=LEFT(@STR2,CHARINDEX(',',@STR2)-1),@STR2=STUFF(@STR2,1,CHARINDEX(',',@STR2),'')
SELECT @TBNAME3=LEFT(@STR2,CHARINDEX(',',@STR2)-1),@STR2=STUFF(@STR2,1,CHARINDEX(',',@STR2),'')
SELECT @TBNAME4=LEFT(@STR2,CHARINDEX(',',@STR2)-1),@STR2=STUFF(@STR2,1,CHARINDEX(',',@STR2),'')
SELECT @TBNAME5=LEFT(@STR2,CHARINDEX(',',@STR2)-1),@STR2=STUFF(@STR2,1,CHARINDEX(',',@STR2),'')
EXEC('INSERT INTO '+@FIRSTNAME+@TBNAME1+'('+@COLNAME1+','+@COLNAME2+','+@COLNAME3+','+@COLNAME4+') SELECT '''+@TBNAME2+''', '''+@TBNAME3+''', '''+@TBNAME4+''', '''+@TBNAME5+'''')
END
END

GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
...全文
131 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
tulipcaicai 2010-03-21
  • 打赏
  • 举报
回复
问题解决了,做一个缓存表,再做一个游标,从缓存表里逐条分割字符串,再写入其它表。经测试效果不错,8000节字长度,1秒写入一次,分割再写入表用时大约用150MS。
谢谢各位啦,结帐!
wbaige 2010-03-20
  • 打赏
  • 举报
回复
虽然没看明白楼主的意思,但还是顶一下
tulipcaicai 2010-03-19
  • 打赏
  • 举报
回复
我给存储过程加了一些注释,希望大家能帮优化一下。


SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO




ALTER PROCEDURE PROC_MU
(@STR1 VARCHAR(8000), @STR2 VARCHAR(8000), @FIRSTNAME VARCHAR(50),@COLNAME1 VARCHAR(50),@COLNAME2 VARCHAR(50),@COLNAME3 VARCHAR(50),@COLNAME4 VARCHAR(50))
AS
BEGIN
DECLARE @TBNAME1 VARCHAR(50) --用于变动表名
DECLARE @TBNAME2 VARCHAR(50) --第1个字段插入的值
DECLARE @TBNAME3 VARCHAR(50) --第2个字段插入的值
DECLARE @TBNAME4 VARCHAR(50) --第3个字段插入的值
DECLARE @TBNAME5 VARCHAR(50) --第4个字段插入的值
DECLARE @TBNAME6 VARCHAR(50) --第5个字段插入的值

--SELECT @STR='1,2,3',@FIRSTNAME='A',@COLNAME='COL1'
--BEGIN INSERT
SELECT @STR1=RTRIM(@STR1)+',' --给SRT1赋初值
SELECT @STR2=RTRIM(@STR2)+',' --给SRT1赋初值
WHILE CHARINDEX(',',@STR1)>0
BEGIN
SELECT @TBNAME1=LEFT(@STR1,CHARINDEX(',',@STR1)-1),@STR1=STUFF(@STR1,1,CHARINDEX(',',@STR1),'') --给变量的表名赋值,@STR1分割一次后,再赋值
SELECT @TBNAME2=LEFT(@STR2,CHARINDEX(',',@STR2)-1),@STR2=STUFF(@STR2,1,CHARINDEX(',',@STR2),'') --给要插入的第1个字段赋值,@STR2分割一次后,再赋值
SELECT @TBNAME3=LEFT(@STR2,CHARINDEX(',',@STR2)-1),@STR2=STUFF(@STR2,1,CHARINDEX(',',@STR2),'') --给要插入的第2个字段赋值,@STR2分割一次后,再赋值
SELECT @TBNAME4=LEFT(@STR2,CHARINDEX(',',@STR2)-1),@STR2=STUFF(@STR2,1,CHARINDEX(',',@STR2),'') --给要插入的第3个字段赋值,@STR2分割一次后,再赋值
SELECT @TBNAME5=LEFT(@STR2,CHARINDEX(',',@STR2)-1),@STR2=STUFF(@STR2,1,CHARINDEX(',',@STR2),'') ---给要插入的第4个字段赋值,@STR2分割一次后,再赋值
@TBNAME6=LEFT(@STR2,CHARINDEX(',',@STR2)-1),@STR2=STUFF(@STR2,1,CHARINDEX(',',@STR2),'') ---给要插入的第5个字段赋值,@STR2分割一次后,再赋值
EXEC('INSERT INTO '+@FIRSTNAME+@TBNAME1+'('+@COLNAME1+','+@COLNAME2+','+@COLNAME3+','+@COLNAME4+') SELECT '''+@TBNAME2+''', '''+@TBNAME3+''', '''+@TBNAME4+''', '''+@TBNAME5+''', '''+@TBNAME6+'''') --向相应的表内写入值
END
END

GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
tulipcaicai 2010-03-19
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ldslove 的回复:]

引用楼主 tulipcaicai 的回复:
各位达人,请教一下提高sql存储过程效率的问题:
我要完成一个从应用程序里每1000MS运行一次存储过程,这过程用于分割字符串并写到相对应表里的工作。
有A1到A100个表,数据量是100段,每段由“0.00000,0.00000,0.00000,0.00000,0.00000”组成,分割的方式是每段写入一个表内的5个字段。现在的问题是MSSQL……
[/Quote]

您的意思是把应用程序发来的数据先存到一张表里,然后在让MSSQL逐条去分割,直致完成一次任务以后再分割下一条是么?
chuifengde 2010-03-19
  • 打赏
  • 举报
回复
要从整个业务流程来分析,光从这个存储过程估计是达不到你的要求,分析500个表还要拆字符串还要插入表 700MS难作到
dawugui 2010-03-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 tulipcaicai 的回复:]
各位金牌达人,我真的没有救了么?
[/Quote]
不是没救,是看懂你的东西太费时间了.
tulipcaicai 2010-03-19
  • 打赏
  • 举报
回复
各位金牌达人,我真的没有救了么?
东那个升 2010-03-19
  • 打赏
  • 举报
回复
[Quote=引用楼主 tulipcaicai 的回复:]
各位达人,请教一下提高sql存储过程效率的问题:
我要完成一个从应用程序里每1000MS运行一次存储过程,这过程用于分割字符串并写到相对应表里的工作。
有A1到A100个表,数据量是100段,每段由“0.00000,0.00000,0.00000,0.00000,0.00000”组成,分割的方式是每段写入一个表内的5个字段。现在的问题是MSSQL完成这个数据量在1秒以内,但175表和数据段就得……
[/Quote]
建议楼主先把字符串保存下来,然后在通过这个SP定时执行表中的数据
永生天地 2010-03-19
  • 打赏
  • 举报
回复
记录,学习
--小F-- 2010-03-19
  • 打赏
  • 举报
回复
看来得考虑分区表了 你这个以MS级的来做 这么多字段 太强悍了
东那个升 2010-03-19
  • 打赏
  • 举报
回复
上次好像有人问过。。。。。
Mr_Nice 2010-03-19
  • 打赏
  • 举报
回复
MS级别,还要处理2500个表的数据拆分?

不懂,帮顶。。。关注!!!
dawugui 2010-03-19
  • 打赏
  • 举报
回复
这个得有情小P梁出场了.
ycj80 2010-03-19
  • 打赏
  • 举报
回复

--帮你加个SQL code 方便大家,
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO




ALTER PROCEDURE PROC_MU
(@STR1 VARCHAR(8000), @STR2 VARCHAR(8000), @FIRSTNAME VARCHAR(50),@COLNAME1 VARCHAR(50),@COLNAME2 VARCHAR(50),@COLNAME3 VARCHAR(50),@COLNAME4 VARCHAR(50))
AS
BEGIN
DECLARE @TBNAME1 VARCHAR(50) --用于变动表名
DECLARE @TBNAME2 VARCHAR(50) --第1个字段插入的值
DECLARE @TBNAME3 VARCHAR(50) --第2个字段插入的值
DECLARE @TBNAME4 VARCHAR(50) --第3个字段插入的值
DECLARE @TBNAME5 VARCHAR(50) --第4个字段插入的值
DECLARE @TBNAME6 VARCHAR(50) --第5个字段插入的值

--SELECT @STR='1,2,3',@FIRSTNAME='A',@COLNAME='COL1'
--BEGIN INSERT
SELECT @STR1=RTRIM(@STR1)+',' --给SRT1赋初值
SELECT @STR2=RTRIM(@STR2)+',' --给SRT1赋初值
WHILE CHARINDEX(',',@STR1)>0
BEGIN
SELECT @TBNAME1=LEFT(@STR1,CHARINDEX(',',@STR1)-1),@STR1=STUFF(@STR1,1,CHARINDEX(',',@STR1),'') --给变量的表名赋值,@STR1分割一次后,再赋值
SELECT @TBNAME2=LEFT(@STR2,CHARINDEX(',',@STR2)-1),@STR2=STUFF(@STR2,1,CHARINDEX(',',@STR2),'') --给要插入的第1个字段赋值,@STR2分割一次后,再赋值
SELECT @TBNAME3=LEFT(@STR2,CHARINDEX(',',@STR2)-1),@STR2=STUFF(@STR2,1,CHARINDEX(',',@STR2),'') --给要插入的第2个字段赋值,@STR2分割一次后,再赋值
SELECT @TBNAME4=LEFT(@STR2,CHARINDEX(',',@STR2)-1),@STR2=STUFF(@STR2,1,CHARINDEX(',',@STR2),'') --给要插入的第3个字段赋值,@STR2分割一次后,再赋值
SELECT @TBNAME5=LEFT(@STR2,CHARINDEX(',',@STR2)-1),@STR2=STUFF(@STR2,1,CHARINDEX(',',@STR2),'') ---给要插入的第4个字段赋值,@STR2分割一次后,再赋值
@TBNAME6=LEFT(@STR2,CHARINDEX(',',@STR2)-1),@STR2=STUFF(@STR2,1,CHARINDEX(',',@STR2),'') ---给要插入的第5个字段赋值,@STR2分割一次后,再赋值
EXEC('INSERT INTO '+@FIRSTNAME+@TBNAME1+'('+@COLNAME1+','+@COLNAME2+','+@COLNAME3+','+@COLNAME4+') SELECT '''+@TBNAME2+''', '''+@TBNAME3+''', '''+@TBNAME4+''', '''+@TBNAME5+''', '''+@TBNAME6+'''') --向相应的表内写入值
END
END

GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

hongpengdage 2010-03-19
  • 打赏
  • 举报
回复
学习了, 嘿嘿
tulipcaicai 2010-03-19
  • 打赏
  • 举报
回复
没有人关注了么?

27,579

社区成员

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

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