楼主: 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
141#
发表于 2008-12-22 04:02 | 只看该作者

那个ins_sth我一开始没有看清楚,上面澄清过了。

"复杂点了吧?还能有我这个程序快?"
等下就告诉你怎么做。这些脚本一旦创建就可反复使用,在ETL中效率就是生命!

"INSERT INTO tabname (什么来着?我忘了,或者,根本不知道) VALUES (天哪,我哪知道是什么呀);
只有你舒服。
ret=DAU_insert(&_DAU,buf);
舒服吗?"

前面的DAU的初试化呢?你总得知道给什么对象插入吧(表名忘了,对象名呢?) 你总得把数据和字段对应上把(字段名忘了?你敢随便起一个?)
你就把最后一步拿出来说事,这就有点耍赖了。
我不愿意把INSERT分成很多步骤,一个INSERT最好,什么都看得到,明明白白的。


下面是用外部表进行MERGE INTO的步骤,最后MERGE只用了0.5秒!

准备工作:
先确定有创建目录对象的权限:
grant create any directory to my_user_name;

以my_user_name创建一个目录映射到一个操作系统路径, 比方说我想把数据放在数据库的e:\share:
create directory TJRB as 'e:\share';

把文件TJ01.TXT拷贝至该目录。

创建外部表(该脚本可用SQLLDR根据控制文件生成):
CREATE TABLE TJ01_EXT
(
  "TJDATE" DATE,
  "UNIT" VARCHAR2(8),
  "TABNAME" VARCHAR2(8),
  "FLG" NUMBER(3),
  "DAT1" NUMBER(15),
  "DAT2" NUMBER(15),
  "DAT3" NUMBER(15),
  "DAT4" NUMBER(15),
  "DAT5" NUMBER(15),
  "DAT6" NUMBER(15),
  "DAT7" NUMBER(15),
  "DAT8" NUMBER(15),
  "DAT9" NUMBER(15),
  "DAT10" NUMBER(15),
  "DAT11" NUMBER(15),
  "DAT12" NUMBER(15),
  "DAT13" NUMBER(15),
  "DAT14" NUMBER(15),
  "DAT15" NUMBER(15),
  "DAT16" NUMBER(15),
  "DAT17" NUMBER(15),
  "DAT18" NUMBER(15),
  "DAT19" NUMBER(15),
  "DAT20" NUMBER(15),
  "DAT21" NUMBER(15),
  "DAT22" NUMBER(15),
  "DAT23" NUMBER(15),
  "DAT24" NUMBER(15),
  "DAT25" NUMBER(15),
  "DAT26" NUMBER(15),
  "DAT27" NUMBER(15),
  "DAT28" NUMBER(15),
  "DAT29" NUMBER(15),
  "DAT30" NUMBER(15),
  "DAT31" NUMBER(15),
  "DAT32" NUMBER(15),
  "DAT33" NUMBER(15),
  "DAT34" NUMBER(15),
  "DAT35" NUMBER(15),
  "DAT36" NUMBER(15),
  "DAT37" NUMBER(15),
  "DAT38" NUMBER(15),
  "DAT39" NUMBER(15),
  "DAT40" NUMBER(15),
  "DAT41" NUMBER(15),
  "DAT42" NUMBER(15),
  "DAT43" NUMBER(15),
  "DAT44" NUMBER(15),
  "DAT45" NUMBER(15),
  "DAT46" NUMBER(15),
  "DAT47" NUMBER(15),
  "DAT48" NUMBER(15),
  "DAT49" NUMBER(15),
  "DAT50" NUMBER(15)
)
ORGANIZATION external
(
  TYPE oracle_loader
  DEFAULT DIRECTORY TJRB
  ACCESS PARAMETERS
  (
    RECORDS DELIMITED BY NEWLINE CHARACTERSET WE8MSWIN1252
    BADFILE 'TJRB':'TJ01.bad'
    LOGFILE 'tj01.log_xt'
    READSIZE 1048576
    FIELDS TERMINATED BY "|" LDRTRIM
    MISSING FIELD VALUES ARE NULL
    REJECT ROWS WITH ALL NULL FIELDS
    (
      "TJDATE" CHAR(255)
        TERMINATED BY "|"
        DATE_FORMAT DATE MASK "YYYY.MM.DD",
      "UNIT" CHAR(255)
        TERMINATED BY "|",
      "TABNAME" CHAR(255)
        TERMINATED BY "|",
      "FLG" CHAR(255)
        TERMINATED BY "|",
      "DAT1" CHAR(255)
        TERMINATED BY "|",
      "DAT2" CHAR(255)
        TERMINATED BY "|",
      "DAT3" CHAR(255)
        TERMINATED BY "|",
      "DAT4" CHAR(255)
        TERMINATED BY "|",
      "DAT5" CHAR(255)
        TERMINATED BY "|",
      "DAT6" CHAR(255)
        TERMINATED BY "|",
      "DAT7" CHAR(255)
        TERMINATED BY "|",
      "DAT8" CHAR(255)
        TERMINATED BY "|",
      "DAT9" CHAR(255)
        TERMINATED BY "|",
      "DAT10" CHAR(255)
        TERMINATED BY "|",
      "DAT11" CHAR(255)
        TERMINATED BY "|",
      "DAT12" CHAR(255)
        TERMINATED BY "|",
      "DAT13" CHAR(255)
        TERMINATED BY "|",
      "DAT14" CHAR(255)
        TERMINATED BY "|",
      "DAT15" CHAR(255)
        TERMINATED BY "|",
      "DAT16" CHAR(255)
        TERMINATED BY "|",
      "DAT17" CHAR(255)
        TERMINATED BY "|",
      "DAT18" CHAR(255)
        TERMINATED BY "|",
      "DAT19" CHAR(255)
        TERMINATED BY "|",
      "DAT20" CHAR(255)
        TERMINATED BY "|",
      "DAT21" CHAR(255)
        TERMINATED BY "|",
      "DAT22" CHAR(255)
        TERMINATED BY "|",
      "DAT23" CHAR(255)
        TERMINATED BY "|",
      "DAT24" CHAR(255)
        TERMINATED BY "|",
      "DAT25" CHAR(255)
        TERMINATED BY "|",
      "DAT26" CHAR(255)
        TERMINATED BY "|",
      "DAT27" CHAR(255)
        TERMINATED BY "|",
      "DAT28" CHAR(255)
        TERMINATED BY "|",
      "DAT29" CHAR(255)
        TERMINATED BY "|",
      "DAT30" CHAR(255)
        TERMINATED BY "|",
      "DAT31" CHAR(255)
        TERMINATED BY "|",
      "DAT32" CHAR(255)
        TERMINATED BY "|",
      "DAT33" CHAR(255)
        TERMINATED BY "|",
      "DAT34" CHAR(255)
        TERMINATED BY "|",
      "DAT35" CHAR(255)
        TERMINATED BY "|",
      "DAT36" CHAR(255)
        TERMINATED BY "|",
      "DAT37" CHAR(255)
        TERMINATED BY "|",
      "DAT38" CHAR(255)
        TERMINATED BY "|",
      "DAT39" CHAR(255)
        TERMINATED BY "|",
      "DAT40" CHAR(255)
        TERMINATED BY "|",
      "DAT41" CHAR(255)
        TERMINATED BY "|",
      "DAT42" CHAR(255)
        TERMINATED BY "|",
      "DAT43" CHAR(255)
        TERMINATED BY "|",
      "DAT44" CHAR(255)
        TERMINATED BY "|",
      "DAT45" CHAR(255)
        TERMINATED BY "|",
      "DAT46" CHAR(255)
        TERMINATED BY "|",
      "DAT47" CHAR(255)
        TERMINATED BY "|",
      "DAT48" CHAR(255)
        TERMINATED BY "|",
      "DAT49" CHAR(255)
        TERMINATED BY "|",
      "DAT50" CHAR(255)
        TERMINATED BY "|"
    )
  )
  location
  (
    'TJ01.txt'
  )
)REJECT LIMIT UNLIMITED
/

接下来你就可以直接访问数据了!不用加载!
SELECT COUNT(*) FROM TJ01_EXT;

  COUNT(*)
----------
      3776

Elapsed: 00:00:00.20

然后用MERGE INTO加载并处理数据。这只是一个SQL, 如果你愿意的话可以用系统字典生成动态SQL, 我只是COPY&PASTE.

MERGE INTO TJRB t USING TJ01_EXT e
ON (t.TJDATE = e.TJDATE AND t.UNIT=e.UNIT AND t.TABNAME = e.TABNAME AND t.FLG = e.FLG)
WHEN MATCHED THEN UPDATE
SET dat1  =e.dat1  
   ,dat2  =e.dat2  
   ,dat3  =e.dat3  
   ,dat4  =e.dat4  
   ,dat5  =e.dat5  
   ,dat6  =e.dat6  
   ,dat7  =e.dat7  
   ,dat8  =e.dat8  
   ,dat9  =e.dat9  
   ,dat10 =e.dat10
   ,dat11 =e.dat11
   ,dat12 =e.dat12
   ,dat13 =e.dat13
   ,dat14 =e.dat14
   ,dat15 =e.dat15
   ,dat16 =e.dat16
   ,dat17 =e.dat17
   ,dat18 =e.dat18
   ,dat19 =e.dat19
   ,dat20 =e.dat20
   ,dat21 =e.dat21
   ,dat22 =e.dat22
   ,dat23 =e.dat23
   ,dat24 =e.dat24
   ,dat25 =e.dat25
   ,dat26 =e.dat26
   ,dat27 =e.dat27
   ,dat28 =e.dat28
   ,dat29 =e.dat29
   ,dat30 =e.dat30
   ,dat31 =e.dat31
   ,dat32 =e.dat32
   ,dat33 =e.dat33
   ,dat34 =e.dat34
   ,dat35 =e.dat35
   ,dat36 =e.dat36
   ,dat37 =e.dat37
   ,dat38 =e.dat38
   ,dat39 =e.dat39
   ,dat40 =e.dat40
   ,dat41 =e.dat41
   ,dat42 =e.dat42
   ,dat43 =e.dat43
   ,dat44 =e.dat44
   ,dat45 =e.dat45
   ,dat46 =e.dat46
   ,dat47 =e.dat47
   ,dat48 =e.dat48
   ,dat49 =e.dat49
   ,dat50 =e.dat50
WHERE 1=1  ------ 你可在这里加入时间戳判断
WHEN NOT MATCHED THEN INSERT
VALUES (e.tjdate
      ,e.unit
      ,e.tabname
      ,e.flg
      ,e.dat1
      ,e.dat2
      ,e.dat3
      ,e.dat4
      ,e.dat5
      ,e.dat6
      ,e.dat7
      ,e.dat8
      ,e.dat9
      ,e.dat10
      ,e.dat11
      ,e.dat12
      ,e.dat13
      ,e.dat14
      ,e.dat15
      ,e.dat16
      ,e.dat17
      ,e.dat18
      ,e.dat19
      ,e.dat20
      ,e.dat21
      ,e.dat22
      ,e.dat23
      ,e.dat24
      ,e.dat25
      ,e.dat26
      ,e.dat27
      ,e.dat28
      ,e.dat29
      ,e.dat30
      ,e.dat31
      ,e.dat32
      ,e.dat33
      ,e.dat34
      ,e.dat35
      ,e.dat36
      ,e.dat37
      ,e.dat38
      ,e.dat39
      ,e.dat40
      ,e.dat41
      ,e.dat42
      ,e.dat43
      ,e.dat44
      ,e.dat45
      ,e.dat46
      ,e.dat47
      ,e.dat48
      ,e.dat49
      ,e.dat50
);

3776 rows merged.

Elapsed: 00:00:00.56


使用道具 举报

回复
论坛徽章:
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
142#
 楼主| 发表于 2008-12-23 09:54 | 只看该作者
原帖由 newkid 于 2008-12-22 04:02 发表

前面的DAU的初试化呢?你总得知道给什么对象插入吧(表名忘了,对象名呢?) 你总得把数据和字段对应上把(字段名忘了?你敢随便起一个?)
你就把最后一步拿出来说事,这就有点耍赖了。
我不愿意把INSERT分成很多步骤,一个INSERT最好,什么都看得到,明明白白的。



还是没看细。
表名总是知道的,要么自变量里给,要么文件里给。

然后,DAU_init(SQL_Connect,tabname,0,0);
初始化完成啦,这个程序可以加载任何表的。
你忘了前边的模板生成器?DAU_init发现你没提供模板,就自动生成,这就是1楼就展示的功能。

给你一个shell:ldasc

time ./loadsth -f $HOME/config/xw.ini $* tjrb

表名就在最后,可以是任意表名。

我可没耍赖,给你的是全部代码啦!没写的都是包装器提供了。

我想知道你如何处理(暂时就说加载吧!)任意表的数据。

你要的万能加载我以后给你,最近比较忙。

作为一般性,几十个形态各异的列,枚举起来真是晕死,要花很长时间保证前后对齐,严重影响劳动生产率。

你没有定义主键。折腾半天,用了几秒?,用一个shell整合一下命令,用time一下时间。

你这个程序比我大长了不少,才只处理一个表。

[ 本帖最后由 yulihua49 于 2008-12-23 10:12 编辑 ]

使用道具 举报

回复
论坛徽章:
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
143#
发表于 2008-12-23 10:08 | 只看该作者
原帖由 yulihua49 于 2008-12-23 09:54 发表

还是没看细。
表名总是知道的,要么自变量里给,要么文件里给。

然后,DAU_init(SQL_Connect,tabname,0,0);
初始化完成啦,这个程序可以加载任何表的。
你忘了前边的模板生成器?DAU_init发现你没提供模板,就自动生成,这就是1楼就展示的功能。

给你一个shell:ldasc

time ./loadsth -f $HOME/config/xw.ini $* tjrb

表名就在最后,可以是任意表名。

我可没耍赖,给你的是全部代码啦!没写的都是包装器提供了。

我想知道你如何处理(暂时就说加载吧!)任意表的数据。

你要的万能加载我以后给你,最近比较忙。

作为一般性,几十个形态各异的列,枚举起来真是晕死,要花很长时间保证前后对齐,严重影响劳动生产率。



我所谓的耍赖是说,你只写了最后一个:ret=DAU_insert(&_DAU,buf);
然后拿这个最后步骤和INSERT语句相比,说是比INSERT舒服?还说INSERT得记住表名和字段名。
实际上你前面还有准备工作:你照样得知道表名,你照样得把数据对应到INSERT的字段!这能比INSERT省事?

我举例的外部表例子建议你试试,很奇妙的,不用加载就可以像表一样访问。这就是效率呀。

万能加载?我从没有想到要做,SQLLOADER已经很好了。我只要使用。
外部表:不用加载。就一个建表语句。这个建表语句可以用SQL LOADER生成。一次建立永远使用。
几十个列又怎么了,COPY&PASTE不就行了?
实在要搞通用程序,可从字典里生成动态SQL. 我一般不这么干,除非有很多很多表要做。
你不用给我万能加载,只要举例说加载逻辑最复杂的是怎样的,而你最终的利用工具的代码(假设你工具已经做好了)又是怎样的。
实际上,我可以猜想你的复杂动作必须在工具中预先定义好,再有一个新花样你的工具照样无法处理。

使用道具 举报

回复
论坛徽章:
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
144#
 楼主| 发表于 2008-12-23 11:11 | 只看该作者
原帖由 newkid 于 2008-12-23 10:08 发表



我所谓的耍赖是说,你只写了最后一个:ret=DAU_insert(&_DAU,buf);
然后拿这个最后步骤和INSERT语句相比,说是比INSERT舒服?还说INSERT得记住表名和字段名。
实际上你前面还有准备工作:你照样得知道表名,你照样得把数据对应到INSERT的字段!这能比INSERT省事?


init也是一句啊,通篇我也没提列名,我都不知处理那个表,何来列名呢?
准备工作就是包装器的功能啊,有了包装器,什么都给你准备好了,你不是很省事吗?
效率问题,前边的time包括了程序启动,密码解析,打开数据库,打开文件,生成模板,处理数据,关闭模板,关闭数据库。。。
其中密码解析还是SQL*load不做的,我还吃着亏呢。
只比它慢一点点,付出的这些代价我认为很值了。

[ 本帖最后由 yulihua49 于 2008-12-23 16:07 编辑 ]

使用道具 举报

回复
论坛徽章:
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
145#
发表于 2008-12-24 00:55 | 只看该作者
"init也是一句啊,通篇我也没提列名,我都不知处理那个表,何来列名呢?"

ret=DAU_insert(&_DAU,buf);
_DAU里面的数据怎么来的?必须有某段代码对它填充。
不提列名,是恰好因为你要加载的数据文件里面已经按顺序把数据都排好,这就好比INSERT INTO ... VALUES也可以不提列名,只要你保证数据和列一致。
你也可以用你的DAU_COPY,但这也只是特例,一个事务数据的建立,肯定是要从客户端收集进来的,你要指望全部从数据库里面已经存在的数据拷贝是不行的。
即使部分数据是拷贝来的,最快速的办法就是INSERT...SELECT,数据不会从服务器出来到C服务器兜一圈再回去,就是从表到表,代码看起来也很清晰。

"准备工作就是包装器的功能啊,有了包装器,什么都给你准备好了,你不是很省事吗?"
用PLSQL从来就不需要什么PREPARE/BIND/EXECUTE等等步骤,一个SQL搞定,因此你的包装器无用武之地。PLSQL是最直观简练的,你的包装器硬生生在应用和数据库之间塞进一层,DEBUG起来更费事了。就像你前面提的,不用记表名、列名,其实只是分配到其他步骤而已,我要是哪个列的数据不对了,怎么知道它是从DAU_COPY混进来的?列名都被弄到模板解析层去了,找起来不头疼吗?

"效率问题,前边的time包括了程序启动,密码解析,打开数据库,打开文件,生成模板,处理数据,关闭模板,关闭数据库。。。
其中密码解析还是SQL*load不做的,我还吃着亏呢。"
这都是你自找的,就好比两个人赛跑,我是轻装上阵,你背着个铅球还嚷嚷吃亏。要想跑得快就得甩掉包袱,学习我的方法。

使用道具 举报

回复
论坛徽章:
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
146#
 楼主| 发表于 2008-12-25 09:02 | 只看该作者
原帖由 newkid 于 2008-12-24 00:55 发表
"init也是一句啊,通篇我也没提列名,我都不知处理那个表,何来列名呢?"

ret=DAU_insert(&_DAU,buf);
_DAU里面的数据怎么来的?必须有某段代码对它填充。
不提列名,是恰好因为你要加载的数据文件里面已经按顺序把数据都排好,这就好比INSERT INTO ... VALUES也可以不提列名,只要你保证数据和列一致。
你也可以用你的DAU_COPY,但这也只是特例,一个事务数据的建立,肯定是要从客户端收集进来的,你要指望全部从数据库里面已经存在的数据拷贝是不行的。
即使部分数据是拷贝来的,最快速的办法就是INSERT...SELECT,数据不会从服务器出来到C服务器兜一圈再回去,就是从表到表,代码看起来也很清晰。


看程序,就是这一句。
读文件到buf,
DAU_dispack(&_DAU,buf);
如果是客户端送来的JSON数据:
DAU_fromJSON(&_DAU,JSON_object);
如果提交数据给客户端,就:
DAU_toJSON(&_DAU,JSON_object,0);

其余的,我也不反驳你,各有各的需求。

另外,请教一个问题,如果一个表没有主键,想读出第一个唯一索引及其组成,应该怎样做?

[ 本帖最后由 yulihua49 于 2008-12-25 09:11 编辑 ]

使用道具 举报

回复
论坛徽章:
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
147#
发表于 2008-12-25 10:15 | 只看该作者
根据TABLE_NAME在USER_INDEXES中查找UNIQUENESS='UNIQUE'
其构成在USER_IND_COLUMNS

使用道具 举报

回复
论坛徽章:
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
148#
 楼主| 发表于 2008-12-26 08:54 | 只看该作者
原帖由 newkid 于 2008-12-25 10:15 发表
根据TABLE_NAME在USER_INDEXES中查找UNIQUENESS='UNIQUE'
其构成在USER_IND_COLUMNS

多谢,进一步的工作以后再公布。

这个工作的意义,至少,我研究了这些乱七八糟的问题,包装起来,别人就不必研究了。我研究这些问题,然后我使用这些软件,当然没有意义。这些软件是给别人用的,目前是我的团队,我希望能够提供给更多的人使用。

[ 本帖最后由 yulihua49 于 2008-12-26 08:59 编辑 ]

使用道具 举报

回复
论坛徽章:
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
149#
发表于 2008-12-26 10:36 | 只看该作者
呵呵,我们各自保留意见,只要你不对存储过程等数据库方法存在偏见就行!

使用道具 举报

回复
论坛徽章:
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
150#
 楼主| 发表于 2008-12-29 11:23 | 只看该作者
DAU 最新优化结果:以前是间接bind,通过argv进行,现在是直接bind,直接bind到结构里的成员。
加载7552条记录:

                SQL*loader                              DAU
real                1.195                                    1.426
user              0.368                                     0.336
sys                0.028                                    0.152
每秒加载:    6139                                      5295

以real时间来看,DAU的功力已经达到ORACLE的83%。
从user时间来看,没有什么包装开销。
对它的性能还有什么可说的呢?在这里还有什么必要使用存储过程呢?
对不起,我不是攻击存储过程,我只是说,在我们的环境下。

[ 本帖最后由 yulihua49 于 2008-12-29 11:29 编辑 ]

使用道具 举报

回复

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

本版积分规则 发表回复

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