18c分布式事务 oracle_浅谈ORACLE的分布式事务

平台环境: suk: linux as4 oracle 9201 primary: windows xp oracle 10.2.0.3 首先在primary数据库上建立测试数据。 SQL create table test as select * from dba_objects; Table created. SQL insert into test select * from test; 9873 rows created. SQ

平台环境:

suk: linux as4 + oracle 9201

primary: windows xp + oracle 10.2.0.3

首先在primary数据库上建立测试数据。

SQL> create table test as select * from dba_objects;

Table created.

SQL> insert into test select * from test;

9873 rows created.

SQL> /

19746 rows created.

SQL> /

39492 rows created.

SQL> /

78984 rows created.

SQL> /

157968 rows created.

SQL> /

315936 rows created.

SQL> commit;

Commit complete.

以下操作都是在suk数据库上执行:

一、例子1:先看两个表都在(同一个)远端

suk@ORACLE9I> select owner,count(1) fromtest@primary,dual@primary group by owner;

已选择8行。

已用时间: 00: 00: 00.87

执行计划

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

0 SELECT STATEMENT (REMOTE) Optimizer=ALL_ROWS (Cost=1824 Card

=670910 Bytes=11405470)

1 0 HASH (GROUP BY) (Cost=1824 Card=670910 Bytes=11405470)

2 1 NESTED LOOPS (Cost=1758 Card=670910 Bytes=11405470)

3 2 FAST DUAL (Cost=2 Card=1)

4 2 TABLE ACCESS (FULL) OF 'TEST' (TABLE) (Cost=1756 Card= PRIMARY

670910 Bytes=11405470)

suk@ORACLE9I> select /*+ rule */ owner,count(1) fromtest@primary,dual@primary group

by owner;

已选择8行。

已用时间: 00: 00: 00.89

执行计划

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

0 SELECT STATEMENT (REMOTE) Optimizer=HINT: RULE

1 0 SORT (GROUP BY)

2 1 NESTED LOOPS

3 2 FAST DUAL

4 2 TABLE ACCESS (FULL) OF 'TEST' (TABLE) PRIMARY

以上两个例子可以说明:不管是CBO还是RBO,如果SQL中涉及的表都是远端的,那么该语句在远端执行,在得到结果后返回调用端。

这一点我们可以从执行计划的SELECT STATEMENT (REMOTE)看出。

疑问:如果例子里两个表是来自两个不同远端数据库,那么两个表的表连接操作会发生在哪里?是提交该sql语句的本地数据库【倾向于此】,还是两个不同远端数据库中的一个?

注释:SELECT STATEMENT (REMOTE)是上述一个执行计划里所有操作的根操作,即是这个执行计划发起的第一个操作,后续的操作都是由它而产生的,它是一个提纲挈领的源操作。而该源操作SELECT STATEMENT (REMOTE)里的REMOTE表示该源操作所在的执行计划是来自远端的数据库的,不是本地数据库上执行的执行计划。而像源操作SELECT

STATEMENT里的没有REMOTE表示该源操作所在的执行计划就是来自本地数据库的,不是远端数据库上执行的执行计划。

二、例子2:两个包含了本地表和远端表的查询

接着再看两个包含了本地表和远端表的查询:

suk@ORACLE9I> select owner,count(1) fromtest@primary,dual group by owner;

已选择8行。

已用时间: 00: 00: 03.92

执行计划

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

0 SELECT STATEMENT Optimizer=CHOOSE

1 0 SORT (GROUP BY)

2 1 NESTED LOOPS

3 2 TABLE ACCESS (FULL) OF 'DUAL'

4 2 REMOTE* PRIMARY

4 SERIAL_FROM_REMOTE SELECT "OWNER" FROM "TEST" "TEST"

suk@ORACLE9I> select /*+ rule */ owner,count(1) fromtest@primary,dual group by owner;

已选择8行。

已用时间: 00: 00: 03.45

执行计划

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

0 SELECT STATEMENT Optimizer=HINT: RULE

1 0 SORT (GROUP BY)

2 1 NESTED LOOPS

3 2 TABLE ACCESS (FULL) OF 'DUAL'

4 2 REMOTE* PRIMARY

4 SERIAL_FROM_REMOTE SELECT "OWNER" FROM "TEST" "TEST"

从以上两个执行结果可以看出:无论是CBO还是RBO,当查询包含了本地表和远端表时,oracle总是先把远端表的数据通过网络传送到SQL的发起端,再跟本地表进行关联得到最终结果。

从SELECT STATEMENT和SERIAL_FROM_REMOTE SELECT "OWNER" FROM "TEST" "TEST"可以看出SQL是取得远端数据后在本地执行。

疑问:如果是两个表执行union all操作,也是oracle总是先把远端表的数据通过网络传送到SQL的发起端,再跟本地表进行union all操作得到最终结果吗?

同时,要注意一个现象:如果SQL涉及的表都在远端,SQL共耗费不到1秒的时间;而如果一个表在本地,一个表在远端,返回相同的结果SQL耗费时间达到3秒多。

还要注意的是:在这种分布式事务中,看执行计划的资源消耗统计部分是没有意义的,因为本地(SQL的发起端)是不知道远端数据库的资源消耗情况。这句话是针对例子2:两个包含了本地表和远端表的查询来说的,而例子1:先看两个表都在(同一个)远端里执行计划的资源消耗统计部分是有意义的,因为该执行计划就是来自远端数据库,故而自然知道远端数据库的资源消耗情况。

三、hint:driving_site对分布式查询调优的适用情况

到这里,可能很多人都会想到:如果本地表很小,远端表(准确来说是数据源)很大,且返回结果比较少的情况下,将远端表(大表)传送到本地将会引起很大的资源消耗。

很明显,要解决这样的问题,最好是把本地表数据传送到远端,然后让SQL在远端执行,得到结果后再返回到SQL发起端。

幸运的是,oracle提供一个hint来应对这种情况:driving_site

下面我们用这个hint来测试一下:

suk@ORACLE9I> select /*+ driving_site(test) */owner,count(1) fromtest@primary,dual group by

owner;

已选择8行。

已用时间: 00: 00: 01.25

执行计划

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

0 SELECT STATEMENT (REMOTE) Optimizer=ALL_ROWS (Cost=8404591 C

ard=5479992102 Bytes=93159865734)

1 0 HASH (GROUP BY) (Cost=8404591 Card=5479992102 Bytes=931598

65734)

2 1 MERGE JOIN (CARTESIAN) (Cost=7524913 Card=5479992102 Byt

es=93159865734)

3 2 TABLE ACCESS (FULL) OF 'TEST' (TABLE) (Cost=1756 Card= PRIMARY

670910 Bytes=11405470)

4 2 BUFFER (SORT) (Cost=8402834 Card=8168)

5 4 REMOTE* OF 'DUAL' (REMOTE) (Cost=11 Card=8168) !

5 SERIAL_FROM_REMOTE SELECT 0 FROM "SYS"."DUAL" "A1"

suk@ORACLE9I> select /*+ rule driving_site(test) */ owner,count(1) fromtest@primary,dual group

by o

wner;

已选择8行。

已用时间: 00: 00: 00.71

执行计划

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

0 SELECT STATEMENT (REMOTE) Optimizer=HINT: RULE

1 0 SORT (GROUP BY)

2 1 NESTED LOOPS

3 2 REMOTE* OF 'DUAL' (REMOTE) !

4 2 TABLE ACCESS (FULL) OF 'TEST' (TABLE) PRIMARY

3 SERIAL_FROM_REMOTE SELECT 0 FROM "SYS"."DUAL" "A1"

注意SELECT STATEMENT (REMOTE)和SERIAL_FROM_REMOTE SELECT 0 FROM "SYS"."DUAL" "A1"与之前的测试例子的变化。

从上面两个例子可以看出:用了driving_site后,oracle将在该hint指定的数据库上执行SQL,然后在把结果返回给SQL的发起端。这个HINT对CBO和RBO都适用。

简单总结一下:

1、不管是CBO还是RBO,如果SQL中涉及的表都是远端的,那么该语句在远端执行,在得到结果后返回调用端。

2、无论是CBO还是RBO,当查询包含了本地表和远端表时,oracle总是先把远端表的数据通过网络传送到SQL的发起端,再跟本地表进行关联得到最终结果。

3、可以通过driving_site这个hint来执行SQL在那端执行。这个hints在某些特定条件下的分布式查询调优非常有用。

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:php中文网

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/508174.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

shell 中去掉末尾换行符

# 多行为一行 echo "aaa\ bbb\ ccc" # 结果 #aaabbbccc#多行还是多行 echo "aaa bbb ccc" #结果 #aaa #bbb #ccc

python五子棋游戏15*15_在STM32上运行五子棋小游戏(15x15)

本程序算法资料来自下面网站.----https://www.cnblogs.com/buptzym/archive/2012/06/20/2556052.html----先定义一个数组 用于存储整个棋盘的数据.u16 ChessBoard[15][15];//棋盘数据.一.己方下棋 基础函数.1.在屏幕上显示出来一个15*15的棋盘.void DrawTable(void)//画出15x15…

点名册_骑士新书《万界点名册》十万收藏火爆气势不减当年修真聊天群

最近好多人都在讨论圣骑士的传说新书《万界点名册》,新书还没有发布,起点就给了闪屏推荐,引得的很多读者心痒痒的想要看看到底是怎样的神作。所以才发布两万多字的新书投资人就快一万人了,收藏也突破了十万。这速度好像是坐了火箭…

hadoop重启后 9000端口不在

原因可能是hadoop的namenode还未启动成功,可以去查看namenode的日志,是否有错误日志,如果没有错误日志,耐心等待namenode的恢复

500张思维导图记38000单词_思维导图记单词,环环相扣难遗忘——2020奇速英语夏令营第三天...

2020年8月6日,是奇速英语19期夏令营第二批单词阅读营正式上课的第3天,为了激发各班学员学习兴趣,保证学习效果,奇速英语专门制定了小组PK的积分奖励制在今天的学习当中发挥了极大的效果。在这一机制的刺激和奇速英语老师们的高效教…

语音识别热词_出门问问 TWS 耳机语音交互解决方案

随着芯片、算法商在技术及应用方面的演进,尤其是连接、降噪方向的重大突破,越来越多的手机及耳机厂商推出了自家功能丰富、交互舒适的 TWS 耳机。近日,出门问问新品发布会上推出的 TicPods 2 系列产品,在人机交互和语音助理方面&a…

egret 变量_egret性能优化总结

## 来自官方的优化建议(1) 少使用Alpha混合。(2) 显式停止计时器,让它们准备好进行垃圾回收。(3)使用事件侦听器并在不需要时删除这些侦听器。(4) 在不需要触摸交互性时显式禁用触摸交互性。(5) 合理使用dispatchEvents 函数。(6) 尽可能重用对象,建立对…

go tcp连接_TCP漫谈之keepalive和time_wait

TCP是一个有状态通讯协议,所谓的有状态是指通信过程中通信的双方各自维护连接的状态。一、TCP keepalive先简单回顾一下TCP连接建立和断开的整个过程。(这里主要考虑主流程,关于丢包、拥塞、窗口、失败重试等情况后面详细讨论。)首先是客户端发送syn(Syn…

纠错码较副本优势与minio纠错码配置

1. 优势 纠错码是什么,怎么保障数据不丢失 纠错码采用数据块校验块方式进行存储,副本采用真实副本存储纠错码更利于存储,副本更利于计算 2. 业界配置 EMC对象存储系统ECS 12 4 和 102 冗余度分别为 1.33 、 1.2 阿里云盘古集群chunk存储 83 冗余度1.375 Google RS(6,3) i…

mysql update 联合更新_Mysql update多表联合更新的方法小结

下面我建两个表,并执行一系列sql语句,仔细观察sql执行后表中数据的变化,很容易就能理解多表联合更新的用法student表 class表1. 执行 UPDATE student s , class c SET s.class_nametest00,c.stu_nametest00 WHERE s.class_id c.idstudent表 …

java mysql读取多条数据_myeclipse 使用Java访问mysql数据库,数据库中有多条记录,为何只能读出一条数据??...

Java源代码如下:publicListgetAllMsgList(){ListmsgListnewArrayList();DBConnectiondbnewDBConnection();Connectionconndb.getConn();Stringsql"select*frommsg...Java 源代码如下:public List getAllMsgList() { List msgList new ArrayList();…

基于corundumstudio建立websocket长连接

依赖 <!--socket io --><dependency><groupId>io.socket</groupId><artifactId>socket.io-client</artifactId><version>1.0.1</version></dependency><dependency><groupId>com.corundumstudio.socketio&…

mysql查询开启事务_MySQL中的查询事务问题

之前帮同学做个app的后台&#xff0c;使用了MySQLMyBatis&#xff0c;遇到了一个查询提交的问题&#xff0c;卡了很久&#xff0c;现在有时间了来复盘下环境情况假设有学生表&#xff1a;USE test;CREATE TABLE student (Id int NOT NULL PRIMARY KEY AUTO_INCREMENT,Name varc…

通过gparted 调整 ubuntu 磁盘

1. 启动和安装 1. 安装 sudo apt-get install gparted 2. 启动 sudo gparted2.配置 如果想扩充磁盘,需要有未分配空间,且该未分配空间位于partition相邻的格子

mysql增加布尔字段_JDBC对MySQL数据库布尔字段的操作方法

本文实例讲述了JDBC对MySQL数据库布尔字段的操作方法。分享给大家供大家参考。具体分析如下&#xff1a;在Mysql数据库如果要使用布尔字段&#xff0c;而应该设置为BIT(1)类型此类型在Mysql中不能通过MySQLQueryBrowser下方的Edit与Apply Changed去编辑只能通过语句修改&#x…

linux查看mysql表空间使用率_Oracle查看数据库表空间使用情况sql语句

Oracle查看数据库表空间使用情况sql语句SELECT UPPER(F.TABLESPACE_NAME) "表空间名",D.TOT_GROOTTE_MB "表空间大小(M)",D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空间(M)",TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_…

mysql 不同服务器不同库之间的访问_不同服务器数据库之间的数据操作

--创建链接服务器exec sp_addlinkedserver ITSV , , SQLOLEDB , 远程服务器名或ip地址 exec sp_addlinkedsrvlogin ITSV , false ,null, 用户名 , 密码 --查询示例select * from ITSV.数据库名.dbo.表名--导入示例select * into 表 from ITSV.数据库名.dbo.表名--以后不再使用…