发现dblink如果很慢可以用这种方式加个/*+driving_site(xxx)*/,查询很快

DBLINK HINT /*+ driving_site(org) */ 优化策略和思路

使用DBLINK远程访问数据库的优化策略和思路:

策略:远程访问,网络传输占很大部分,优化原则,减少网络传输,将小的结果集拉到本地处理;

思路1:在远端建立视图;

思路2:使用DRIVING_SITE将数据拉到本地处理;

出现这种执行计划,主要原因是使用了db link,要想看到执行计划,可以加 hint,如: 
/*+remote_mapping(db_link)*/或/*+driving_site(table_name)*/

用法:   /*+driving_site(table_name)*/  : table_name 一般是大表!

在近期的一个数据库查询统计中,需要通过db_link跨库进行表的关联,其中A库 中的某张拥有百万以上数据的表与B库 中的拥有千条记录以上的表进行关联。两张表进行关联的字段都建有索引。但在实际查询中如果从B库进行两表的关联却会导致A库中大表的全表扫描,查询速度慢是次要的,关键是全表扫描会影响到A库的正常运行。

通过对SQL语句的不断调整、优化发现当两表进行简单的关联查询时,如果在select 后面采用"*"获取所有数据时,查询不会导致全表扫描,但在select 后面取具体字段时将会导致大表的全表扫描。

在简单查询的基础上进行group分组将直接导致大表的全表扫描,在此种情况下,所有的语句优化技巧都将失效,因为索引无效,此时必须采取特殊的方法建立起关联查询的索引,强制指定在关联过程中那一张表作为主要驱动表,那一张作为从表。在跨库关联查询的过程中,因为表不在同一个数据库中(同时在不同操作系统的服务器上)将导致关联过程中将一张表的数据提取到另一个数据库中进行关联。此时问题出现,如果在关联过程中将大表数据提取到小表所在库进行运算将导致大表的全表扫描,整个运算过程将非常慢且影响A库的正常运行。

最终解决全表扫描的办法是,如果在B库对不同数据库的两张大小表进行关联时,通过driving_site强制指定主驱动表,即以所指定的表为主要表,将其它表作为从表提取到驱动表所在的库进行关联运算。具体语句如下:

select /*+driving_site(main)*/  a.*,b.* from A.a main@BigTableDB,B.b minor where main.id=minor.id and .......

这样一来就可以避免大表所在库的全表扫描,查询速度将成级数级提高。

解释:

当指定 /*+driving_site(main)*/ 时, oracle将会从minor表获取全部数据到main表所在的数据库来进行关联运算.(索引起作用,速度快)
若指定 /*+driving_site(minor)*/ 时, oracle将会从main表获取全部数据到minor表所在的数据库来进行关联运算.(索引失败,全表扫描)

当然Oracle中有很多的关键字用于指定关联查询时的运算方法,等后面碰到具体应用实例实再作一一介绍。

引用:

DRIVING_SITE 作用和 ORDERED 类似。 DRIVING_SITE 通常在分布式查询中使用。如果没有这个提示, Oracle 会先从远程点检索,并将它们连接到本地站点中。通过使用 DRIVING_SITE ,我们可以先在本地进行检索,将检索后的数据发送到远程节点进行连接

优化案例:

--create or replace view v_fasp_bjjzzfyszxqkfld2 as
select a.bdgmanagedivision,a.gnkm,acctdate,sum(a.yszb) yszb,sum(a.zjzfjh) zjzfjh ,sum(a.sqzfjh) sqzfjh,
       sum(a.zjzfzc) zjzfzc,sum(a.sqzfzc) sqzfzc,sum(a.zjzfjhjy) zjzfjhjy,sum(a.sqzfjhjy) sqzfjhjy
from
(select /*+ driving_site(t) */ t.mb_code as bdgmanagedivision,substr(t.bs_code,1,3) gnkm,substr(t.create_date,1,4)||substr(t.create_date,6,2)||substr(t.create_date,9,2) as acctdate,
         sum(t.budget_money) yszb,0 as jhje, 0 as zjzfjh,0 as sqzfjh,0 as zcje,0 as zjzfzc,0 as sqzfzc,
         --0 as zcjezt,0 as zjzfzczt,0 as sqzfzczt,
         0 as jhjy,0 as zjzfjhjy,0 as sqzfjhjy
         --0 as jhkyje,0 as zjzfjhkyje,0 as sqzfjhkyje
              from vw_budget_useable_voucher@chunyuan_link t
              where t.en_code not like '910%'
              --and t.pk_code like '1%'
              and t.bo_code='001001'
              and t.is_end =1
              and t.is_valid=1
              and t.bl_code like '001001%' and t.budget_vou_id is not null  group by t.mb_code,substr(t.bs_code,1,3),
   substr(t.create_date,1,4)||substr(t.create_date,6,2)||substr(t.create_date,9,2)  --支付系统录入指标
   union all
  select c.mb_code bdgmanagedivision,substr(c.bs_code,1,3) gnkm,plan_pay.acctdate,
    0 as yszb,
    nvl(plan_pay.zj_plan_money+plan_pay.sq_plan_money,0) jhje,
    nvl(plan_pay.zj_plan_money,0) zjzfjh,nvl(plan_pay.sq_plan_money,0) sqzfjh,
    nvl(plan_pay.zj_pay_money+plan_pay.sq_pay_Money,0) zcje,
    nvl(plan_pay.zj_pay_money,0) zjzfzc,nvl(plan_pay.sq_pay_Money,0) sqzfzc,
    nvl((plan_pay.zj_plan_money+plan_pay.sq_plan_money)-(plan_pay.zj_pay_money+plan_pay.sq_pay_Money),0) jhjy,
    nvl(plan_pay.zj_plan_money,0)-nvl(plan_pay.zj_pay_money,0) zjzfjhjy,
    nvl(plan_pay.sq_plan_money,0)-nvl(plan_pay.sq_pay_Money,0) sqzfjhjy
--20130507将gl_balance修改为(select sum_id,ccid from gl_balance_month_detail where set_month>0 group by sum_id,ccid) g
--解决计划额度ID号953119,6月份计划,新的额度,在GL_BALANCE表中还没有对应的记录。
from (select /*+ driving_site(c) */ sum_id,ccid,rcid from gl_balance_month_detail@chunyuan_link where set_month>0 group by sum_id,ccid,rcid) g,
       vw_plan_voucher_nmg702@chunyuan_link c,
        (select plan.toctrlid,plan.acctdate acctdate,
                sum(zj_plan_money) zj_plan_money,
                sum(sq_plan_money) sq_plan_money,
                sum(zj_pay_money) zj_pay_money,
                sum(sq_pay_Money) sq_pay_Money
            from
            --查询计划数据
            (select /*+ driving_site(p) */ p.toctrlid,substr(p.create_date,1,4)||substr(p.create_date,6,2)||substr(p.create_date,9,2) as acctdate,
                    sum(case when p.PK_CODE like '11%' then p.plan_money else 0 end) zj_plan_money,
                    sum(case when p.PK_CODE like '12%' then p.plan_money else 0 end) sq_plan_money
                      from vw_plan_voucher@chunyuan_link p ,gl_journal@chunyuan_link g
                      where p.ID=g.vou_id and p.is_valid=1 and g.is_end=1 and g.set_month>0 and g.billtype_code not like '1%'
                      and p.budget_vou_id is not null 
                      group by p.toctrlid,substr(p.create_date,1,4)||substr(p.create_date,6,2)||substr(p.create_date,9,2)
            ) plan,
            --查询支出数据
            (select /*+ driving_site(p) */ p.fromctrlid,substr(p.create_date,1,4)||substr(p.create_date,6,2)||substr(p.create_date,9,2) as acctdate,
                    sum(case when (p.PK_CODE like '11%' and p.clear_date is not null and g.is_end=1) then p.pay_money else 0 end) zj_pay_money,
                    sum(case when (p.PK_CODE like '12%' and p.clear_date is not null and g.is_end=1) then p.pay_money else 0 end) sq_pay_money
                 from vw_pay_voucher@chunyuan_link p ,gl_journal@chunyuan_link g
                where p.ID=g.vou_id(+) and p.is_valid=1   and g.set_month>0 and g.billtype_code like '3%'
                and p.budget_vou_id is not null 
              group by p.fromctrlid,substr(p.create_date,1,4)||substr(p.create_date,6,2)||substr(p.create_date,9,2)
            ) pay
        where plan.toctrlid=pay.fromctrlid(+)
        group by plan.toctrlid,plan.acctdate
        ) plan_pay
where g.sum_id=plan_pay.toctrlid  and g.sum_id=c.toctrlid  and g.rcid=c.rcid --and g.ccid=c.CCID and g.set_month>0
and (plan_pay.zj_pay_money<>'0' or plan_pay.sq_pay_Money<>'0' or plan_pay.zj_plan_money<>'0' or plan_pay.sq_plan_money<>'0')
and c.en_code not like '910%'
and c.bo_code='001001'
and c.bl_code like '001001%'
and  exists(select /*+ driving_site(org) */ 1 from sys_user_org@chunyuan_link org where org.user_id = '7569' and org.org_id = c.MB_id) and 1=1
)a
group by a.bdgmanagedivision,a.gnkm,a.acctdate order by a.bdgmanagedivision,a.gnkm;

dblink如果很慢可以用这种方式优化的更多相关文章

  1. .net 调用java service 代理类方法

        通过Svcutil.exe 工具生成代理类调用 1.找到如下地址“C:\Windows\System32\cmd.exe”  命令行工具,右键以管理员身份运行(视系统是否为win7 而定) 2 ...

  2. MySQL优化之表结构优化的5大建议(数据类型选择讲的很好)

    殊不知,在N年前被奉为"圣经"的数据库设计3范式早就已经不完全适用了.这里我整理了一些比较常见的数据库表结构设计方面的优化技巧,希望对大家有用. 由于MySQL数据库是基于行(Ro ...

  3. 【转】Google 发布 Android 性能优化典范(比较老,但很实用)

    2015年伊始,Google发布了关于Android性能优化典范的专题, 一共16个短视频,每个3-5分钟,帮助开发者创建更快更优秀的Android App.课程专题不仅仅介绍了Android系统中有 ...

  4. 关于数据库SQL优化

    1.数据库访问优化   要正确的优化SQL,我们需要快速定位能性的瓶颈点,也就是说快速找到我们SQL主要的开销在哪里?而大多数情况性能最慢的设备会是瓶颈点,如下载时网络速度可能会是瓶颈点,本地复制文件 ...

  5. sql优化(原理,方法,特点,实例)

    整理的有点多,做好心理准备...... 1.资源优化理解: 不同设备,io不同.每种设备都有两个指标:延时(响应时间):表示硬件的突发处理能力:带宽(吞吐量):代表硬件持续处理能力. 每种硬件主要的工 ...

  6. 转载:SqlServer数据库性能优化详解

    本文转载自:http://blog.csdn.net/andylaudotnet/article/details/1763573 性能调节的目的是通过将网络流通.磁盘 I/O 和 CPU 时间减到最小 ...

  7. Mysql高并发优化

    一.数据库结构的设计 1.数据行的长度不要超过8020字节,如果超过这个长度的话在物理页中这条数据会占用两行从而造成存储碎片,降低查询效率. 2.能够用数字类型的字段尽量选择数字类型而不用字符串类型的 ...

  8. 高效率http页面优化法则一【JS对DOM的操作】

    高效http页面优化法则一很多人都认为JS的效率太慢了,都不愿意用js来实现相对困难一点的程序逻辑.在这里我要说的是其实js的效率并不慢,慢的是DOM,如果操作好DOM,你的js效率将提高接近千倍(这 ...

  9. 高性能Linux服务器 第10章 基于Linux服务器的性能分析与优化

    高性能Linux服务器 第10章    基于Linux服务器的性能分析与优化 作为一名Linux系统管理员,最主要的工作是优化系统配置,使应用在系统上以最优的状态运行.但硬件问题.软件问题.网络环境等 ...

随机推荐

  1. 也谈基于NodeJS的全栈式开发(基于NodeJS的前后端分离)

    前言 为了解决传统Web开发模式带来的各种问题,我们进行了许多尝试,但由于前/后端的物理鸿沟,尝试的方案都大同小异.痛定思痛,今天我们重新思考了“前后端”的定义,引入前端同学都熟悉的NodeJS,试图 ...

  2. 获取字符宽度:并非自适应。coretext去计算

    获取字符宽度:并非自适应.coretext去计算 UniChar ch = [ns_str characterAtIndex:0]; CGGlyph glyph = 0; CTFontGetGlyph ...

  3. EF具体用在什么类型的项目上

    一般来说,使用EF框架,肯定会比直接使用ADO.NET,消耗的时间多一些. 因为使用ADO.NET直接把SQL语句传回数据库执行. 而使用EF框架的话,会把所用到的尸体,转换成相对应得SQL,然后再传 ...

  4. 使用JDBC进行数据库的事务操作(2)

    本篇将讲诉如何使用JDBC进行数据库有关事务的操作.在上一篇博客中已经介绍了事务的概念,和在MySQL命令行窗口进行开启事务,提交事务以及回滚事务的操作. 似乎事务和批处理都可以一次同时执行多条SQL ...

  5. 关于在打包Jar文件时遇到的资源路径问题(二)

    在关于<关于在打包Jar文件时遇到的资源路径问题(一)>中,以及描述了当资源与可执行JAr分离时的资源路径代码的编写问题,后来想了想,为什么将<Java核心技术卷一>中的程序1 ...

  6. Beautiful Soup 中文文档

    Beautiful Soup 3.0 中文文档说明: http://www.crummy.com/software/BeautifulSoup/bs3/documentation.zh.html Be ...

  7. VC++ WIN32 sdk实现按钮自绘详解 之二(关键是BS_OWNERDRAW和WM_DRAWITEM)

    网上找了很多,可只是给出代码,没有详细解释,不便初学者理解.我就抄回冷饭.把这个再拿出来说说. 实例图片:    首先建立一个标准的Win32 Application 工程.选择a simple Wi ...

  8. 如何在Linux上检查SSH的版本(转)

    SSH协议规范存在一些小版本的差异,但是有两个主要的大版本:SSH1 (版本号 1.XX) 和 SSH2 (版本号 2.00). 事实上,SSH1和SSH2是两个完全不同互不兼容的协议.SSH2明显地 ...

  9. javascript json格式解析方法

    json.parse用于从一个字符串中解析出json对象 stringify()用于从一个对象解析出字符串 var dataObj = eval("("+json+")& ...

  10. 禁用viewstate

    <asp:Dropdownlist/>禁用viewstate以后 public partial class _Default : System.Web.UI.Page     {      ...