楼主: itsyh

[求助]如何以最快的速度插入数据?

[复制链接]
论坛徽章:
3
ITPUB元老
日期:2005-02-28 12:57:00授权会员
日期:2005-10-30 17:05:33会员2006贡献徽章
日期:2006-04-17 13:46:34
21#
发表于 2003-7-10 17:04 | 只看该作者
能够直接写数据库,
为何还要先IO文件,然后再从文件导入?
一步做到的事情分成两步做岂不是耗费时间?

写IO的时间不一定比写数据库的时间少!

使用道具 举报

回复
论坛徽章:
1
授权会员
日期:2005-10-30 17:05:33
22#
 楼主| 发表于 2003-7-10 17:10 | 只看该作者
写IO的时间不一定比写数据库的时间少!
——我的经验是写IO的时间一定比写数据库的时间少,因为写到数据库中是需要
验证数据的,而写到IO中是少了很多步骤的说,可以说它们俩不是一个数量级的,
不知道我理解对否?

使用道具 举报

回复
论坛徽章:
1
授权会员
日期:2005-10-30 17:05:33
23#
 楼主| 发表于 2003-7-10 17:15 | 只看该作者
最初由 zhuzhichao 发布
[B]itsyh,如果你能用delphi在一秒钟之内在一个txt文件中写入一万笔记录,那么我立即拜你为师,毫无虚言!
要知道用C也无法达到这样的效率。
[/B]

测试完毕,如果写一万笔没有经过运算的文本的话,大概是0。07秒就能插入完毕:



  1.     Label1.Caption := IntToStr(GetTickCount);

  2.     FileHandle := FileCreate(SaveDialog1.FileName);
  3.     { Write out the number of rows and columns in the grid. }

  4.     for I := 1 to 10000 do
  5.     begin
  6.       tempStr2 := 'aaaaa';
  7.       StringLen := Length(tempStr2);
  8.       FileWrite(FileHandle, StringLen, SizeOf(StringLen));
  9.       FileWrite(FileHandle,'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'+#13, Length('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'+#13));
  10.     end;
  11.     FileClose(FileHandle);
  12.   end;
  13.   Label2.Caption := IntToStr(GetTickCount);
  14.   Label3.Caption := FloatToStr((StrToInt(Label2.Caption) - StrToInt(Label1.Caption)) / 1000);

复制代码

使用道具 举报

回复
论坛徽章:
3
ITPUB元老
日期:2005-02-28 12:57:00授权会员
日期:2005-10-30 17:05:33会员2006贡献徽章
日期:2006-04-17 13:46:34
24#
发表于 2003-7-10 17:22 | 只看该作者
我们以前做过文件数据库的,也就是用B+树做自己的数据库系统,是以文件格式存放。
那个数据库系统的效率和主流的RDBMS不可同日而语。
因为很多的RDBMS都有优化的动作在内。

就算是写一个简单的txt,那么消耗的时间也不会比写关系型数据库高出几个数量级。
而用bcp将txt导入也需要耗费时间,两个步骤加在一起的时间依本人的拙见一定是会比直接写数据库时间长的,因为中间还有一个程序交互动作的时间。

[COLOR =red]与其自己造轮子,不如使用现有轮子[/COLOR]
项目的时间永远是宝贵的。

使用道具 举报

回复
论坛徽章:
1
授权会员
日期:2005-10-30 17:05:33
25#
 楼主| 发表于 2003-7-10 17:54 | 只看该作者
最初由 zhuzhichao 发布
[B]
就算是写一个简单的txt,那么消耗的时间也不会比写关系型数据库高出几个数量级。
[/B]


按照我的理解,单纯的写到一个txt文件中速度肯定远比分条写到数据库要快得多,我刚才写了一个程序也证明了我得想法,因为偶哪个txt才500K,对应于机器来说是ms级的超级即能写入完毕。

而对于插入数据到数据库,每插入一条记录数据库同时要做检查,更新系统表等等操作。。。

所以开销一定比写到文件要大得多,所以,为了加快速度,可以想办法减少这些开销,就能大大节约时间,
不知道我的想法对否?

使用道具 举报

回复
论坛徽章:
1
授权会员
日期:2005-10-30 17:05:33
26#
 楼主| 发表于 2003-7-10 17:56 | 只看该作者
很高兴能让 zhuzhichao 和  zhuzhichao

  抽出这么多时间来和我讨论这个topic。

我想问一下,如何在程序里面控制把我写好的txt导入到数据库啊?

多谢!

使用道具 举报

回复
论坛徽章:
1
授权会员
日期:2005-10-30 17:05:33
27#
 楼主| 发表于 2003-7-10 18:12 | 只看该作者
这个sql语句写得非常精巧啊!在我的机器上执行需要11秒:)
一共插入了16384行记录。

但是这些都是数据库的表间操作的,没有与客户端进行交互
这个速度只能作为参考,不能应用到程序中。


  1. declare @i int
  2. set @i = 14
  3. INSERT INTO testtable (col1, col2,col3) VALUES (''00:00:00'', 12345678.901, newid())
  4. while (@i>0)
  5. begin
  6. insert into testtable(col1,col2,col3)
  7. select col1,col2,newid() from testtable
  8. set @i = @i - 1
  9. end
复制代码




  1. (所影响的行数为 1 行)


  2. (所影响的行数为 1 行)


  3. (所影响的行数为 2 行)


  4. (所影响的行数为 4 行)


  5. (所影响的行数为 8 行)


  6. (所影响的行数为 16 行)


  7. (所影响的行数为 32 行)


  8. (所影响的行数为 64 行)


  9. (所影响的行数为 128 行)


  10. (所影响的行数为 256 行)


  11. (所影响的行数为 512 行)


  12. (所影响的行数为 1024 行)


  13. (所影响的行数为 2048 行)


  14. (所影响的行数为 4096 行)


  15. (所影响的行数为 8192 行)


复制代码

使用道具 举报

回复
论坛徽章:
4
ITPUB元老
日期:2007-07-12 21:18:51授权会员
日期:2007-07-12 21:19:26ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512012新春纪念徽章
日期:2012-01-04 11:49:54
28#
发表于 2003-7-10 18:42 | 只看该作者
其实 讨论了这么多 我大致清楚了 楼主的说法和炎龙骑士的意思。

楼主想尽快向数据库中导数据,一般来说,你的数据产生的多快,几乎就能够以多快 的速度写到mssql 中,比如,你在一个终端上1秒采集1000行,那么这个数据应该可以在1到两秒的时间内完成向数据库的提交。当然我假定你不可能一直这样,否则你不会用 mssql 而改用实时数据库

向数据库直接提交数据,整体速度肯定比分步提交快。也不一定要 bcp
我开始只是说如果使用bcp单位时间的数据加载速度可能是最快的

所以 建议你直接使用mssql插数据,如果出现问题,再改进程序 或方法也可以。只要业务逻辑
没有变化,应该改动不大

使用道具 举报

回复
论坛徽章:
1
授权会员
日期:2005-10-30 17:05:33
29#
 楼主| 发表于 2003-7-10 20:06 | 只看该作者
其实 讨论了这么多 我大致清楚了 楼主的说法和炎龙骑士的意思。

楼主想尽快向数据库中导数据,一般来说,你的数据产生的多快,几乎就能够以多快 的速度写到mssql 中,比如,你在一个终端上1秒采集1000行,那么这个数据应该可以在1到两秒的时间内完成向数据库的提交。当然我假定你不可能一直这样,否则你不会用 mssql 而改用实时数据库

——呵呵,我就是很郁闷,我的程序要求24小时要这么高密度的采数:(晕倒:(不知道你对实时数据库熟悉么?有没有什么物廉价美的产品推荐给我几个?


其实不用1-2秒这么高速度,当然是越快越好了:)呵呵,现在对我来说,小于10秒就是梦想了,呵呵

向数据库直接提交数据,整体速度肯定比分步提交快。也不一定要 bcp
我开始只是说如果使用bcp单位时间的数据加载速度可能是最快的

——好啊,只是不知道如何通过程序来控制啊?能给我个Demo学学么?3Q!!

所以 建议你直接使用mssql插数据,如果出现问题,再改进程序 或方法也可以。只要业务逻辑
没有变化,应该改动不大

——不知道这个是如何理解?不太懂,我需要实时往数据库插数据的哦,
如果按照你的方法是否需要找个人手工才能插入数据啊?

使用道具 举报

回复
论坛徽章:
20
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:18马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:11:18
30#
发表于 2003-7-10 20:15 | 只看该作者
有没有注意到插入日志的时间,如果使用bcp的话可以避免插入不需要的日志.要知道如果真的在业务系统上实时的倒数据库的,日志文件也是必须考虑的因素.

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表