ADO.NET 老牛拉车??

Ji秋风 2006-05-01 04:58:50
最近饶有兴致的修改了一个小程序,结果出乎以外。
程序业务逻辑比较简单,把这个文本文件中数据更新到数据库中,中间还包含了一些字符串解析、数据计算等过程。这个文本文件大小为200多M,记录条数为70多万条。
原来的程序是用c++/MFC开发的,数据库连接采用odbc方式。
伪代码大致如下:
先SQLPrepare创建更新语句,SQLBindParameter绑定参数,SQLExecute执行语句。
这样处理下来一般10分钟左右可以处理完成。

现在推出.net 2.0,在VS.net 2005用C#重新编写了以上小程序。
界面是弄的华丽了。但是效率老牛一样,1000条都没更新完成已经耗去我1分多钟。
我去掉数据库更新部分代码,对于文件及字符串处理,效率还可以,为什么以下代码效率会如此低下?
现在是每条记录都调用如下函数,sql语句根据参数生成。

SqlCommand command = null;

try
{
command = conn.CreateCommand();
command.CommandText = "...";
command.CommandType = CommandType.Text;

return command.ExecuteNonQuery();
}
catch (SqlException e)
{
//...
}


是否有啥好方法能够提高执行效率?

...全文
5596 144 打赏 收藏 转发到动态 举报
写回复
用AI写文章
144 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ji秋风 2006-05-22
  • 打赏
  • 举报
回复
改进后的程序28分钟处理完成。
由于我测试用的是P41.8 512M PC机,在服务器上可能速度还可以有所提高。
Ji秋风 2006-05-22
  • 打赏
  • 举报
回复

再大致介绍一下我的业务逻辑处理过程:
1、从文本读取记录、分割字符串。
2、根据col1字段,判断该记录是否需要更新到数据库中。
3、换算col2字段的值,把col2更新到数据库表的Rixx字段上。xx表示day的两位表示。
4、若记录不存在,则插入记录。

目前,以从两个方面提高了更新速度。
1、在测试数据库表上,在更新条件字段上忘了创建索引。万分惭愧!
2、改用参数形式,也提高了更新速度。
Ji秋风 2006-05-22
  • 打赏
  • 举报
回复
to
jinyang2005(jinyangnet)
我用.net导入数据库700多万条(95M)只用40多秒,用BULK INSERT,建表,导入数据,设索引一次完成的。没有做什么计算。
导出文本文件250万条左右15-20秒左右,没有尝试过一次导出更多的,不过我觉得也不会太慢。经常操作的数据量在50--300万也从来没有超过一分钟的。

这个速度好像有点神了~~
说说服务器配置吧,这个速度比DTS都快了很多。
zhuangyan2004 2006-05-19
  • 打赏
  • 举报
回复
mark一下,我的.net是flashelf教的,虽然很久没有用了,但我觉得他的说法是正确的.
WE9981 2006-05-19
  • 打赏
  • 举报
回复
也正在考虑处理类似的问题
Ji秋风 2006-05-19
  • 打赏
  • 举报
回复
忙了一阵子,终于回来了!

补充一点:我的程序主要还是去更新记录,在记录不存在情况才插入,不过原因都一样。

我也觉得问题可能出在SqlCommand创建耗费太多资源。
我按照大家的方式,先试试看~~
huangguangdou 2006-05-19
  • 打赏
  • 举报
回复
凑凑热闹
哈哈。。。。。
ilovejolly 2006-05-19
  • 打赏
  • 举报
回复
C#效率本来就不高啊,数据量大慢点也是正常的

我觉得Knight94(愚翁)说的很有道理
chensan 2006-05-19
  • 打赏
  • 举报
回复
同意akumas和FlashElf说的,我也做过类似的工作,txt也是读一行做计算然后导入。
导入的sql至少也要修改成存储过程吧。
huayinydm 2006-05-16
  • 打赏
  • 举报
回复
RP问题:)
cbo5 2006-05-16
  • 打赏
  • 举报
回复
只不过是楼主的方法不对罢了,ADO.NET的效率其实很高的。
70w条记录,70w次循环,70w次的资源分配,70w次数据库交互(关键就在这里),你说能不慢吗?

你应该使用SqlDataAdapter,一次写入1000条(根据记录大小,可适当加大该值)。
LoveCherry 2006-05-11
  • 打赏
  • 举报
回复
每次重新生成对象或者说重新打开关闭连接和一次性生成对象关闭打开连接的差异并没有想想的这么大,可能因为1、CPU内存运算和磁盘操作不是一个数量级别2、有连接池了,大概差10%左右,70M的数据读取出来生成datatable我觉得有点夸张,我没有试过,试了下SqlBulkCopy基本是带参数执行SqlCommand性能的5倍左右,而且还没有插入触发器的情况下。
卧_槽 2006-05-11
  • 打赏
  • 举报
回复
楼主的机器中毒了吧,我这里对网络扫描兼数据插入,每天都要跑40-60w条纪录的样子。如果网速不慢的话,一个小时也就跑完了,也是这么插数据库的。
如果单纯读文本插入数据库10w条也就3分钟的事情,哪有那么慢?

结论,楼主的机器中毒了
LoveCherry 2006-05-11
  • 打赏
  • 举报
回复
楼主要把你的环境和你的操作步骤具体说一下,在我这里就算你贴出的代码来做1万条也用不了20秒,而且是数据库已经百万记录
Frankcheng 2006-05-11
  • 打赏
  • 举报
回复
“使用ado.net肯定会比odbc慢,这是必然的。”
纯属谬论!!!!!!!!!!!
效率低有很多原因关键是你懂怎么用吗?
realwolf 2006-05-11
  • 打赏
  • 举报
回复
太长了。
楼主的程序没有问题,是不是其它地方出现问题。
我的数据库是oracle,更新1000万条记录也没什么问题。程序是一样的。
saucer 2006-05-10
  • 打赏
  • 举报
回复
把你的编码以及样品数据贴出来,同时参考ADO.NET 2.0中的bulk copy/batch update功能

http://www.c-sharpcorner.com/Code/2004/June/AdoNet2.0Features.asp

http://www.dotnetbips.com/articles/displayarticle.aspx?id=487

对你的情形,大概sqlbulkcopy比较合适
http://msdn2.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx
Kshatriya 2006-05-10
  • 打赏
  • 举报
回复
用DataSet和DataTable来完成数据操作肯定没有直接写SqlCommand快,因为数据适配器本身也是用SqlCommand来完成的,不过就是封装了一下.
flybeyondhj 2006-05-10
  • 打赏
  • 举报
回复
继续呀!
sxtyzgd 2006-05-10
  • 打赏
  • 举报
回复
对测试时每条记录完全一样的同志们,这样的测试没有意义。
加载更多回复(123)

110,538

社区成员

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

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

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