水平很低回答你两个问题问题二:有以上方法实现过程有将有一个各单位的逻辑名如(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字段上,应该会采用索引,还和你使用的优化模式有关
基于规则与基于优化

解决方案 »

  1.   

    谢谢大家的讨论!另一个讨论区:
    http://expert.csdn.net/Expert/topic/1300/1300019.xml?temp=.5857965
      

  2.   

    1.用AQ没有什么不好的(仅凭书本知识).SOCKET我也曾经写过,不过是JAVA的.一次用两个触发器,对数据库的性能影响太大!建议:触发器最好少用.
    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公司吧.以上仅仅为个人看法,大家多指教.
    [小数点]你的文章能不能给我发个全的?给我留言,我给你邮箱,先谢谢了.
      

  3.   

    : hnxyy(大师) :
    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;
    /
      

  4.   

    你的方法是一个比较简单的方法,所以效率比较低。
    我提供一下比较好的方法吧。
    Ax表中写纪录,通过多播消息出去,然后外面程序收到后将Ax表未报纪录
    查询出来,再将数据发出到相应单位主机。
    用队列也不是一个很好的方法,记录少时没有问题。普通服务器,每日<10万条
    大于这个数不适合用队列。
    另外Oracle的UTL_TCP包有问题,需要做一些特殊的配置,否则会宕机
    当然是压力比较大的时候,我就因为这个问题被老板骂过,
    你可要小心哦。
      

  5.   

    AQ队列中的数据处理完后就会从队形中删除,任何一种队列的基本原理都是这样的。所以队列中数据的大小完全是由处理速度决定的,如果处理得快,可能没有待处理的数据停在队列中。另外,如果考虑用管道的话,就肯定不如AQ好。