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)力。可充分滿足這一群體相比中小企業(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ù)
1、 查看最近執(zhí)行的SQL語(yǔ)句
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ì)劃,它的用法見(jiàn)筆記 《dbms_xplan.display_cursor的用法》,
注意了:若dbms_xplan.display_cursor要以ALLSTATS LAST格式輸出的話,/*+gather_plan_statistics*/這個(gè)提示信息放到查詢語(yǔ)句中是必須的。
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'?));
查詢v$sql_plan視圖中的實(shí)際執(zhí)行計(jì)劃
1:在窗口執(zhí)行下面SQL語(yǔ)句
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';
通過(guò)v$sql_plan視圖查看實(shí)際執(zhí)行計(jì)劃,其實(shí)是不太現(xiàn)實(shí)的,因?yàn)殚喿x困難,可讀性差,尤其是復(fù)雜SQL語(yǔ)句。
在日常基于數(shù)據(jù)庫(kù)應(yīng)用的開(kāi)發(fā)過(guò)程中,我們經(jīng)常需要對(duì)多個(gè)表或者數(shù)據(jù)源進(jìn)行關(guān)聯(lián)查詢而得出我們需要的結(jié)果集。那么Oracle到底存在著哪幾種連接方式??jī)?yōu)化器內(nèi)部又是怎樣處理這些連接的?哪種連接方式又是適合哪種查詢需求的?只有對(duì)這些問(wèn)題有了清晰的理解后,我們才能針對(duì)特定的查詢需求選擇合適的連接方式,開(kāi)發(fā)出健壯的數(shù)據(jù)庫(kù)應(yīng)用程序。選擇合適的表連接方法對(duì)SQL語(yǔ)句運(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è)過(guò)程中,Oracle首先提取驅(qū)動(dòng)表中符合條件的第一條記錄,再與內(nèi)部表的連接列進(jìn)行關(guān)聯(lián)查詢相應(yīng)的記錄行。在關(guān)聯(lián)查詢的過(guò)程中,Oracle會(huì)持續(xù)提取驅(qū)動(dòng)表中其他符合條件的記錄與內(nèi)部表關(guān)聯(lián)查詢。這兩個(gè)過(guò)程是并行進(jìn)行的,因此嵌套循環(huán)連接返回前幾條記錄的速度是非常快的。在這里需要說(shuō)明的是,由于Oracle最小的IO單位為單個(gè)數(shù)據(jù)塊,因此在這個(gè)過(guò)程中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)連接的過(guò)程如下所示:
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)表的記錄(符合條件的記錄,通常通過(guò)高效的索引訪問(wèn))較少,且被驅(qū)動(dòng)表連接列有唯一索引或者選擇性強(qiáng)的非唯一索引時(shí),嵌套循環(huán)連接的效率是比較高的。
嵌套循環(huán)連接驅(qū)動(dòng)表的選擇也是連接中需要著重注意的一點(diǎn),有一個(gè)常見(jiàn)的誤區(qū)是驅(qū)動(dòng)表要選擇小表,其實(shí)這是不對(duì)的。假如有兩張表A、B關(guān)聯(lián)查詢,A表有1000000條記錄,B表有10000條記錄,但是A表過(guò)濾出來(lái)的記錄只有10條,這時(shí)候顯然用A表當(dāng)做驅(qū)動(dòng)表是比較合適的。因此驅(qū)動(dòng)表是由過(guò)濾條件限制返回記錄最少的那張表,而不是根據(jù)表的大小來(lái)選擇的。
在外連接查詢中,如果走嵌套循環(huán)連接的話,那么驅(qū)動(dòng)表必然是沒(méi)有符合條件關(guān)聯(lián)的那張表,也就是后面不加(+)的那張表。這是由于外連接需要提取可能另一張表沒(méi)符合條件的記錄,因此驅(qū)動(dòng)表需要是那張我們要返回所有符合條件記錄的表。比如下面這個(gè)查詢,
嵌套循環(huán)連接返回前幾行的記錄是非常快的,這是因?yàn)槭褂昧饲短籽h(huán)后,不需要等到全部循環(huán)結(jié)束再返回結(jié)果集,而是不斷地將查詢出來(lái)的結(jié)果集返回。在這種情況下,終端用戶將會(huì)快速地得到返回的首批記錄,且同時(shí)等待Oracle內(nèi)部處理其他記錄并返回。如果查詢的驅(qū)動(dòng)表的記錄數(shù)非常多,或者被驅(qū)動(dòng)表的連接列上無(wú)索引或索引不是高度可選的情況,嵌套循環(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);
--首先我們來(lái)看使用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)表的連接列的值沒(méi)有與驅(qū)動(dòng)表連接列的值相等的話,那么這些記錄將會(huì)被丟棄而不進(jìn)行探測(cè)
哈希連接比較適用于返回大數(shù)據(jù)量結(jié)果集的連接。
使用哈希連接必須是在CBO模式下,參數(shù)hash_join_enabled設(shè)置為true,
哈希連接只適用于等值連接。從Oracle9i開(kāi)始,哈希連接由于其良好的性能漸漸取代了原來(lái)的排序合并連接。
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)單。在排序合并連接中是沒(méi)有驅(qū)動(dòng)表的概念的,兩個(gè)互相連接的表按連接列的值先排序,排序完后形成的結(jié)果集再互相進(jìn)行合并連接提取符合條件的記錄。相比嵌套循環(huán)連接,排序合并連接比較適用于返回大數(shù)據(jù)量的結(jié)果。
排序合并連接在數(shù)據(jù)表預(yù)先排序好的情況下效率是非常高的,也比較適用于非等值連接的情況,比如、=、=等情況下的連接(哈希連接只適用于等值連接)。由于Oracle中排序操作的開(kāi)銷是非常消耗資源的,當(dāng)結(jié)果集很大時(shí)排序合并連接的性能很差,于是Oracle在7.3之后推出了新的連接方式——哈希連接。
1, rbo模式;
2, 不等于關(guān)聯(lián)( = = )
3, hash_join_enabled = false;
4, 數(shù)據(jù)源已排序
一般需要借助第三方工具來(lái)查看執(zhí)行計(jì)劃。
工具:PL/SQL
步驟:
1、打開(kāi)第三方工具PL/SQL,并登錄到指定數(shù)據(jù)庫(kù)。
2、新建一個(gè)查詢,編寫SQL語(yǔ)句。
3、此時(shí)不要執(zhí)行該語(yǔ)句,而是按電腦上的F5鍵,部分筆記本鍵盤需要同時(shí)按FN和F5鍵。
4、然后就能看到執(zhí)行計(jì)劃了。
標(biāo)題名稱:oracle怎么查詢計(jì)劃,oracle查詢計(jì)劃分析
文章出自:http://chinadenli.net/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í)需注明來(lái)源: 創(chuàng)新互聯(lián)