----------
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将小表发送到大表端执行是比较快的。