阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Oracle hint之DRIVING_SITE

408次阅读
没有评论

共计 6287 个字符,预计需要花费 16 分钟才能阅读完成。

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

但是注意对于 DML,DDL 语句,driving_site 提示是失效的,会自动被 Oracle 忽略掉,此时将以目标表所在库为主计划驱动,相当于 driving_site(目标表库);DML,DDL 中如果是对本地表做 DML,主计划总是在本地做,会将远程数据拉到本地,相当于 driving_site(本地表);如果是对远程表做 DML,主计划总是在远程做,会将本地数据送到远程,相当于自动 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 |            |          |        |      |

|*  2 |  HASH JOIN        |            |  327 |  8502 |    10  (10)| 00:00:01 |        |      |

|  3 |    REMOTE          | TEST_REMOTE |  327 |  4251 |    2  (0)| 00:00:01 | TO_S12 | R->S |

|  4 |    TABLE ACCESS FULL| TEST_LOCAL  |  1536 | 19968 |    7  (0)| 00:00:01 |        |      |

—————————————————————————————————

Predicate Information (identified by operation id):

—————————————————

  2 – access(“L”.”RN”=”R”.”RN”)

Remote SQL Information (identified by operation id):

—————————————————-

  3 – SELECT “RN” FROM “TEST_REMOTE” “R” (accessing

      ‘TO_S12.REGRESS.RDBMS.DEV.US.ORACLE.COM’ )

Note

—–

  – dynamic sampling used for this statement

已选择 27 行。

已用时间:  00: 00: 00.01

— 2. 通过 driving_site,将本地表 test_local 发送到远程执行,再将结果集返回本地。耗时 0.34m

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

  2  where l.rn = r.rn;

  COUNT(*)

———-

      1536

已用时间:  00: 00: 00.34

SQL> explain plan for

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

  3  where l.rn = r.rn;

已解释。

已用时间:  00: 00: 00.14

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

PLAN_TABLE_OUTPUT

——————————————————————————————————-

Plan hash value: 3396146028

——————————————————————————————————

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

——————————————————————————————————

|  0 | SELECT STATEMENT REMOTE|            |    1 |    26 |  4970  (1)| 00:01:00 |        |      |

|  1 |  SORT AGGREGATE        |            |    1 |    26 |            |          |        |      |

|*  2 |  HASH JOIN            |            |  327 |  8502 |  4970  (1)| 00:01:00 |        |      |

|  3 |    REMOTE              | TEST_LOCAL  |  327 |  4251 |    3  (0)| 00:00:01 |      ! | R->S |

|  4 |    TABLE ACCESS FULL  | TEST_REMOTE |  1130K|    14M|  4961  (1)| 00:01:00 | DWTEST |      |

——————————————————————————————————

Predicate Information (identified by operation id):

—————————————————

  2 – access(“A2″.”RN”=”A1″.”RN”)

Remote SQL Information (identified by operation id):

—————————————————-

  3 – SELECT “RN” FROM “TEST_LOCAL” “A2” (accessing ‘!’)

Note

—–

  – fully remote statement

  – dynamic sampling used for this statement

已选择 27 行。

已用时间:  00: 00: 00.01
 

4. 通过上面的测试,可以发现二者的执行时间是不一样的。我们再将二者分别执行 100 次,比较一下平均时间:

— 将远程表拉到本地执行,耗时 65.71(单位为 1 /100 秒)

SQL> set serveroutput on

SQL> declare

  2    n_count number;

  3    n_begin_time number;

  4    n_sum_time number;

  5  begin

  6    n_sum_time := 0;

  7    for n_loop in 1..100 loop

  8      n_begin_time := dbms_utility.get_cpu_time;

  9      select count(*)

 10        into n_count

 11        from test_local l, test_remote@to_s12 r

 12        where l.rn = r.rn;

 13      n_sum_time := n_sum_time + (dbms_utility.get_cpu_time – n_begin_time);

 14    end loop;

 15    dbms_output.put_line(‘avg cpu_time:’||(n_sum_time/100));

 16  end;

 17  /

avg cpu_time:65.71

PL/SQL 过程已成功完成。

已用时间:  00: 01: 28.39

— 将本地表发送到远程执行,再将结果返回到本地,耗时 0.05(单位为 1 /100 秒)

SQL> declare

  2    n_count number;

  3    n_begin_time number;

  4    n_sum_time number;

  5  begin

  6    n_sum_time := 0;

  7    for n_loop in 1..100 loop

  8      n_begin_time := dbms_utility.get_cpu_time;

  9      select/*+driving_site(r)*/ count(*)

 10        into n_count

 11        from test_local l, test_remote@to_s12 r

 12        where l.rn = r.rn;

 13      n_sum_time := n_sum_time + (dbms_utility.get_cpu_time – n_begin_time);

 14    end loop;

 15    dbms_output.put_line(‘avg cpu_time:’||(n_sum_time/100));

 16  end;

 17  /

avg cpu_time:.05

PL/SQL 过程已成功完成。

已用时间:  00: 00: 23.14
 

5. 结论

在分布式查询中,当一张表比较小,而且最终得到的结果集也比较小的话,使用 driving_site 将小表发送到大表端执行是比较快的。

更多 Oracle 相关信息见 Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12

本文永久更新链接地址 :http://www.linuxidc.com/Linux/2017-03/142368.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计6287字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19348
评论数
4
阅读量
7803169
文章搜索
热门文章
开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南 大家好,我是星哥。之前介绍了腾讯云的 Code...
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板 1Panel:小白轻松构建 Web 服务与面板加固指南 哈喽,我是星哥,经常有人问我不...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
把小米云笔记搬回家:飞牛 NAS 一键部署,小米云笔记自动同步到本地

把小米云笔记搬回家:飞牛 NAS 一键部署,小米云笔记自动同步到本地

把小米云笔记搬回家:飞牛 NAS 一键部署,小米云笔记自动同步到本地 大家好,我是星哥,今天教大家在飞牛 NA...
星哥带你玩飞牛NAS-1:安装飞牛NAS

星哥带你玩飞牛NAS-1:安装飞牛NAS

星哥带你玩飞牛 NAS-1:安装飞牛 NAS 前言 在家庭和小型工作室场景中,NAS(Network Atta...
开发者福利:免费 .frii.site 子域名,一分钟申请即用

开发者福利:免费 .frii.site 子域名,一分钟申请即用

  开发者福利:免费 .frii.site 子域名,一分钟申请即用 前言 在学习 Web 开发、部署...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
4盘位、4K输出、J3455、遥控,NAS硬件入门性价比之王

4盘位、4K输出、J3455、遥控,NAS硬件入门性价比之王

  4 盘位、4K 输出、J3455、遥控,NAS 硬件入门性价比之王 开篇 在 NAS 市场中,威...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
星哥带你玩飞牛NAS-12:开源笔记的进化之路,效率玩家的新选择

星哥带你玩飞牛NAS-12:开源笔记的进化之路,效率玩家的新选择

星哥带你玩飞牛 NAS-12:开源笔记的进化之路,效率玩家的新选择 前言 如何高效管理知识与笔记,已经成为技术...
星哥带你玩飞牛NAS-16:飞牛云NAS换桌面,fndesk图标管理神器上线!

星哥带你玩飞牛NAS-16:飞牛云NAS换桌面,fndesk图标管理神器上线!

  星哥带你玩飞牛 NAS-16:飞牛云 NAS 换桌面,fndesk 图标管理神器上线! 引言 哈...
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
4盘位、4K输出、J3455、遥控,NAS硬件入门性价比之王

4盘位、4K输出、J3455、遥控,NAS硬件入门性价比之王

  4 盘位、4K 输出、J3455、遥控,NAS 硬件入门性价比之王 开篇 在 NAS 市场中,威...
支付宝、淘宝、闲鱼又双叕崩了,Cloudflare也瘫了连监控都挂,根因藏在哪?

支付宝、淘宝、闲鱼又双叕崩了,Cloudflare也瘫了连监控都挂,根因藏在哪?

支付宝、淘宝、闲鱼又双叕崩了,Cloudflare 也瘫了连监控都挂,根因藏在哪? 最近两天的互联网堪称“故障...