|
原帖由 newkid 于 2008-12-11 03:10 发表 ![]()
我把你的数据导入了,总共94万多张票,我按(START_DATE,BEG_STATION,TRAIN_NO)建了索引。我提交了100个JOB让ORACLE同时运行,每个JOB尝试50个不同日期的调用,争夺同一车次(H4或H4A)、同一始发站(SJHP)、席位=22、PURPOSE=0的车票,每次请求5张。这个竞争是远远比现实生活要剧烈得多,有时候必须轮循85张票才订到5张。每次调用完我转换成JSON插入结果表,这是模拟你的输出。
结果是:最长的JOB在10来秒结束,最短的0.5秒就抢到所有的票。总共卖出票数21120(因为不是每个尝试的日期都有票)。
把内存数组改用GLOBAL TEMPORARY TABLE保存结果集,最长的JOB差不多15秒,最短的还是0.5秒。
我希望你能给出其他测试方法。如果条件是错开的,这个程序性能会更好。
purpose不能作为主键。主键只能是上述表结构定义的。你不怕相同的席位因为不同的purpose而重复吗?
我做这个测试有困难,因为经过TUXEDO服务,要登录认证,经过车次查询才能申请席位,步骤要比这多得多,有空我专门写一个demo吧,容我一些时间。
SELECT /* +rule */ to_char(start_date,'YYYY-MM-DD') start_date,beg_station,train_no,run_train,to_char(on_date,'YYYY-MM-DD HH24:MI') on_date,carno,seat_type,seat_no,end_station,shortest_station,purpose,gride,pro,flag,used_dev,used_uid,to_char(used_time,'YYYY-MM-DD HH24:MI:SS') used_time,ROWID
FROM TICKET.SEAT
WHERE start_date = to_date('2008-12-11','YYYY-MM-DD') AND beg_station = 'BHHP' AND train_no = 'H6B' AND seat_type >= 20 AND seat_type <= 29 AND end_station >= 6 AND purpose = 0 AND FLAG=0 AND ROWNUM <= 12 ORDER BY END_STATION,CARNO,SEAT_NO,SEAT_TYPe FOR UPDATE WAIT 10 SKIP LOCKED
最好用上面的SELECT,回来的结果集我好拆包。
今天,遵照大家意见,开发了子模板。
例如,想update seat,只涉及5个字段:
T_PkgType seat_sub_type[6];
DAU seat_DAU,seat_sub_DAU;
DAU_init(&seat_DAU,ctx->SQL_Connect,"SEAT",&seat,SEAT_type);
//生成子模板
patt_copy(seat_sub_type,SEAT_type,"flag, used_dev, used_uid, used_time, ROWID");
DAU_init(&seat_sub_DAU,ctx->SQL_Connect,"SEAT",&seat,seat_sub_type);
.........
ret=updateSeat_by_ROWID(&seat_sub_DAU,msg);//seat_DAO.c
生成了:
getxw:stmt=
UPDATE TICKET.SEAT SET(flag,used_dev,used_uid,used_time)=(SELECT 1,'SP0102002','ylh',to_date('2008-12-11 15:00:55','YYYY-MM-DD HH24:MI:SS') FROM DUAL) WHERE ROWID = 'AAAM3iAAFAAAEpkAAw'
,ret=1
关于ROWID,不做持久化对象,只是临时用一下,不超过15分钟,没问题的。在席位表里,另外的唯一ID绝不可用。
任何数据库都有ROWID,不过SYBASE和INFORMIX是数字,表示物理记录号。这在模板里可以处理好,与应用无关。
ROWID是最快的定位方法。
我这模板比hibernat快几个数量级,hibernate能用,我的为什么不能用?
我前边说了,模板处理,每个字段只是一条加法指令、一个类型判断和一个sprintf,根本没什么开销的。
没有模板,你上哪找struct里边的成员?
你那个存储过程很好,我还要弄透彻了,测试好,不排除使用。
性能,比JDBC快,这就足够了。
比ODBC快很多,同样工作,我瞬间完成的任务,ODBC要好几秒。
你那个 lv_rec 哪定义的?上来就可以 FOR 吗?
[ 本帖最后由 yulihua49 于 2008-12-11 16:39 编辑 ] |
|