水平很低回答你两个问题问题二:有以上方法实现过程有将有一个各单位的逻辑名如(A01,B01)和实际IP地址的对照表,比如A01->10.10.0.1 B01->10.10.0.2这个表每次发命令时都会查询该表,能否把该表强行调入内存,并常驻内存,这样每次查询时速度就会很快,或Oracle中有没有一些类似于全局变量的东西,我可以将这些常用信息放到这个变量中,也会增快查询速度。
>oracle有一个包可以使表、过程等模式对象驻留共享池dbms_share_pool.keep问题三:我的表中如果有主键或索引,如果我用Select * from B where id='023' 这样的语句,Oracle是否会自动使用索引。?
>如果你的主键或索引建在id字段上,应该会采用索引,还和你使用的优化模式有关
基于规则与基于优化
>oracle有一个包可以使表、过程等模式对象驻留共享池dbms_share_pool.keep问题三:我的表中如果有主键或索引,如果我用Select * from B where id='023' 这样的语句,Oracle是否会自动使用索引。?
>如果你的主键或索引建在id字段上,应该会采用索引,还和你使用的优化模式有关
基于规则与基于优化
http://expert.csdn.net/Expert/topic/1300/1300019.xml?temp=.5857965
2.在ORACLE7中,请使用如下语句:ALTER TABLE XXX CACHE 将把表XXX进行缓存(当XXX为小表的全表扫描居多时)在ORACLE8中请使用:ALTER TABLE BUFFER_POOL KEEP将被缓存的表XXX放入KEEP池中(当XXX为小表的全表扫描居多时).
3.并不见得有了索引就一定会用.你可以看看你的SQL的执行计划.从原理上讲当你有多条索引的时候RBO不见得会使用最优的一条(因为RBO的索引选择是在执行中选择的,CBO是确定的).不过还好你可以对单条SQL语句指定你需要的索引.
4.能使用ORACLE已经编译的东东是最好的,你的数据库性能就会高.(具体情况具体处理)
5.???????我也不知道为什么,问ORACLE公司吧.以上仅仅为个人看法,大家多指教.
[小数点]你的文章能不能给我发个全的?给我留言,我给你邮箱,先谢谢了.
SET SERVEROUTPUT ON;
CREATE OR REPLACE TYPE CRANE_TEL AS OBJECT(
TRANSDATA VARCHAR2(2048),
STATUS VARCHAR2(2), --状态
TRANSTYPE VARCHAR2(1), --类型
SEND VARCHAR2(15), --发送方IP地址
LogicDest Varchar2(5), --逻辑目标地址
DEST VARCHAR2(15), --目标IP地址
MEMO VARCHAR2(30) --备注,可写入发送失败时的错误号
)
/
SHOW ERRORS;BEGIN
DBMS_AQADM.CREATE_QUEUE_TABLE(
'CRANE_TEL_TAB',
'CRANE_TEL',
NULL,
'priority,enq_time',
TRUE,
DBMS_AQADM.NONE,
'For crane command send',
TRUE,0,0,
'8.1'
);
END;
/BEGIN
DBMS_AQADM.CREATE_QUEUE(
'CRANE_TEL',
'CRANE_TEL_TAB');
END;
/BEGIN
DBMS_AQADM.START_QUEUE('CRANE_TEL');
-- DBMS_AQADM.STOP_QUEUE('CRANE_TEL');
END;
/SET SERVEROUTPUT ON;
CREATE OR REPLACE PROCEDURE CRANE_TEL_ENQUEUE (
TRANSDATA IN VARCHAR2,
STATUS IN VARCHAR2, --状态
TRANSTYPE IN VARCHAR2, --类型
SEND IN VARCHAR2, --发送方IP地址
LogicDest IN Varchar2, --逻辑目标地址
DEST IN VARCHAR2, --目标IP地址
MEMO IN VARCHAR2 --备注,可写入发送失败时的错误号
)
AS
enq_options dbms_aq.enqueue_options_t;
enq_mess_properties dbms_aq.message_properties_t;
recipients dbms_aq.aq$_recipient_list_t;
payload crane_tel;
queued_message_id RAW(16);
BEGIN
--Setup the payload
payload := crane_tel(TRANSDATA,STATUS,TRANSTYPE,SEND,LogicDest,DEST,MEMO);
recipients(1) := sys.aq$_agent('CRANE_TEL',NULL,NULL);
enq_mess_properties.recipient_list := recipients;
dbms_aq.enqueue('CRANE_TEL',
enq_options,
enq_mess_properties,
payload,
queued_message_id);
END;
/
SHOW ERRORS;--写队列
SET SERVEROUTPUT ON;
EXECUTE CRANE_TEL_ENQUEUE('GC02G01C010010000100002SLABID00000001I1000','11','1','172.16.160.34','C01','172.16.160.48',' ');
COMMIT;SET SERVEROUTPUT ON;
CREATE OR REPLACE PROCEDURE CRANE_TEL_DEQUEUE (
TRANSDATA OUT VARCHAR2,
STATUS OUT VARCHAR2, --状态
TRANSTYPE OUT VARCHAR2, --类型
SEND OUT VARCHAR2, --发送方IP地址
LogicDest OUT Varchar2, --逻辑目标地址
DEST OUT VARCHAR2, --目标IP地址
MEMO OUT VARCHAR2 --备注,可写入发送失败时的错误号
)
AS
deq_options dbms_aq.dequeue_options_t;
deq_mess_properties dbms_aq.message_properties_t;
payload crane_tel;
queued_message_id RAW(16);
BEGIN
--Setup the payload
deq_options.consumer_name := 'CRANE_TEL';
deq_options.wait :=2;
BEGIN
dbms_aq.dequeue('CRANE_TEL',
deq_options,
deq_mess_properties,
payload,
queued_message_id);
EXCEPTION
WHEN OTHERS THEN
TRANSDATA := NULL;
STATUS := NULL;
TRANSTYPE := NULL;
SEND := NULL;
LogicDest := NULL;
DEST := NULL;
MEMO := NULL;
RETURN;
END;
TRANSDATA := PAYLOAD.TRANSDATA;
STATUS := PAYLOAD.STATUS;
TRANSTYPE := PAYLOAD.TRANSTYPE;
SEND := PAYLOAD.SEND;
LogicDest := PAYLOAD.LogicDest;
DEST := PAYLOAD.DEST;
MEMO := PAYLOAD.MEMO; END;
/ SHOW ERRORS;--接收队列中的数据。
SET SERVEROUTPUT ON;
DECLARE
TRANSDATA VARCHAR2(200);
STATUS VARCHAR2(2); --状态
TRANSTYPE VARCHAR2(1); --类型
SEND VARCHAR2(15); --发送方IP地址
LogicDest Varchar2(5); --逻辑目标地址
DEST VARCHAR2(15); --目标IP地址
MEMO VARCHAR2(30); --备注,可写入发送失败时的错误号
BEGIN
CRANE_TEL_DEQUEUE(TRANSDATA,STATUS,TRANSTYPE,SEND,LogicDest,DEST,MEMO);
DBMS_OUTPUT.PUT_LINE(TRANSDATA||','||STATUS||','||TRANSTYPE||','||SEND||','||LogicDest||','||DEST||','||MEMO);
END;
/
我提供一下比较好的方法吧。
Ax表中写纪录,通过多播消息出去,然后外面程序收到后将Ax表未报纪录
查询出来,再将数据发出到相应单位主机。
用队列也不是一个很好的方法,记录少时没有问题。普通服务器,每日<10万条
大于这个数不适合用队列。
另外Oracle的UTL_TCP包有问题,需要做一些特殊的配置,否则会宕机
当然是压力比较大的时候,我就因为这个问题被老板骂过,
你可要小心哦。