因为我出学校后做的第一个系统基本就是个mis系统,所有功能几乎全部依赖于数据库,所以即使后来我做了近两年的C程序员,也一真觉得数据库挺快的(指大量update或其它使用sql的操作),虽然我也知道用C写出来处理数据库数据再入库可能比sql来得快但具体快多少,并没一个很好的认识。
但今天遇到的事情却让我真正感觉到其它数据库再强大也有其局限性,如果程序实现得好的话数据处理性能能在数据库的100倍之上。
先说一下运行环境:
IBM p690
系统:aix 5L
数据库:ora 8i
内存:8G Cpu多少个不大清楚。
存储大概1T左右。
处理一张600多万记录的话单表,要求根据号码字段的前几位去另一个9万记录的区号表取得区号并更新进去。。
起初写了个sql语句:
update ticket a set
ESN=(select distinct AREA_CODE from area_code b where b.head=substr(a.msisdn,1,7));(其实我对这条语句很没信心,一时间忘记update还有什么别的写法,有可能是我这语句写错了,如果真是这样那么本文就没意义了。请高手指点)
运行了2个多少时没结果,看一下oracle管理器中的session说估计还要300多小时,赫赫,不会吧。。。我很急啊(用户要数据,我明天要回家)。。。又试着加了一个条件只处理10000条数据结果说要2小时。。
没办法,动手写程序吧。
写了个pro*c有以下处理过程:
加载区号表到二叉树中
取话单表中的数据,到区号表取得区号,更新回数据库(每1万条提交一次。)
结果多少时间????
5分钟....
加上我写程序15分钟,总共20分钟,哈哈,明天可以回家啦。。。天啦。。。早知道。。
没什么早知道。。。呵呵
其实从道理来说还是程序比较快。因为你把别一表放到内存,显然访问比较快。再加上程序步骤简单(oracle执行时会加上很多东西,不信你看看sql的执行计划。)所以速度快很多也就是可以理解的。
怪不得我很多的系统数据库都只是用来保存数据,用以查询。其它处理,如重单处理、统计之类的功能都在内存中完成而绝对不会用数据库.