楼主: yulihua49

[PRO*C] 看我做的数据库包装器

[复制链接]
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
201#
发表于 2009-1-23 22:43 | 只看该作者
"框架内部如何复杂没有关系,使用简单就行。Hebernate内部极其复杂,使用非常简单。"
要自己写循环MERGE两个集合还算"使用简单"?内部复杂是管不着,但哪一天你想提高效率就无从下手了。

"你即便select *,还是要into吧?那个into很麻烦的。"
谁说SELECT一定要INTO了?你可以用FOR循环游标,你可以OPEN一个游标返回客户端。
即使要用INTO, 我们还有%ROWTYPE呢,这个也是自适应结构的。

"select *每次都要处理,……"
处理是啥意思?不管是什么SQL, 解析只有一次。你修改了结构自动会重新解析。

"如果想省时间,可以固定模板啊,固定模板是事先自动生成的,也不用手写。"
我没看到你生成固定模板的代码,如果不是选择列而是SELECT COUNT(*) ... GROUP BY 这样的呢?你能够自动生成吗?

"越是复杂的应用逻辑,DAU的价值越高。尤其那些生手,DAU可以使他们快速入门。"
说实话我不相信你们会让生手做那些复杂的应用逻辑。如果对开发人员屏蔽了数据库结构那肯定是做不好复杂的事务。

"这样行了吧:……"
看看你为了做个简单的表连接,程序都不堪卒读了,这样还叫简单?能比一个SQL更直截了当?还能指望程序员不懂得表结构?

"newkid所说的复杂SQL在OLTP很少使用。"
我做OLTP很多年了,复杂查询一点也不少用。界面上总是要展示数据的,写入之前的计算也要用到大量查询。因为是OLTP查询效率就特别重要,光靠SELECT * 那是搞不定的。

至于美女穿不穿衣服哪个更好看,这确实属于审美范畴,但你要是说穿了衣服效率更高我就不同意了

为了让这场马拉松相声早日划上句号,以后我就尽量不回这贴了,除非我觉得有必要站出来捍卫美女的尊严

使用道具 举报

回复
论坛徽章:
3
2009新春纪念徽章
日期:2009-01-04 14:52:28设计板块每日发贴之星
日期:2009-01-23 01:01:09设计板块每日发贴之星
日期:2009-03-17 01:01:05
202#
发表于 2009-1-23 23:08 | 只看该作者
newkid 老兄可不要为了给帖子画个句号就不回帖了(对于您对oracle的功底非常钦佩),大伙儿等着您和yulihua49 高见呢
我也绝没有一点yulihua49 兄的此贴放错地方的意思——纯粹调侃

[ 本帖最后由 CS-IM 于 2009-2-6 14:42 编辑 ]

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
203#
发表于 2009-1-24 00:01 | 只看该作者
原帖由 yulihua49 于 2009-1-23 20:50 发表

对不起,注释搞错了。
ret=insrec(&_DAU,buf);
                if(ret) {
                        if(SQL_Connect->Errno == DUPKEY) {
                                if(!Pflg) {//如果没有-P选项,这很快
                                        ret=updaterec(&_DAU,buf);
                                        if(ret==0) upd+=1;
                                        else loss++;
                                }
                                else loss++;//这很慢。
                 } else { // 其它错误
                                DAU_pack(&_DAU,buf);
                                fprintf(ofd,"%s\n",buf);
                                ShowLog(1,"loadfile:%s",buf);
                                loss++;
                        }
                        rows--;
                        continue;
                }


那么把ret=updaterec(&_DAU,buf);
注释掉,速度怎么样?如果变慢就太古怪了。

使用道具 举报

回复
论坛徽章:
14
2009新春纪念徽章
日期:2009-01-04 14:52:28沸羊羊
日期:2015-03-04 14:51:52优秀写手
日期:2014-03-14 06:00:13马上有房
日期:2014-02-18 16:42:022014年新春福章
日期:2014-02-18 16:42:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:15蜘蛛蛋
日期:2012-06-27 21:08:142012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
204#
 楼主| 发表于 2009-1-28 10:12 | 只看该作者
至于美女穿不穿衣服哪个更好看,这确实属于审美范畴,但你要是说穿了衣服效率更高我就不同意了

为了让这场马拉松相声早日划上句号,以后我就尽量不回这贴了,除非我觉得有必要站出来捍卫美女的尊严
看样子干这事的不止我一人,微软的ADO其实干得一样事。但是它只支持WINDOWS,建立对象时语句还要自己写,使用时不用SQL语句。
http://www.w3school.com.cn/ado/ado_add.asp
我提供的UNIX/LINUX系统,ORACLE数据库,将来提供其它数据库,语句基本自动生成。
穿了衣服效率更高是指开发效率,运行效率至少不会太低。关于哪个merge的问题,我还没弄懂,以后再研究。
代码不忍卒读?有了文档就好了,这里只是展示。至少,每个表打一个包。用PRO*C呢?每个字段打一个包吧?开发效率不行了吧?
目前公司只要求C程序,也容易写成C++,看需求吧。

微软公司的ADO (ActiveX Data Objects) 是一个用于存取数据源的COM组件。它提供了编程语言和统一数据访问方式OLE DB的一个中间层。允许开发人员编写访问数据的代码而不用关心数据库是如何实现的,而只用关心到数据库的连接。访问数据库的时候,关于SQL的知识不是必要的,但是特定数据库支持的SQL命令仍可以通过ADO中的命令对象来执行
DAU赞同ADO的这些概念,并在更广泛的平台上使用。功能上也有进一步的改进,基本上可以在运行时生成SQL语句,在多数情况下不需要手动写,从而将SQL语句彻底从应用中隔离出来。

看看ADO的update语句:
sql="UPDATE customers SET "
  sql=sql & "companyname='" & Request.Form("companyname" & "',"
  sql=sql & "contactname='" & Request.Form("contactname" & "',"
  sql=sql & "address='" & Request.Form("address" & "',"
  sql=sql & "city='" & Request.Form("city" & "',"
  sql=sql & "postalcode='" & Request.Form("postalcode" & "',"
  sql=sql & "country='" & Request.Form("country" & "'"
  sql=sql & " WHERE customerID='" & cid & "'"
  on error resume next
要是DAU:
//sprintf(stmt,"WHERE customerID=:customerID";这句还有WHERE,改下句:
//DAU _mk_where(&sql_DAU,"customerID",stmt);这句还是出现了列名,改下句:
//sql_DAU.srm.pks记录了表的主键,下面的语句生成了上面的语句,而且更具通用性,可以处理任何按主键修改的表。

DAU_mk_where((&sql_DAU,sql_DAU.srm.pks,stmt);//如果customerID是主键
ret=DAU_update(&sql_DAU,stmt);`
就完事了。
象这样的语句:
sql=sql & "companyname='" & Request.Form("companyname" & "',"
在DAU内部,用完全类似的过程自动生成的。

[ 本帖最后由 yulihua49 于 2009-1-30 19:20 编辑 ]

使用道具 举报

回复
论坛徽章:
14
2009新春纪念徽章
日期:2009-01-04 14:52:28沸羊羊
日期:2015-03-04 14:51:52优秀写手
日期:2014-03-14 06:00:13马上有房
日期:2014-02-18 16:42:022014年新春福章
日期:2014-02-18 16:42:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:15蜘蛛蛋
日期:2012-06-27 21:08:142012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
205#
 楼主| 发表于 2009-2-6 09:37 | 只看该作者

注释掉update,的确变慢了。

这是用7552条记录的测试数据,不是先前给newkid的3661数据。

有update的运行时间:
~/test> time ./ldasc <TJ.txt

real    0m5.631s
user    0m1.104s
sys     0m0.496s
无update的运行时间:
:~/test> time ./ldasc <TJ.txt

real    4m41.724s
user    0m0.816s
sys     0m0.368s

先把原记录读出来,再改回去,这样比丢掉快很多。
~/test> time ./ldasc -P/dev/null <TJ.txt

real    0m7.776s
user    0m1.892s
sys     0m0.712s

程序代码:
           ret=DAU_insert(&_DAU,buf);
                if(ret) {
                        if(SQL_Connect->Errno == DUPKEY) {
                                if(!Pflg) {//如果没有-P选项
                                        ret=updaterec(&_DAU,buf);
                                        if(ret>0) {
                                                upd+=ret;
                                        }
                                        else {
                                                ShowLog(1,"loadfile update:%s",buf);
                                                loss++;
                                        }
                                } else {
                                        ret=mk_select(&_DAU,p); //先把原记录读出来
                                        ret=updaterec(&_DAU,buf);//再改回去,这样比丢掉快很多
                                        loss++;
                                }
                        } else {//出错,加载失败数据输出到指定文件
                                DAU_pack(&_DAU,buf);
                                fprintf(ofd,"%s\n",buf);//未能加载的数据输出到指定文件
                                ShowLog(1,"loadfile:%s",buf);
                                loss++;
                        }
                        rows--;
                        continue;
                }

结论:在我的环境下,ORACLE每秒能够:
丢弃24个重码的记录。
插入5300个记录。
修改1400个重码的记录。
检索并原位修改1000个记录(用以代替丢弃新纪录)。

[ 本帖最后由 yulihua49 于 2009-2-6 10:27 编辑 ]

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
206#
发表于 2009-2-7 00:45 | 只看该作者
我怀疑你的程序走了你想像不到的分支,你用少量数据(<10条)作一个全面的跟踪看看,日志再输出得更详细些。
像你上面的“用UPDATE”和“不用UPDATE”的两组时间数据,如果你用同样的PFLG开关,把ret=updaterec(&_DAU,buf);这一句注释掉再重新编译,难道速度反而更慢?我就不信邪。

你给的ADO例子没有用绑定变量,如果确实是这么实现的,只能说MS比较蠢。

N年前我是搞POWER BUILDER开发的,它的一些理念比你今天的DAU还要先进。建议你学习借鉴一下。

它有一个叫做DATA WINDOW (即你的DAU)的概念。DW的数据基于一个SQL, 而且有可视化界面。这个SQL可以用它的工具快速生成(从数据字典里拖拉),也可以手写。生成后不依赖模板。DW有RETRIEVE(查询)和UPDATE(更新)方法。RETRIEVE相当于执行了SELECT, 然后你可以像一个数组那样,按行号、列名访问数据。你可以修改这个DW里面的数据,它会记住哪一行是新增的,哪一行是改动的,哪一行是删除的。在你执行UPDATE方法时,它自动生成增删改的SQL语句, 而且是批量绑定的。修改基于主键,还可判断库里的数据是否和读取时一致(乐观锁)这是在定义DW的时候指定的。修改的对象和查询对象可以分离,比如你查VIEW但是写入到表。

这样,你对数据库的操作就变成了对DW对象的一系列操作。DW可生成很复杂的报表。

虽然现在没有人用POWER BUILDER了,可是DATA WINDOW的强大功能至今未被超越。

使用道具 举报

回复
论坛徽章:
14
2009新春纪念徽章
日期:2009-01-04 14:52:28沸羊羊
日期:2015-03-04 14:51:52优秀写手
日期:2014-03-14 06:00:13马上有房
日期:2014-02-18 16:42:022014年新春福章
日期:2014-02-18 16:42:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:15蜘蛛蛋
日期:2012-06-27 21:08:142012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
207#
 楼主| 发表于 2009-2-9 10:05 | 只看该作者
原帖由 newkid 于 2009-2-7 00:45 发表
我怀疑你的程序走了你想像不到的分支,你用少量数据(

  前边两个例子就是用你说的,注释update和不注释的比较,现在我是解释不了了,只好用假修改的办法。你也可以写一个简单的demo试试,有了结果请赐教。
前边的擂台有了一个初步结果:
我们的条件不一样,这个测试是在TUXEDO服务系统上测的,连接、login(基本就是前边的loginProc的例子),按车次查询(这个基本是真正的业务逻辑,很复杂,公司要求保密,恕不提供),最后是申请5个席位并占用。
一个进程执行时间:0.156秒,100个进程执行时间2.307秒,300个进程执行时间6.747秒。共抢了120个票,没有重号。

时间虽然比你那个实验稍多,但鉴于条件不完全相同,可以认为速度上旗鼓相当。时间上基本线性,没出现越多越慢的现象。

这当然要感谢你的指点。

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
208#
发表于 2009-2-9 11:23 | 只看该作者
"假修改"是什么意思?
如果updaterec(&_DAU,buf);里面什么事情也不做,就立刻返回,难道速度也会比不调用更快?

使用道具 举报

回复
论坛徽章:
14
2009新春纪念徽章
日期:2009-01-04 14:52:28沸羊羊
日期:2015-03-04 14:51:52优秀写手
日期:2014-03-14 06:00:13马上有房
日期:2014-02-18 16:42:022014年新春福章
日期:2014-02-18 16:42:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:15蜘蛛蛋
日期:2012-06-27 21:08:142012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
209#
 楼主| 发表于 2009-2-9 17:01 | 只看该作者
原帖由 newkid 于 2009-2-9 11:23 发表
"假修改"是什么意思?
如果updaterec(&_DAU,buf);里面什么事情也不做,就立刻返回,难道速度也会比不调用更快?

上边例子里,先select,再update,改成原来的数据。
以后想做一个:
update table set field1=field1 where PK;
那样的假修改语句。

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
210#
发表于 2009-2-9 23:32 | 只看该作者
按你的说法,是调用了一段代码(updaterec)比什么事也不做还更快。有两种方法可以调查:
1. 当你认为“比什么事也不做”时,实际上程序走了别的分支,这是我觉得最可能的猜测。只要作一次全面跟踪就可以搞清楚。
2. 把updaterec里面的代码替换成别的动作,甚至什么也不做直接返回,看看时间又如何?是不是因为原来的代码修改了全局变量影响到后面循环的执行?

你这个真正的卖票程序不公开我就没法和你PK了,等哪天你有公开的需求再来玩。

使用道具 举报

回复

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

本版积分规则 发表回复

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