如何使用提示改变执行的

干燥设备2021年09月06日

ORDERED提示强制Oracle按照From子句中表出现的顺序进行表连接。

通过ordered提示,可以避免CBO SQL解析过程中的表连接评估,从而避免Oracle产生错误的执行计划,或者强制Oracle按照我们指定的方式执行。

在很多时候,当我们清楚地了解数据结构和数据分布之后,就可以通过ORDERED提示来提高SQL性能。

通过以下例子我们来说明一下Ordered提示的作用.

1.不加Hints时SQL的执行计划

SQL set autotrace trace explain

SQL SELECT COUNT (*)

2 FROM t_small, t_max, t_middle

3 WHERE t_ject_id = t_ject_id

4 AND t_ject_id = t_ject_id;

Execution Plan

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

0 SELECT STATEMENT Optimizer=CHOOSE (Cost=194 Card=1 Bytes=12)

1 0 SORT (AGGREGATE)

2 1 HASH JOIN (Cost=194 Card=400 Bytes=4800)

3 2 HASH JOIN (Cost=42 Card=100 Bytes=800)

4 3 TABLE ACCESS (FULL) OF \'T_SMALL\' (Cost=2 Card=100 Bytes=400)

5 3 TABLE ACCESS (FULL) OF \'T_MIDDLE\' (Cost=39 Card=28447 Bytes=113788)

6 2 TABLE ACCESS (FULL) OF \'T_MAX\' (Cost=151 Card=113792 Bytes=455168)

我们可以通过10053事件跟踪一下该SQL的解析:

SQL alter session set events=\'10053 trace name context forever,level 1\';

Session altered.

SQL explain plan for

2 SELECT COUNT (*)

3 FROM t_small, t_max, t_middle

4 WHERE t_ject_id = t_ject_id

5 AND t_ject_id = t_ject_id;

Explained.

查看Trace文件可以看到,Oracle需要进行3! (6)次表连接顺序的评估:

bash-2.03$ cat testora9_ora_c |grep \"Join order\"

Join order[1]: T_SMALL [T_SMALL] T_MIDDLE [T_MIDDLE] T_MAX [T_MAX]

Join order[2]: T_SMALL [T_SMALL] T_MAX [T_MAX] T_MIDDLE [T_MIDDLE]

Join order[3]: T_MIDDLE [T_MIDDLE] T_SMALL [T_SMALL] T_MAX [T_MAX]

Join order[4]: T_MIDDLE [T_MIDDLE] T_MAX [T_MAX] T_SMALL [T_SMALL]

Join order[5]: T_MAX [T_MAX] T_SMALL [T_SMALL] T_MIDDLE [T_MIDDLE]

Join order[6]: T_MAX [T_MAX] T_MIDDLE [T_MIDDLE] T_SMALL [T_SMALL]

2.当我们使用Ordered提示之后

SQL的执行计划如下(from子句后的表顺序作了调整):

SQL SELECT /*+ ordered */ COUNT (*)

2 FROM t_middle, t_small, t_max

3 WHERE t_ject_id = t_ject_id

4 AND t_ject_id = t_ject_id;

有酒业“风向标”、食品业“晴雨表”之称的全国秋季糖酒商品交易会 Execution Plan

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

0 SELECT STATEMENT Optimizer=CHOOSE (Cost=197 Card=1 Bytes=12)

1 0 SORT (AGGREGATE)

2 1 HASH JOIN (Cost=197 Card=400 Bytes=4800)

3 2 HASH JOIN (Cost=45 Card=100 Bytes=800)

4 3 TABLE ACCESS (FULL) OF \'T_MIDDLE\' (Cost=39 Card=28447 Bytes=113788)

5 3 TABLE ACCESS (FULL) OF \'T_SMALL\' (Cost=2 Card=100 Bytes=400)

6 2 TABLE ACCESS (FULL) OF \'T_MAX\' (Cost=151 Card=113792 Bytes=455168)

再看10053的跟踪Trace文件:

bash-2.03$ grep \"Join order\" testora9_ora_c

Join order[1]: T_MIDDLE [T_MIDDLE] T_SMALL [T_SMALL] T_MAX [T_MAX]

Oracle只需要按照表在From子句中的出现顺序进行连接,从而按照我们的意图进行解析或执行.

这就是Ordered提示的基本作用,本例只是一个示范说明,后者的执行计划使得Cost激增,在实际应用中,我们当然是不希望看到此类增长的.

查看本文来源

唐山治疗阴道炎多少钱
成都哪家医院男科好
健脾胃的中药有哪些
相关阅读
高圆圆拍写真女儿来探班,两人亲密拥抱画面甜蜜有爱,未见赵又廷

昨日,有八卦大媒体拍电影到成龙姐姐探班她兼职的视频,这也是成龙姐姐正...

2024-09-08
Ulster霍尔大学优质课程推荐 BSc Nursing Science (Top-up) & MS

弗莱明所大学(Ulster University)位于苏格兰波斯尼亚和黑塞哥维那尔兰东南部贝...

2024-06-24
山水重逢,愈见人为 ——KOLON SPORT 可隆举办ODUMAK露营活动

紧接4月末发布全新轻巧的产品、希望大家亲密人为之后,韩国高端的产品品...

2024-06-02
谢娜终于翻车!闷声干大事却被吐槽,新书封面照身着白裙变得好优雅

钟汉良最近的出头大盛,在浪姐的舞台上成功复单单,让大家也看着了她的另...

2024-04-21
HER2阳性早期乳腺癌靶向疗法策略如何?南京医科大姚宇锋:推荐帕妥珠单抗与曲妥珠单抗双靶向疗法联合化

2020年在世界上最新近癌症负担图表显示,胰腺癌已带进在世界上第一大恶性...

2024-04-16
不是一场跑步,而是一次旅行

不用和爱抬杠的欺毕竟,伤身伤情伤感情 爱过的人,依然是一张白纸。上头...

2024-04-13
友情链接