dblink如果很慢可以用这种方式优化

发现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 [email protected],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 [email protected]_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 [email protected]_link where set_month>0 group by sum_id,ccid,rcid) g,
       [email protected]_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 [email protected]_link p ,[email protected]_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 [email protected]_link p ,[email protected]_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 [email protected]_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;

时间: 2024-12-29 07:30:20

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

.net 调用java service 代理类方法

    通过Svcutil.exe 工具生成代理类调用 1.找到如下地址"C:\Windows\System32\cmd.exe"  命令行工具,右键以管理员身份运行(视系统是否为win7 而定) 2.输入如下命令:"C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin\SvcUtil.exe" /out:C:\WCFClint\ClientCode.cs /config:C:\WCFClint\app.config h

iOS性能优化之“优化总体原则”(性能优化很重要,为什么你们都没有用?)

笔者由于在iOS开发过程中做过一些优化的工作,对iOS性能优化有一些粗浅的认识,一直想把自己这些经验,简单总结一下. 作为整个系列的第一篇,我打算针对iOS的优化中的一些总体原则做一些总结.因为我觉得无论列表流畅度优化也好.启动时间优化也好还是说其他方面的优化,都有一些共性的原则,只有掌握了这些总体性的原则,才能够更好的做优化,给我们具体的优化任务指明方向,让我们少绕弯路.后面如果时间允许,我可能会写一些关于列表流畅度.启动时间和内存优化等方面的文章. 作为一个开发者,有一个学习的氛围跟一个交流

数据库的优化(转)

1.数据库访问优化法则 要正确的优化SQL,我们需要快速定位能性的瓶颈点,也就是说快速找到我们SQL主要的开销在哪里?而大多数情况性能最慢的设备会是瓶颈点,如下载时网络速度可能会是瓶颈点,本地复制文件时硬盘可能会是瓶颈点,为什么这些一般的工作我们能快速确认瓶颈点呢,因为我们对这些慢速设备的性能数据有一些基本的认识,如网络带宽是2Mbps,硬盘是每分钟7200转等等.因此,为了快速找到SQL的性能瓶颈点,我们也需要了解我们计算机系统的硬件基本性能指标,下图展示的当前主流计算机性能指标数据.   从

50种方法优化SQL Server数据库查询(转载)

原文地址:http://www.cnblogs.com/zhycyq/articles/2636748.html 查询速度慢的原因很多,常见如下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 5.网络速度慢 6.查询出的数据量过大(可以采用多次查询,其他的方法降低数据量) 7.锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷) 8.sp_lock,sp_who,活动的用

大数据量高并发的数据库优化

一.数据库结构的设计 如果不能设计一个合理的数据库模型,不仅会增加客户端和服务器段程序的编程和维护的难度,而且将会影响系统实际运行的性能.所以,在一个系统开始实施之前,完备的数据库模型的设计是必须的. 在一个系统分析.设计阶段,因为数据量较小,负荷较低.我们往往只注意到功能的实现,而很难注意到性能的薄弱之处,等到系统投入实际运行一段时间后,才发现系统的性能在降低,这时再来考虑提高系统性能则要花费更多的人力物力,而整个系统也不可避免的形成了一个打补丁工程. 所以在考虑整个系统的流程的时候,我们必须

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

本文转载自:http://blog.csdn.net/andylaudotnet/article/details/1763573 性能调节的目的是通过将网络流通.磁盘 I/O 和 CPU 时间减到最小,使每个查询的响应时间最短并最大限度地提高整个数据库服务器的吞吐量.为达到此目的,需要了解应用程序的需求和数据的逻辑和物理结构,并在相互冲突的数据库使用之间(如联机事务处理 (OLTP) 与决策支持)权衡. 对性能问题的考虑应贯穿于开发阶段的全过程,不应只在最后实现系统时才考虑性能问题.许多使性能得

Citrix XenDesktop Studio 7.x & StoreFront控制台打开速度慢终极优化

部署过CitrixXenDesktop的同学们都知道,Studio控制台与StoreFront控制台某些时候打开慢的那叫一个纠结啊,尤其是等待排除某些问题的时候,等待是很煎熬的,好了废话少说,下面我来给大家说一下Studio的优化,不是很快吧,起码比不优化能节省上很长时间. 这些优化设置建议在部署Citrix环境的时候做到模板中,这样就避免了出来后一台一台修改 优化步骤 1. IE设置 Citrix XenDesktop现在也开始走我大微软的路子,默认内部的很多通讯采用Powershell,WS

Android 性能优化探究

使用ViewStub动态加载布局,避免一些不经常的视图长期握住引用: ViewStub的一些特点: 1. ViewStub只能Inflate一次,之后ViewStub对象被置空:某个被ViewStub指定的布局被Inflate后,就不会够再通过ViewStub来控制它了. 2. ViewStub只能用来Inflate一个布局文件,而不是某个具体的View,当然也可以把View写在某个布局文件中. 基于以上的特点,那么可以考虑使用ViewStub的情况有: 1. 在程序的运行期间,某个布局在Inf

数据库及SQL优化

一.数据库结构的设计 如果不能设计一个合理的数据库模型,不仅会增加客户端和服务器段程序的编程和维护的难度,而且将会影响系统实际运行的性能.所以,在一个系统开始实施之前,完备的数据库模型的设计是必须的. 在一个系统分析.设计阶段,因为数据量较小,负荷较低.我们往往只注意到功能的实现,而很难注意到性能的薄弱之处,等到系统投入实际运行一段时间后,才发现系统的性能在降低,这时再来考虑提高系统性能则要花费更多的人力物力,而整个系统也不可避免的形成了一个打补丁工程. 所以在考虑整个系统的流程的时候,我们必须