设为首页 加入收藏

TOP

Oracle hint之DRIVING_SITE(一)
2017-04-07 10:24:34 】 浏览:560
Tags:Oracle hint DRIVING_SITE

日常工作中经常会用到分布式数据库查询,即通过DBLINK同时查询本地表和远程表。分布式查询一般有两种处理方式:一种将远程表数据取回本地,然后和本地表关联查询,获取最终结果;另一种将本地表数据传到远程和远程表关联查询后,再将关联结果取回。前一种处理方式可理解为只有一次网络传输操作比后一种少,也就作为了数据库的默认处理方式;driving_site提示能够指定执行计划在远程还是本地做,使用driving_site,特别是本地小结果集,远程大结果集,最终结果集较小时,希望计划在远程驱动,这样远程执行完毕,将结果集传输到本地,避免了大结果集的网络传输,从而达到整体优化的效果。


1.  driving_site优化,以减少总体的网络传输数据量为目标;


2.  当driving_site驱动的对象嵌套在视图中时,可通过driving_site(V.T)方式来指定,其中V表示视图别名或名称,T表示视图里表的别名或名称;


3. DML,DDL语句中driving_site提示无效,总是会以目标表所在的库为主计划驱动,此时可以通过视图转换来达到优化目的。


这个提示在分布式数据库操作中有用,指定表处理连接所在的位置。可以限制通过网络处理的信息量。此外,还可以建立远程表的本地视图来限制从远程站点检索的行。本地视图应该有where子句,从而视图可以在将行发送回本地数据库之前限制从远程数据库返回的行。


driving_site用于分布式查询中,指定数据集发送到那个数据库上执行。在某些情况下可以大大提高SQL的性能。下面是一个小测试:


1. 在远程数据库上,创建测试表test_remote


pd@DWTEST>create table test_remote


  2  as


  3  select rownum rn, a.* from user_objects a;


Table created.


pd@DWTEST>insert into test_remote select * from test_remote;


10 rows created.


pd@DWTEST>/


20 rows created.


pd@DWTEST>/


40 rows created.


pd@DWTEST>/


...


655360 rows created.


pd@DWTEST>update test_remote set rn = rownum;


1310720 rows updated.


pd@DWTEST>commit;


Commit complete.
 


2. 在本地数据库,创建测试表test_local:


C:\Documents and Settings\yuechao.tianyc>sqlplus test/test


SQL*Plus: Release 10.2.0.1.0 - Production on 星期三 4月 29 14:37:24 2009


Copyright (c) 1982, 2005, Oracle.  All rights reserved.


连接到:


Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production


With the Partitioning, OLAP and Data Mining options


SQL> drop table test_local purge;


表已删除。


SQL> create table test_local


  2  as


  3  select rownum rn, a.* from user_objects a;


表已创建。


SQL> insert into test_local select * from test_local;


已创建48行。


SQL> /


...


已创建768行。


SQL> update test_local set rn = rownum;


已更新1536行。


SQL> commit;


提交完成。
 


3. 通过driving_site,比较数据在远程和本地执行速度的不同:


-- 1. 直接执行SQL,耗时0.93m,通过执行计划发现是将远程表test_remote拉到本地后执行hash join的。


SQL> set timing on


SQL> set linesize 1000


SQL> set pagesize 100


SQL> explain plan for


  2  select count(*) from test_local l, test_remote@to_s12 r


  3  where l.rn = r.rn;


已解释。


已用时间:  00: 00: 00.00


SQL> select count(*) from test_local l, test_remote@to_s12 r


  2  where l.rn = r.rn;


  COUNT(*)


----------


      1536


已用时间:  00: 00: 00.93


SQL> select * from table(dbms_xplan.display);


PLAN_TABLE_OUTPUT


---------------------------------------------------------------------------------------------------


Plan hash value: 2814429697


---------------------------------------------------------------------------------------------------


| Id  | Operation          | Name        | Rows  | Bytes | Cost (%CPU)| Time    | Inst  |IN-OUT|


---------------------------------------------------------------------------------------------------


|  0 | SELECT STATEMENT    |            |    1 |    26 |    10  (10)| 00:00:01 |        |      |


|  1 |  SORT AGGREGATE    |            |    1 |    26 |            |          |      &nbs

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Linux2.6内核下的MySQL5.5通用包.. 下一篇服务器时间异常造成ORA-00600 [22..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目