zoukankan      html  css  js  c++  java
  • DBLINK做系统集

    过度使用DBLINK做系统集成会带来的问题

    过度使用DBLINK做系统集成会带来很多问题,问题主要由以下几点:

     

    1. 大量消耗数据库资源;

     

    本地系统每通过DBLINK链接远端系统一次,都会生成一个本地session,如本地session不退出或者手动释放,只有通过session超时才能自动释放,会浪费大量的系统资源

     

    2. 容易出现数据库BUG;

     

    大量使用DBLINK,本地系统极易出现ORA-02068、ORA-03113、ORA-02080、ORA-02054、ORA-02050等Oracle错误,这种错误大部分会影响当前session正在处理的业务

     

    3. 性能较差;

     

    由于使用DBLINK,本地系统在获取数据时,每次链接都会对远端数据库进行一次全表扫描,且所有数据都会传输回本地数据库内,导致性能降低并且严重浪费当前系统资源。尤其出现一条sql语句从两个DBLINK中取数,更被称之为“性能杀手”,尤其是OLTP型数据库

     

    4. 数据传输不稳定,占用带宽严重,容易产生丢包风险;

     

    DBLINK本身没有数据存储、监控等功能,是通过网络中的数据库进行传输时,如果在传输过程中出现数据丢包现象,DBLINK本身不会发现,只用当业务进行完毕才能发现丢包现象,这样会影响当前正在处理的业务;另外,通过DBLINK查询的数据会像数据全部传至本地数据库进行操作,数据传输量很大,占用带宽严重,可能会导致网络堵塞

     

    5. Oracle数据功能受限

     

    DBLINK本身不支持对oracle LOB大对象的操作,在使用PROCDURE时,使用COMMIT等操作时可能会出现错误;

     

    6. 可扩展性较差

     

    如果多系统之间 使用DBLINK进行传输,每增加一个系统,都会增加一个或多个DBLINK链接或者修改对应的接口程序,如果修改其中一个接口,需要修改所有关联系统内的接口程序;

     

    7. 维护性差、安全性较低

     

    通过DBLINK进行链接需要将远端数据库用户名、密码、IP地址存在本地数据库,如远端进行密码修改、IP地址变更,本地数据库也需要修改,如果系统较多,每个系统都需要同时修改。切本地数据库管理员能够看到远端数据的密码、IP地址,对系统安全产生影响。

    在分析SQL性能的时候,经常需要确定资源消耗多的SQL,总结如下:

    1 查看值得怀疑的SQL
    select substr(to_char(s.pct,'99.00'),2)||'%'load,

           s.executions executes,

           p.sql_text

    from(select address,

                disk_reads,

                executions,

                pct,

                rank() over(order by disk_reads desc) ranking

             from(select address,

                         disk_reads,

                         executions,

                         100*ratio_to_report(disk_reads) over() pct

                     from sys.v_$sql

                    where command_type!=47)

            where disk_reads>50*executions) s,

           sys.v_$sqltext p

    where s.ranking<=5

      and p.address=s.address

    order by 1, s.address, p.piece;

    2 查看消耗内存多的sql

    select b.username ,a.buffer_gets ,a.executions,

           a.disk_reads/decode(a.executions,0,1,a.executions),a.sql_text SQL

    from v$sqlarea a,dba_users b

    where a.parsing_user_id = b.user_id

     and a.disk_reads >10000

    order by disk_reads desc;

    3 查看逻辑读多的SQL
    select*

    from(select buffer_gets, sql_text

         from v$sqlarea

         where buffer_gets>500000

         order by buffer_gets desc)

    where rownum<=30;

    4 查看执行次数多的SQL

    select sql_text, executions

    from(select sql_text, executions from v$sqlarea order by executions desc)

    where rownum<81;

    5 查看读硬盘多的SQL

    select sql_text, disk_reads

    from(select sql_text, disk_reads from v$sqlarea order by disk_reads desc)

    where rownum<21;

    6 查看排序多的SQL

    select sql_text, sorts

    from(select sql_text, sorts from v$sqlarea order by sorts desc)

    where rownum<21;

    7 分析的次数太多,执行的次数太少,要用绑变量的方法来写sql

    set pagesize 600;

    set linesize 120;

    select substr(sql_text,1,80) "sql",count(*),sum(executions) "totexecs"

    from v$sqlarea

    where executions<5

    group by substr(sql_text,1,80)

    having count(*)>30

    order by 2;

    8 游标的观察
    set pages 300;

    select sum(a.value), b.name

    from v$sesstat a, v$statname b

    where a.statistic#=b.statistic#

    and b.name='opened cursors current'

    group by b.name;

    select count(0) from v$open_cursor;

    select user_name, sql_text,count(0)

    from v$open_cursor

    group by user_name, sql_text

    having count(0)>30;

    9 查看当前用户&username执行的SQL
    select sql_text

    from v$sqltext_with_newlines

    where(hash_value, address) in

         (select sql_hash_value, sql_address

          from v$session

          where username='&username')

    order by address, piece;

  • 相关阅读:
    bzoj 2159 Crash 的文明世界
    bzoj 4241 历史研究
    数论大合集(柿子版)
    [IOI2005]mou
    CSP 2020 T3 函数调用
    线段树 --算法竞赛专题解析(24)
    树状数组 --算法竞赛专题解析(23)
    算法竞赛专题解析(22):数论--同余
    算法竞赛专题解析(21):数论--线性丢番图方程
    算法竞赛专题解析(20):数论--GCD和LCM
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/8065428.html
Copyright © 2011-2022 走看看