c# stringbulider拼接字符串性能问题 太差了~

windstore 2010-01-09 06:17:51
我目前要实现批量插入数据库功能,所以采取的方法是,拼3000条然后插入库。用的stringbuilder,但是性能依然很差。插10万条记录居然要1个小时。怀疑是数据库的问题,然后把与数据库交互的代码去掉,只拼接字符串,依然很慢,才发现是用stringbulider拼接字符串耗时。 我想可能是内存占用过多了。


请问像这种大批量拼接数据库插入字符串的话,应该怎么做?用stringbuilder还慢,实在没辙了。。
...全文
827 57 打赏 收藏 转发到动态 举报
写回复
用AI写文章
57 条回复
切换为时间正序
请发表友善的回复…
发表回复
绿色夹克衫 2010-01-14
  • 打赏
  • 举报
回复
不知道TextBox tbResult这个参数有什么用,没用最好去掉。
LZ先试试这样是否也慢!

protected void MakeInsertSqlString(SMSEntity entity, TextBox tbResult)
{
sb.Append("Insert into ");
// sb.Append(entity.TableName);
sb.Append(" (linkid,mob,destmob,CONTENT,recvtime) Values ('");
// sb.Append(entity.linkid);
sb.Append("','");
// sb.Append(entity.mob);
sb.Append("','");
// sb.Append(entity.destmob);
sb.Append("','");
// sb.Append(entity.content);
sb.Append("','");
// sb.Append(entity.recvtime);
sb.Append("');");
count++;
}
[Quote=引用 55 楼 windstore 的回复:]
关键的性能问题就是在:MakeInsertSqlString 这个方法了。。

也许只能采用把sql写到.sql文件,然后执行了。。
[/Quote]
绿色夹克衫 2010-01-14
  • 打赏
  • 举报
回复
LZ应该再试试楼上提供的测试stringbulider性能的程序,看是否同样很慢。
也许是机器本身的什么问题!有什么输出操作或者控件Text赋值的地方,也会导致变慢。

别太武断的认为是stringbulider的问题,LS几位测试的数据远远高于10万量级,而执行效率都是秒级的,
应该说stringbulider的效率是很高的。应该逐句找到效率的瓶颈再做优化。

[Quote=引用 54 楼 windstore 的回复:]
谢谢大家的关注。。

  其实我测试的时候特意把插入数据库的语句注释掉了,也就是说在没有和数据库交互的情况下就很慢了。但是如果我把用stringbulider拼接sql的方法也注释掉,就很快了。。所以问题还是在用这个stringbulider的问题

[/Quote]
windstore 2010-01-14
  • 打赏
  • 举报
回复
关键的性能问题就是在:MakeInsertSqlString 这个方法了。。

也许只能采用把sql写到.sql文件,然后执行了。。
windstore 2010-01-14
  • 打赏
  • 举报
回复
谢谢大家的关注。。

其实我测试的时候特意把插入数据库的语句注释掉了,也就是说在没有和数据库交互的情况下就很慢了。但是如果我把用stringbulider拼接sql的方法也注释掉,就很快了。。所以问题还是在用这个stringbulider的问题
zhoujk 2010-01-11
  • 打赏
  • 举报
回复
一条一条的插入可能比拼接3000条然后一次性写入的效率要高,String 的操作是很慢的
编程有钱人了 2010-01-11
  • 打赏
  • 举报
回复
这么大的数据操作就不能考虑用StringBuilder对象了

直接用list<string> 都比上面的好
zuoming120 2010-01-11
  • 打赏
  • 举报
回复
[Quote=引用 51 楼 guyehanxinlei 的回复:]
这么大的数据操作就不能考虑用StringBuilder对象了.使用存储过程,批量语句执行等等.
[/Quote]
d
guyehanxinlei 2010-01-11
  • 打赏
  • 举报
回复
这么大的数据操作就不能考虑用StringBuilder对象了.使用存储过程,批量语句执行等等.
mbh0210 2010-01-11
  • 打赏
  • 举报
回复
你这个不是stringbulider性能的问题
而是网数据库插入数据比较慢,

尽量避免多次大开关闭数据库。
polarissky 2010-01-11
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 sdfkfkd 的回复:]
楼主使用
db.ExecuteNonQuery(sb.ToString());
来执行,应该是封装的方法,估计是SQLHELP吧

象这种大批量更新数据库
1、共用一个连接,避免每次打开关闭连接
2、启动事务
3、尽量一次执行多条语句,这点楼主做了


楼主可以再多贴些代码上来
[/Quote]
我赞同这个观点。
共用一个数据连接,构造一条语句,执行一次SQL语句。我也弄个过和楼主类似的东西,最多往数据库写入5000多条记录,耗时不到2秒。
huming_h 2010-01-11
  • 打赏
  • 举报
回复
每当使用StringBuilder 的时候都是
StringBuilder sb=new StringBuilder ();
感觉有点汗。。。。
gbb21 2010-01-11
  • 打赏
  • 举报
回复
[Quote=引用 41 楼 psps001 的回复:]
微软的整个.NET,本身就是一个性能较差的架构,只有等微软如优化了,特别是桌面程序的开发,几乎没有那个企业敢用!!

[/Quote]

哈哈哈哈哈哈哈
huangzhe10 2010-01-10
  • 打赏
  • 举报
回复
StringBuilder比string性能好多了吧!!
skyaspnet 2010-01-10
  • 打赏
  • 举报
回复
private StringBuilder sb = new StringBuilder(SBCAPACITY);


这句改成

private static StringBuilder sb = new StringBuilder(SBCAPACITY);

试一下
skyaspnet 2010-01-10
  • 打赏
  • 举报
回复
基本上可以肯定不是stringbuilder的问题, 测试过20000000条字符连接, 不到十秒,

还是数据库操作部分的代码需要改进, 可以把数据库部分的代码贴出来看一下
flyerwing 2010-01-10
  • 打赏
  • 举报
回复
stringbuilder比string拼节性能好的不只是一点点
可以做程序验证下!!!
内存省的不只是一点点
leafold 2010-01-10
  • 打赏
  • 举报
回复
字符串前面加@""
leafold 2010-01-10
  • 打赏
  • 举报
回复
写到脚本文件MyScript.sql中
如果数据库采用信任链接:
Process.Start("sqlcmd -E -i -S server_name C:\MyFolder\MyScript.sql -o C:\MyFolder\MyOutput.txt");
否则
Process.Start("sqlcmd -U login_id -P password -i -S server_name C:\MyFolder\MyScript.sql -o C:\MyFolder\MyOutput.txt");
mjp1234airen4385 2010-01-10
  • 打赏
  • 举报
回复
建议:把你的文件按照数据库需要的格式,写成一个文件。让数据库去处理,还是很快的。
Thr21ough 2010-01-10
  • 打赏
  • 举报
回复
up~
加载更多回复(37)

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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