日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

oracle执行计划的概念,SQL语句性能调整之ORACLE的执行计划

發(fā)布時(shí)間:2025/3/12 数据库 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle执行计划的概念,SQL语句性能调整之ORACLE的执行计划 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

對(duì)于CBO優(yōu)化器:

CBO根據(jù)統(tǒng)計(jì)信息選擇驅(qū)動(dòng)表,假如沒(méi)有統(tǒng)計(jì)信息,則在from 子句中從左到右的順序選擇驅(qū)動(dòng)表。這與RBO選擇的順序正好相反。這是英文原文(CBO determines join order from costs derived from gathered statistics. If there are no stats then CBO chooses the driving order of tables from LEFT to RIGHT in the FROM clause. This is OPPOSITE to the RBO) 。我還是沒(méi)法證實(shí)這句話的正確性。不過(guò)經(jīng)過(guò)驗(yàn)證:“如果用ordered 提示(此時(shí)肯定用CBO),則以from 子句中按從左到右的順序選擇驅(qū)動(dòng)表”這句話是正確的。實(shí)際上在CBO中,如果有統(tǒng)計(jì)數(shù)據(jù)(即對(duì)表與索引進(jìn)行了分析),則優(yōu)化器會(huì)自動(dòng)根據(jù)cost值決定采用哪種連接類型,并選擇合適的驅(qū)動(dòng)表,這與where子句中各個(gè)限制條件的位置沒(méi)有任何關(guān)系。如果我們要改變優(yōu)化器選擇的連接類型或驅(qū)動(dòng)表,則就需要使用hints了,具體hints的用法在后面會(huì)給予介紹。

測(cè)試:

如果我創(chuàng)建的3個(gè)表:

create table A(col1 number(4,0),col2 number(4,0), col4 char(30));

create table B(col1 number(4,0),col3 number(4,0), name_b char(30));

create table C(col2 number(4,0),col3 number(4,0), name_c char(30));

create index inx_col12A on a(col1,col2);

執(zhí)行查詢:

select A.col4

from B, A, C

where B.col3 = 10

and A.col1 = B.col1

and A.col2 = C.col2

and C.col3 = 5;

Execution Plan

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

0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=3 Card=1 Bytes=110)

1 0 NESTED LOOPS (Cost=3 Card=1 Bytes=110)

2 1 MERGE JOIN (CARTESIAN) (Cost=2 Card=1 Bytes=52)

3 2 TABLE ACCESS (FULL) OF 'B' (Cost=1 Card=1 Bytes=26)

4 2 SORT (JOIN) (Cost=1 Card=1 Bytes=26)

5 4 TABLE ACCESS (FULL) OF 'C' (Cost=1 Card=1 Bytes=26)

6 1 TABLE ACCESS (FULL) OF 'A' (Cost=1 Card=82 Bytes=4756)

select A.col4

from B, A, C

where A.col1 = B.col1

and A.col2 = C.col2;

Execution Plan

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

0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=5 Card=55 Bytes=4620)

1 0 HASH JOIN (Cost=5 Card=55 Bytes=4620)

2 1 HASH JOIN (Cost=3 Card=67 Bytes=4757)

3 2 TABLE ACCESS (FULL) OF 'B' (Cost=1 Card=82 Bytes=1066)

4 2 TABLE ACCESS (FULL) OF 'A' (Cost=1 Card=82 Bytes=4756)

5 1 TABLE ACCESS (FULL) OF 'C' (Cost=1 Card=82 Bytes=1066)

將A表上的索引inx_col12A刪除后:

select A.col4

from B, A, C

where A.col1 = B.col1

and A.col2 = C.col2;

Execution Plan

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

0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=5 Card=55 Bytes=4620)

1 0 HASH JOIN (Cost=5 Card=55 Bytes=4620)

2 1 HASH JOIN (Cost=3 Card=67 Bytes=4757)

3 2 TABLE ACCESS (FULL) OF 'B' (Cost=1 Card=82 Bytes=1066)

4 2 TABLE ACCESS (FULL) OF 'A' (Cost=1 Card=82 Bytes=4756)

5 1 TABLE ACCESS (FULL) OF 'C' (Cost=1 Card=82 Bytes=1066)

select /*+ ORDERED */A.col4

from C, A, B

where B.col3 = 10

and A.col1 = B.col1

and A.col2 = C.col2

and C.col3 = 5;

Execution Plan

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

0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=3 Card=1 Bytes=110)

1 0 NESTED LOOPS (Cost=3 Card=1 Bytes=110)

2 1 NESTED LOOPS (Cost=2 Card=1 Bytes=84)

3 2 TABLE ACCESS (FULL) OF 'C' (Cost=1 Card=1 Bytes=26)

4 2 TABLE ACCESS (FULL) OF 'A' (Cost=1 Card=82 Bytes=4756)

5 1 TABLE ACCESS (FULL) OF 'B' (Cost=1 Card=1 Bytes=26)

這個(gè)查詢驗(yàn)證了通過(guò)ORDERED提示可以正確的提示優(yōu)化器選擇哪個(gè)表作為優(yōu)化器。

總結(jié)

以上是生活随笔為你收集整理的oracle执行计划的概念,SQL语句性能调整之ORACLE的执行计划的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。