ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 分布式查询优化SERIAL_FROM_REMOTE

分布式查询优化SERIAL_FROM_REMOTE

原创 Linux操作系统 作者:zhouwf0726 时间:2019-05-08 10:21:05 0 删除 编辑

SQL> set autotrace on
SQL> select * from zhouwf.temp1@cslndc,zhouwf.temp2 where temp1.id=temp2.id;

ID MC
---------- ------------------------------------------------------------
ID MC
---------- ------------------------------------------------------------
1 1
1 1

2 2
2 2

3 3
3 3


ID MC
---------- ------------------------------------------------------------
ID MC
---------- ------------------------------------------------------------
4 4
4 4

5 5
5 5

6 6
6 6


ID MC
---------- ------------------------------------------------------------
ID MC
---------- ------------------------------------------------------------
7 7
7 7

8 8
8 8

9 9
9 9


ID MC
---------- ------------------------------------------------------------
ID MC
---------- ------------------------------------------------------------
10 10
10 10

11 11
11 11

12 12
12 12


ID MC
---------- ------------------------------------------------------------
ID MC
---------- ------------------------------------------------------------
13 13
13 13

14 14
14 14

15 15
15 15


ID MC
---------- ------------------------------------------------------------
ID MC
---------- ------------------------------------------------------------
16 16
16 16

17 17
17 17

18 18
18 18


ID MC
---------- ------------------------------------------------------------
ID MC
---------- ------------------------------------------------------------
19 19
19 19

20 20
20 20

100 100
100 100


已选择21行。


执行计划
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TEMP2'
2 1 NESTED LOOPS
3 2 REMOTE* CSLNDC
4 2 INDEX (RANGE SCAN) OF 'IDX_TEMP2' (NON-UNIQUE)


3 SERIAL_FROM_REMOTE SELECT "ID","MC" FROM "ZHOUWF"."TEMP1" "TEMP
1"



统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
10 consistent gets
0 physical reads
0 redo size
995 bytes sent via SQL*Net to client
522 bytes received via SQL*Net from client
3 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
21 rows processed

SQL>

对于执行计划:SERIAL_FROM_REMOTE

http://yaanzy.itpub.net/post/1263/31064

在分布式查询中,对于分布在两个节点上的两张表进行嵌套循环连接将会非常慢,这是由于Oracle将
所有的远程数据传到本地来处理。所以对于这类查询最好换成排序合并连接或者hash连接。

下面例子中的表aaa、bbb分别位于两个库,aaa所在库通过数据库链db244访问bbb表:

create table aaa as select * from dba_objects;
create table bbb as select * from dba_objects;

1、嵌套循环连接

SQL> select count(*) from aaa a
where exists
(select * from bbb@db244 b where a.object_id=b.object_id);

COUNT(*)
----------
27165

Elapsed: 00:04:04.74

Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 SORT (AGGREGATE)
2 1 FILTER
3 2 TABLE ACCESS (FULL) OF 'AAA'
4 2 REMOTE* DB244.US.ORACLE.COM
4 SERIAL_FROM_REMOTE SELECT "OBJECT_ID" FROM "BBB" "B" WHERE "OBJECT_ID"=:1

Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
437 consistent gets
0 physical reads
0 redo size
381 bytes sent via SQL*Net to client
503 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed

2、排序合并连接

SQL> select count(*) from aaa a
where a.object_id in
(select object_id from bbb@db244 b);

COUNT(*)
----------
27165

Elapsed: 00:00:00.59

Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 SORT (AGGREGATE)
2 1 MERGE JOIN
3 2 SORT (JOIN)
4 3 TABLE ACCESS (FULL) OF 'AAA'
5 2 SORT (JOIN)
6 5 VIEW OF 'VW_NSO_1'
7 6 SORT (UNIQUE)
8 7 REMOTE* DB244.US.ORACLE.COM
8 SERIAL_FROM_REMOTE SELECT "OBJECT_ID" FROM "BBB" "B"


Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
437 consistent gets
0 physical reads
0 redo size
381 bytes sent via SQL*Net to client
503 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
3 sorts (memory)
0 sorts (disk)
1 rows processed

3、通过提示改用hash连接

SQL> select /*+ use_hash(a,b) */count(*) from aaa a
where exists
(select * from bbb@db244 b
where a.object_id=b.object_id);

COUNT(*)
----------
27165

Elapsed: 00:00:00.51

Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=91 Card=1 Bytes=26)
1 0 SORT (AGGREGATE)
2 1 HASH JOIN (SEMI) (Cost=91 Card=27172 Bytes=706472)
3 2 TABLE ACCESS (FULL) OF 'AAA' (Cost=47 Card=27172 Bytes=353236)

4 2 VIEW OF 'VW_SQ_1' (Cost=42 Card=32509 Bytes=422617)
5 4 REMOTE* (Cost=42 Card=32509 Bytes=422617)
DB244.US.ORACLE.COM
5 SERIAL_FROM_REMOTE SELECT "OBJECT_ID" FROM "BBB" "B"


Statistics
----------------------------------------------------------
3 recursive calls
0 db block gets
468 consistent gets
0 physical reads
0 redo size
381 bytes sent via SQL*Net to client
503 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
1 rows processed

http://asktom.oracle.com/pls/ask/f?p=4950:8:::::F4950_P8_DISPLAYID:456820211101

Followup:
the query plan showed us that -- two remote operations followed by a filter.
gives us the remote query that was executed and all.

it is basically taking:

2 select tracknum, status, transdate, insseq
10:09:24 3 from workhistory@wkl
10:09:24 4 where tracknum in (select distinct tracknum from workhistory@wkl
where insseq = 142);

and executing it like this:


for x in ( select * from remote_table )
loop
query remote table again by tracknum to get tracknum and insseq

if one of the the returned insseq's is 142
then
output record
end if
end loop

Execution Plan
----------------------------------------------------------
0 INSERT STATEMENT Optimizer=CHOOSE (Cost=172346 Card=57009 By
tes=2052324)

1 0 FILTER
2 1 REMOTE* (Cost=1319 Card=57009 Bytes=2052324) WKL
3 1 REMOTE* (Cost=3 Card=1 Bytes=24) WKL


2 SERIAL_FROM_REMOTE SELECT "TRACKNUM","STATUS","TRANSDATE","INSS
EQ" FROM "WORKHISTORY" "SYS_ALIAS_1"

3 SERIAL_FROM_REMOTE SELECT "TRACKNUM","INSSEQ" FROM "WORKHISTORY
" "WORKHISTORY" WHERE "TRACKNUM"=:1


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/756652/viewspace-242245/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2006-02-22

  • 博文量
    458
  • 访问量
    416622