楼主: yulihua49

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

[复制链接]
论坛徽章:
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
341#
 楼主| 发表于 2009-6-16 17:44 | 只看该作者
原帖由 yulihua49 于 2009-1-23 10:07 发表


这样行了吧:

JSON_OBJECT get_shift(T_SQL_Connect *SQL_Connect,char *msg)
{
int ret;
DAU u_DAU[2],tdev_DAU;
JSON_OBJECT result,json;
T_PkgType tdev_tpl[2]; //想选几个字段n+1

        result=json_object_new_array();
        ret=DAU_init(&tdev_DAU,SQL_Connect,"tuxdev",0,0);
        partt_copy(tdev_tpl,tdev_DAU.srm.tp,"devname"); //生成子模板,想选几个字段用,分割列表
        ret=DAU_init(&u_DAU[0],SQL_Connect,"dev_shift a",0,0);
        DAU_init(&u_DAU[1],SQL_Connect,"tuxdev b",tdev_DAU.srm.rec,tdev_tpl);
        sprintf(msg,"WHERE a.devid=b.devid");
        ret=DAU_getm(2,u_DAU,msg,0);
        while(!DAU_nextm(2,u_DAU)) {
                json=json_object_new_object();
                DAU_toJSON(&u_DAU[0],json,0);//user全部打包到json
                DAU_toJSON(&u_DAU[1],json,"devname");//组合dev_name到json
                json_object_array_add(result,json);//在JSON数组中加入一条记录
        }
        DAU_freem(2,u_DAU);
        DAU_free(&tdev_DAU);
        return result;
}

执行结果:

buf=SELECT  a.devid,to_char(a.stat_date,'YYYY-MM-DD') stat_date,a.shift_flg,a.shift_code,a.userid,to_char(a.log_time,'YYYY-MM-DD HH24:MI:SS') log_time,a.beg_no,b.devname FROM TICKET.dev_shift a,TICKET.tuxdev b WHERE a.devid=b.devid

result=[ { "devid": "JOLTTEST", "stat_date": "2008-10-20", "shift_flg": "BB", "shift_code": "5", "userid": "hp", "log_time": "2008-10-20 14:44:34", "beg_no": "A0000001", "devname": "JOLT测试终端" }, { "devid": "JOLTTEST1", "stat_date": "2008-11-06", "shift_flg": "AB", "shift_code": "5", "userid": "hww", "log_time": "2008-11-06 16:12:26", "beg_no": "A0000001", "devname": "黄伟伟的JOLT测试终端" }, { "devid": "SP0102002", "stat_date": "2009-01-20", "shift_flg": "DB", "shift_code": "5", "userid": "ylh", "log_time": "2009-01-20 13:54:03", "beg_no": "A0000001", "devname": "售票测试终端2" }, { "devid": "SP0102003", "stat_date": "2008-10-16", "shift_flg": "DB", "shift_code": "5", "userid": "", "log_time": "2008-10-16 10:14:53", "beg_no": "A0000001", "devname": "售票测试终端3" } ]


原想对DAU再做些改进,支持多表连接的bind功能。
结果:

http://tech.it168.com/db/o/2006-06-15/200606151715426.shtml
说ORACLE语句池不支持多表连接的语句:
为了不重复解析相同的SQL语句,在第一次解析之后, ORACLE将SQL语句存放在内存中.这块位于系统全局区域SGA(system global area)的共享池(shared buffer pool)中的内存可以被所有的数据库用户共享. 因此,当你执行一个SQL语句(有时被称为一个游标)时,如果它和之前的执行过的语句完全相同, ORACLE就能很快获得已经被解析的语句以及最好的执行路径. ORACLE的这个功能大大地提高了SQL的执行性能并节省了内存的使用.

    可惜的是ORACLE只对简单的表提供高速缓冲(cache buffering) ,这个功能并不适用于多表连接查询.


过去测过自动生成模板的时间,其内部是带bind的多表连接,耗时永远都是4ms,看来是支持了上述说法。如果语句池起作用,应该在1ms左右。
决定对多表连接不进行bind操作了。

[ 本帖最后由 yulihua49 于 2009-6-16 17:52 编辑 ]

使用道具 举报

回复
论坛徽章:
33
劳斯莱斯
日期:2013-08-08 14:01:23三菱
日期:2013-09-28 10:16:06一汽
日期:2013-11-19 17:01:11凯迪拉克
日期:2013-12-07 17:11:282014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02itpub13周年纪念徽章
日期:2014-09-27 14:20:21itpub13周年纪念徽章
日期:2014-10-08 15:13:38懒羊羊
日期:2015-03-04 14:52:112015年新春福章
日期:2015-03-06 11:58:18
342#
发表于 2009-6-17 13:15 | 只看该作者
可惜NEWKID未在

使用道具 举报

回复
论坛徽章:
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
343#
 楼主| 发表于 2009-6-17 15:18 | 只看该作者
原帖由 zhangweicai74 于 2009-6-17 13:15 发表
可惜NEWKID未在

newkid很热心,受益匪浅。
希望朋友们多提意见和建议。

使用道具 举报

回复
论坛徽章:
0
344#
发表于 2009-6-17 17:59 | 只看该作者
看的有點暈

使用道具 举报

回复
论坛徽章:
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
345#
 楼主| 发表于 2009-6-21 19:05 | 只看该作者

那边有人问个问题:


  1. www. oracle .com.cn/archiver/?tid-73788.html

  2. 把oracle两边的空格去掉!

  3. 5分钟内如何插入40万条以上的数据?
  4. 问题描述:
  5.       每5分钟要从硬盘上的一个文件中读取40万条以上的数据,并将其插入oracle的一张表中。

  6. 尝试结果:
  7.      使用libsqlora8,oracle 9.2,表中只有一个时间字段为索引
  8. 代码:
  9.    sqlo_db_handle_t dbh;

  10.   /*open and login Oracle */
  11.   if (SQLO_SUCCESS != sqlo_init(SQLO_OFF, 1, 100)) {
  12.   }
  13.   
  14.   if (SQLO_SUCCESS != sqlo_connect(&dbh, "aa/aa@test")) {
  15.    
  16.   }
  17.   
  18.   sqlo_autocommit_off(dbh);

  19.   int i=0;
  20.   
  21. /* foreach flow */
  22.   while ((value = read_from(ftio))) {

  23.     /* form SQL query and execute it */
  24.       strcpy (query, "INSERT INTO ");
  25.       strcat (query, "test");
  26.       strcat (query, "(");
  27.       strcat (query, fields);
  28.       strcat (query, ") VALUES (");
  29.       strcat (query, values);
  30.       strcat (query, ")");

  31.        /*执行查询*/
  32.       if (0 > (stat = sqlo_exec(dbh, query))) {
  33.       }
  34.       i++;
  35.       if((i % 3000) == 0){
  36.               sqlo_commit(dbh);
  37.               i=0;
  38.       }

  39.     next_records();

  40.   } /* while */

  41. /* close database */
  42.   sqlo_commit(dbh);
  43.   sqlo_finish(dbh);
  44.   
  45.   
  46. 结果:
  47.     在sqlo_autocommit_on(dbh);的情况下,插入50万条数据花了28分钟,按理说这种情况是最慢的,反而在我的试验中最快
  48.     在sqlo_autocommit_off(dbh);的情况下,每3000条提交一次,插入44万条数据花27分钟,并不快;
  49.     在sqlo_autocommit_off(dbh);的情况下,每5000条提交一次,插入47万条数据花27分钟,并不快
  50.     在sqlo_autocommit_off(dbh);的情况下,每10000条提交一次,插入47万条数据花30分钟,并不快;

  51. 看了很多插入数据的文章,都不得其解,难道真的要用OCI来写,才能实现复杂的批量操作吗?还有external table我这适合吗?
  52. array(bulk) insert要如何实现啊?
复制代码



我没有那边的权限,在这回答:
在sqlora8里,使用游标,绑定变量就可以。
我这个例子,5300条/秒,达到160万条/5分钟。

[ 本帖最后由 yulihua49 于 2009-6-21 19:14 编辑 ]

使用道具 举报

回复
论坛徽章:
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
346#
发表于 2009-6-25 04:07 | 只看该作者
在申请席位之前,会有一个查询车次、到发站的操作,边查数据库边计算运行周期。也可以完全在存储过程做。但上万台客户端要在3-4台RAC服务器做,压力太大。
因此我们还是逐个记录提取到TUXDO服务层,在这里计算、组合数据。其中只有10%左右的时间需要访问RAC。大部分时间十几台TUXEDO服务器的数百进程并行作业。

你有没有想过这个“逐个记录提取”的方法给数据库造成了额外的负担?你那点计算根本微不足道,别小看了SQL的计算能力。

RAC只为它们提供数据,如果大量数据重复请求,还可以在各层实现缓冲,实际数据存取量是很小的,所以总体速度和吞吐量要比存储过程快很多

用压力测试跑过我的存储过程吗?

    可惜的是ORACLE只对简单的表提供高速缓冲(cache buffering) ,这个功能并不适用于多表连接查询.
过去测过自动生成模板的时间,其内部是带bind的多表连接,耗时永远都是4ms,看来是支持了上述说法。如果语句池起作用,应该在1ms左右。
决定对多表连接不进行bind操作了。

11G支持对连接结果的CACHE.
但这和绑定变量有什么关系?不论你是单表查询,多表连接查询,SQL的解析原理都是一样的。你把数据缓冲区和共享池搞混了,回头好好复习ORACLE的体系结构。

使用道具 举报

回复
论坛徽章:
26
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44ITPUB十周年纪念徽章
日期:2011-11-01 16:20:282012新春纪念徽章
日期:2012-01-04 11:49:542013年新春福章
日期:2013-02-25 14:51:24夏利
日期:2013-08-13 23:25:29优秀写手
日期:2013-12-18 09:29:092014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11蓝色妖姬
日期:2015-03-19 09:37:00ITPUB年度最佳技术原创精华奖
日期:2015-03-19 09:43:24
347#
发表于 2009-6-25 08:57 | 只看该作者
newkid 兄又复出了;开心啊。
不知道newkid 兄现在在哪高就呢。

使用道具 举报

回复
论坛徽章:
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
348#
发表于 2009-6-25 23:01 | 只看该作者
原帖由 qingyun 于 2009-6-25 08:57 发表
newkid 兄又复出了;开心啊。
不知道newkid 兄现在在哪高就呢。

哪儿也没去,继续当剩男+宅男。整天没头苍蝇似的递简历。到现在为止只有一个DBA职位的面试机会,偏偏对方不太懂ORACLE,而我又不是能说会道的人,当然没什么好下场。现在哪怕招个初级职位,要求也比招女婿还苛刻!估计我的简历都直接进了垃圾堆。伯乐啊!你在哪里?

使用道具 举报

回复
论坛徽章:
33
劳斯莱斯
日期:2013-08-08 14:01:23三菱
日期:2013-09-28 10:16:06一汽
日期:2013-11-19 17:01:11凯迪拉克
日期:2013-12-07 17:11:282014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02itpub13周年纪念徽章
日期:2014-09-27 14:20:21itpub13周年纪念徽章
日期:2014-10-08 15:13:38懒羊羊
日期:2015-03-04 14:52:112015年新春福章
日期:2015-03-06 11:58:18
349#
发表于 2009-6-26 08:50 | 只看该作者
原帖由 newkid 于 2009-6-25 23:01 发表

哪儿也没去,继续当剩男+宅男。整天没头苍蝇似的递简历。到现在为止只有一个DBA职位的面试机会,偏偏对方不太懂ORACLE,而我又不是能说会道的人,当然没什么好下场。现在哪怕招个初级职位,要求也比招女婿还苛刻!估计我的简历都直接进了垃圾堆。伯乐啊!你在哪里?

没想过回国?
回国找个工作外派

使用道具 举报

回复
论坛徽章:
26
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44ITPUB十周年纪念徽章
日期:2011-11-01 16:20:282012新春纪念徽章
日期:2012-01-04 11:49:542013年新春福章
日期:2013-02-25 14:51:24夏利
日期:2013-08-13 23:25:29优秀写手
日期:2013-12-18 09:29:092014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11蓝色妖姬
日期:2015-03-19 09:37:00ITPUB年度最佳技术原创精华奖
日期:2015-03-19 09:43:24
350#
发表于 2009-6-26 10:54 | 只看该作者
我一直很崇拜 newkid 兄, 不知道您除了oracle开发上比较“猛”外,在oracle 管理上是否很全面;
还有除了Oracle,其他技能,比如:Java,Spring+Struts2+HiberNate 等方面有很厉害;
我想java web方面猛的话,选择面还是挺宽的;

不过,加拿大福利那么好;就算呆在家里,生活也不成问题吧;

使用道具 举报

回复

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

本版积分规则 发表回复

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