oracle怎么查詢計(jì)劃,oracle查詢計(jì)劃分析

oracle 怎么查看執(zhí)行計(jì)劃

1、show parameter job_queue_processes;

創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),松桃企業(yè)網(wǎng)站建設(shè),松桃品牌網(wǎng)站建設(shè),網(wǎng)站定制,松桃網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,松桃網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

2、select * from user_jobs;--查看當(dāng)前用戶的調(diào)度任務(wù)

3、select * from dba_jobs_running;--查看正在執(zhí)行的調(diào)度任務(wù)

4、select * from dba_jobs;--查看執(zhí)行完的調(diào)度任務(wù)

5、select * from all_jobs; -- 查看數(shù)據(jù)庫(kù)系統(tǒng)所有任務(wù)

Oracle如何查看SQL實(shí)際執(zhí)行計(jì)劃

1、 查看最近執(zhí)行的SQL語句

select?/*recentsql*/s.SQL_ID,s.CHILD_NUMBER,s.HASH_VALUE,s.ADDRESS,s.EXECUTIONS,s.SQL_TEXT

from?v$sql?s

where?s.PARSING_USER_ID?=?(

select?u.user_id?from?all_users?u

where?u.username?=?'YH_TEST'

)?and?s.COMMAND_TYPE?in?(2?,3,?6,7?,189)

and?upper(s.SQL_TEXT)?not?like?upper(?'%recentsql%')

2、使用dbms_xplan.display_cursor查看執(zhí)行計(jì)劃,它的用法見筆記 《dbms_xplan.display_cursor的用法》,

注意了:若dbms_xplan.display_cursor要以ALLSTATS LAST格式輸出的話,/*+gather_plan_statistics*/這個(gè)提示信息放到查詢語句中是必須的。

select?/*+gather_plan_statistics*/?/*plan_statistics1*/?name?,salary?from?test?where?name?=?'t1'?;

select?s.SQL_ID,s.CHILD_NUMBER,s.HASH_VALUE,s.ADDRESS,s.EXECUTIONS,s.SQL_TEXT

from?v$sql?s

where?upper(s.SQL_TEXT)?like?upper('%plan_statistics1%'?)

and?upper(s.SQL_TEXT)?not?like?upper(?'%v$sql%');

select?*?from?table?(dbms_xplan.display_cursor('4wktu80k1xy5k'?,?0,?'ALLSTATS?LAST?cost'?));

Oracle如何查看sql的真實(shí)執(zhí)行計(jì)劃

查詢v$sql_plan視圖中的實(shí)際執(zhí)行計(jì)劃

1:在窗口執(zhí)行下面SQL語句

SELECT ENAME, SAL FROM SCOTT.EMP, SCOTT.DEPT

WHERE EMP.DEPTNO =DEPT.DEPTNO

AND?? DEPT.LOC='CHICAGO';

2:查看執(zhí)行SQL的SQL_ID

SELECT SQL_ID, SQL_TEXT FROM V$SQL?WHERE SQL_TEXT LIKE?'%SELECT ENAME, SAL FROM SCOTT.EMP, SCOTT.DEPT%'

3: 查看v$sql_plan視圖

SELECT * FROM v$sql_plan WHERE SQL_ID='7m5qbhn98j1xw';

通過v$sql_plan視圖查看實(shí)際執(zhí)行計(jì)劃,其實(shí)是不太現(xiàn)實(shí)的,因?yàn)殚喿x困難,可讀性差,尤其是復(fù)雜SQL語句。

如何準(zhǔn)確的查看oracle的執(zhí)行計(jì)劃

在日常基于數(shù)據(jù)庫(kù)應(yīng)用的開發(fā)過程中,我們經(jīng)常需要對(duì)多個(gè)表或者數(shù)據(jù)源進(jìn)行關(guān)聯(lián)查詢而得出我們需要的結(jié)果集。那么Oracle到底存在著哪幾種連接方式??jī)?yōu)化器內(nèi)部又是怎樣處理這些連接的?哪種連接方式又是適合哪種查詢需求的?只有對(duì)這些問題有了清晰的理解后,我們才能針對(duì)特定的查詢需求選擇合適的連接方式,開發(fā)出健壯的數(shù)據(jù)庫(kù)應(yīng)用程序。選擇合適的表連接方法對(duì)SQL語句運(yùn)行的性能有著至關(guān)重要的影響。下面我們就Oracle常用的一些連接方法及適用情景做一個(gè)簡(jiǎn)單的介紹。

3.1 嵌套循環(huán)連接(nested loop)

嵌套循環(huán)連接的工作方式是這樣的:

1、 Oracle首先選擇一張表作為連接的驅(qū)動(dòng)表,這張表也稱為外部表(Outer Table)。由驅(qū)動(dòng)表進(jìn)行驅(qū)動(dòng)連接的表或數(shù)據(jù)源稱為內(nèi)部表(Inner Table)。

2、 提取驅(qū)動(dòng)表中符合條件的記錄,與被驅(qū)動(dòng)表的連接列進(jìn)行關(guān)聯(lián)查詢符合條件的記錄。在這個(gè)過程中,Oracle首先提取驅(qū)動(dòng)表中符合條件的第一條記錄,再與內(nèi)部表的連接列進(jìn)行關(guān)聯(lián)查詢相應(yīng)的記錄行。在關(guān)聯(lián)查詢的過程中,Oracle會(huì)持續(xù)提取驅(qū)動(dòng)表中其他符合條件的記錄與內(nèi)部表關(guān)聯(lián)查詢。這兩個(gè)過程是并行進(jìn)行的,因此嵌套循環(huán)連接返回前幾條記錄的速度是非??斓?。在這里需要說明的是,由于Oracle最小的IO單位為單個(gè)數(shù)據(jù)塊,因此在這個(gè)過程中Oracle會(huì)首先提取驅(qū)動(dòng)表中符合條件的單個(gè)數(shù)據(jù)塊中的所有行,再與內(nèi)部表進(jìn)行關(guān)聯(lián)連接查詢的,然后提取下一個(gè)數(shù)據(jù)塊中的記錄持續(xù)地循環(huán)連接下去。當(dāng)然,如果單行記錄跨越多個(gè)數(shù)據(jù)塊的話,就是一次單條記錄進(jìn)行關(guān)聯(lián)查詢的。

3、 嵌套循環(huán)連接的過程如下所示:

Nested loop

Outer loop

Inner loop

我們可以看出這里面存在著兩個(gè)循環(huán),一個(gè)是外部循環(huán),提取驅(qū)動(dòng)表中符合條件的每條記錄。另外一個(gè)是內(nèi)部循環(huán),根據(jù)外循環(huán)中提取的每條記錄對(duì)內(nèi)部表進(jìn)行連接查詢相應(yīng)的記錄。由于這兩個(gè)循環(huán)是嵌套進(jìn)行的,故此種連接方法稱為嵌套循環(huán)連接。

嵌套循環(huán)連接適用于查詢的選擇性強(qiáng)、約束性高并且僅返回小部分記錄的結(jié)果集。通常要求驅(qū)動(dòng)表的記錄(符合條件的記錄,通常通過高效的索引訪問)較少,且被驅(qū)動(dòng)表連接列有唯一索引或者選擇性強(qiáng)的非唯一索引時(shí),嵌套循環(huán)連接的效率是比較高的。

嵌套循環(huán)連接驅(qū)動(dòng)表的選擇也是連接中需要著重注意的一點(diǎn),有一個(gè)常見的誤區(qū)是驅(qū)動(dòng)表要選擇小表,其實(shí)這是不對(duì)的。假如有兩張表A、B關(guān)聯(lián)查詢,A表有1000000條記錄,B表有10000條記錄,但是A表過濾出來的記錄只有10條,這時(shí)候顯然用A表當(dāng)做驅(qū)動(dòng)表是比較合適的。因此驅(qū)動(dòng)表是由過濾條件限制返回記錄最少的那張表,而不是根據(jù)表的大小來選擇的。

在外連接查詢中,如果走嵌套循環(huán)連接的話,那么驅(qū)動(dòng)表必然是沒有符合條件關(guān)聯(lián)的那張表,也就是后面不加(+)的那張表。這是由于外連接需要提取可能另一張表沒符合條件的記錄,因此驅(qū)動(dòng)表需要是那張我們要返回所有符合條件記錄的表。比如下面這個(gè)查詢,

嵌套循環(huán)連接返回前幾行的記錄是非常快的,這是因?yàn)槭褂昧饲短籽h(huán)后,不需要等到全部循環(huán)結(jié)束再返回結(jié)果集,而是不斷地將查詢出來的結(jié)果集返回。在這種情況下,終端用戶將會(huì)快速地得到返回的首批記錄,且同時(shí)等待Oracle內(nèi)部處理其他記錄并返回。如果查詢的驅(qū)動(dòng)表的記錄數(shù)非常多,或者被驅(qū)動(dòng)表的連接列上無索引或索引不是高度可選的情況,嵌套循環(huán)連接的效率是非常低的

-- 刪除原表

drop table t1;

-- 建立測(cè)試表

create table t1(

f1 varchar2(10),

f2 varchar2(1000)

)

tablespace CTL

pctfree 98;

-- 填充測(cè)試內(nèi)容

insert into t1(f1,f2)

select rownum, lpad(rownum,700,'0')

from dba_tables a, dba_tab_cols b

where a.owner = b.owner

and rownum 10000;

commit;

-- 檢查測(cè)試內(nèi)容格式

select sys.dbms_rowid.rowid_block_number(rowid), f1, f2 from t1;

-- 每條記錄都存儲(chǔ)在單獨(dú)的數(shù)據(jù)塊中

select count( distinct sys.dbms_rowid.rowid_block_number(rowid)) from t1;

/*

用同樣的方式建立表t2

*/

-- 刪除原表

drop table t2;

-- 建立測(cè)試表

create table t2(

f1 varchar2(10),

f2 varchar2(1000)

)

tablespace CTL

pctfree 98;

-- 填充測(cè)試內(nèi)容

insert into t2(f1,f2)

select rownum * 10, lpad(rownum * 10,700,'0')

from dba_tables a, dba_tab_cols b

where a.owner = b.owner

and rownum 1000;

commit;

-- 檢查測(cè)試內(nèi)容格式

select sys.dbms_rowid.rowid_block_number(rowid), f1, f2 from t2;

-- 每條記錄都存儲(chǔ)在單獨(dú)的數(shù)據(jù)塊中

select count( distinct sys.dbms_rowid.rowid_block_number(rowid)) from t2;

create index ind_t1_f1 on t1(f1);

create index ind_t2_f1 on t2(f1);

--首先我們來看使用nested loop關(guān)聯(lián)方式, 不同表作為驅(qū)動(dòng)時(shí)的情況.

1, 表t2作為驅(qū)動(dòng)表

select /*+ ordered use_nl(t1 , t2)*/

t1.f1, t2.f1

from ctl.t2 t2,ctl.t1 t1

where t1.f1 = t2.f1

and t1.f1 1000;

Execution Plan

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

0 SELECT STATEMENT Optimizer=CHOOSE (Cost=84 Card=4 Bytes=56)

1 0 NESTED LOOPS (Cost=84 Card=4 Bytes=56)

2 1 TABLE ACCESS (FULL) OF 'T2' (Cost=2 Card=82 Bytes=574)

3 1 INDEX (RANGE SCAN) OF 'IND_T1_F1' (NON-UNIQUE) (Cost=1 C

ard=1 Bytes=7)

Cost = outer access cost + (inner access cost * outer cardinality)

Cost = 2 + 1 * 82 = 84;

Statistics

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

0 recursive calls

0 db block gets

2020 consistent gets

23 physical reads

0 redo size

2650 bytes sent via SQL*Net to client

721 bytes received via SQL*Net from client

8 SQL*Net roundtrips to/from client

0 sorts (memory)

0 sorts (disk)

99 rows processed

2, t1作為驅(qū)動(dòng)表

Execution Plan

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

0 SELECT STATEMENT Optimizer=CHOOSE (Cost=6 Card=4 Bytes=56)

1 0 NESTED LOOPS (Cost=6 Card=4 Bytes=56)

2 1 TABLE ACCESS (FULL) OF 'T1' (Cost=2 Card=4 Bytes=28)

3 1 INDEX (RANGE SCAN) OF 'IND_T2_F1' (NON-UNIQUE) (Cost=1 C

ard=1 Bytes=7)

Cost = outer access cost + (inner access cost * outer cardinality)

Cost = 2 + 1 * 4 = 84;

Statistics

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

0 recursive calls

0 db block gets

11123 consistent gets

3 physical reads

0 redo size

2650 bytes sent via SQL*Net to client

721 bytes received via SQL*Net from client

8 SQL*Net roundtrips to/from client

0 sorts (memory)

0 sorts (disk)

99 rows processed

3.2, 哈希連接(hash join)

哈希連接分為兩個(gè)階段,如下。

1、 構(gòu)建階段:優(yōu)化器首先選擇一張小表做為驅(qū)動(dòng)表,運(yùn)用哈希函數(shù)對(duì)連接列進(jìn)行計(jì)算產(chǎn)生一張哈希表。通常這個(gè)步驟是在內(nèi)存(hash_area_size)里面進(jìn)行的,因此運(yùn)算很快。

2、 探測(cè)階段:優(yōu)化器對(duì)被驅(qū)動(dòng)表的連接列運(yùn)用同樣的哈希函數(shù)計(jì)算得到的結(jié)果與前面形成的哈希表進(jìn)行探測(cè)返回符合條件的記錄。這個(gè)階段中如果被驅(qū)動(dòng)表的連接列的值沒有與驅(qū)動(dòng)表連接列的值相等的話,那么這些記錄將會(huì)被丟棄而不進(jìn)行探測(cè)

哈希連接比較適用于返回大數(shù)據(jù)量結(jié)果集的連接。

使用哈希連接必須是在CBO模式下,參數(shù)hash_join_enabled設(shè)置為true,

哈希連接只適用于等值連接。從Oracle9i開始,哈希連接由于其良好的性能漸漸取代了原來的排序合并連接。

SQL select /*+ ordered use_hash(t1 , t2) */

t1.f1, t2.f1

from ctl.t1 t1,ctl.t2 t2

where t1.f1 = t2.f1 2 3 4 ;

999 rows selected.

Execution Plan

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

0 SELECT STATEMENT Optimizer=CHOOSE (Cost=5 Card=82 Bytes=1148

)

1 0 HASH JOIN (Cost=5 Card=82 Bytes=1148)

2 1 TABLE ACCESS (FULL) OF 'T1' (Cost=2 Card=82 Bytes=574)

3 1 TABLE ACCESS (FULL) OF 'T2' (Cost=2 Card=82 Bytes=574)

Statistics

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

0 recursive calls

0 db block gets

11113 consistent gets

0 physical reads

0 redo size

23590 bytes sent via SQL*Net to client

1381 bytes received via SQL*Net from client

68 SQL*Net roundtrips to/from client

0 sorts (memory)

0 sorts (disk)

999 rows processed

3.3, 排序合并連接(merge join)

排序合并連接的方法非常簡(jiǎn)單。在排序合并連接中是沒有驅(qū)動(dòng)表的概念的,兩個(gè)互相連接的表按連接列的值先排序,排序完后形成的結(jié)果集再互相進(jìn)行合并連接提取符合條件的記錄。相比嵌套循環(huán)連接,排序合并連接比較適用于返回大數(shù)據(jù)量的結(jié)果。

排序合并連接在數(shù)據(jù)表預(yù)先排序好的情況下效率是非常高的,也比較適用于非等值連接的情況,比如、=、=等情況下的連接(哈希連接只適用于等值連接)。由于Oracle中排序操作的開銷是非常消耗資源的,當(dāng)結(jié)果集很大時(shí)排序合并連接的性能很差,于是Oracle在7.3之后推出了新的連接方式——哈希連接。

1, rbo模式;

2, 不等于關(guān)聯(lián)( = = )

3, hash_join_enabled = false;

4, 數(shù)據(jù)源已排序

oracle怎么查看sql執(zhí)行計(jì)劃

一般需要借助第三方工具來查看執(zhí)行計(jì)劃。

工具:PL/SQL

步驟:

1、打開第三方工具PL/SQL,并登錄到指定數(shù)據(jù)庫(kù)。

2、新建一個(gè)查詢,編寫SQL語句。

3、此時(shí)不要執(zhí)行該語句,而是按電腦上的F5鍵,部分筆記本鍵盤需要同時(shí)按FN和F5鍵。

4、然后就能看到執(zhí)行計(jì)劃了。

標(biāo)題名稱:oracle怎么查詢計(jì)劃,oracle查詢計(jì)劃分析
文章出自:http://muchs.cn/article8/pheoip.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作自適應(yīng)網(wǎng)站、全網(wǎng)營(yíng)銷推廣、網(wǎng)站策劃用戶體驗(yàn)、定制網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營(yíng)