一、通過PL/SQL Dev工具
成都創(chuàng)新互聯(lián)公司服務(wù)項目包括岑溪網(wǎng)站建設(shè)、岑溪網(wǎng)站制作、岑溪網(wǎng)頁制作以及岑溪網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,岑溪網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到岑溪省份的部分城市,未來相信會繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
1、直接File-New-Explain Plan Window,在窗口中執(zhí)行sql可以查看計劃結(jié)果。其中,Cost表示cpu的消耗,單位為n%,Cardinality表示執(zhí)行的行數(shù),等價Rows。
2、先執(zhí)行 EXPLAIN PLAN FOR select * from tableA where paraA=1,再 select * from table(DBMS_XPLAN.DISPLAY)便可以看到oracle的執(zhí)行計劃了,看到的結(jié)果和1中的一樣,所以使用工具的時候推薦使用1方法。
注意:PL/SQL Dev工具的Command window中不支持set autotrance on的命令。還有使用工具方法查看計劃看到的信息不全,有些時候我們需要sqlplus的支持。
二、通過sqlplus
1.最簡單的辦法
Sql set autotrace on
Sql select * from dual;
執(zhí)行完語句后,會顯示explain plan 與 統(tǒng)計信息。
這個語句的優(yōu)點就是它的缺點,這樣在用該方法查看執(zhí)行時間較長的sql語句時,需要等待該語句執(zhí)行成功后,才返回執(zhí)行計劃,使優(yōu)化的周期大大增長。如果不想執(zhí)行語句而只是想得到執(zhí)行計劃可以采用:
Sql set autotrace traceonly
這樣,就只會列出執(zhí)行計劃,而不會真正的執(zhí)行語句,大大減少了優(yōu)化時間。雖然也列出了統(tǒng)計信息,但是因為沒有執(zhí)行語句,所以該統(tǒng)計信息沒有用處,如果執(zhí)行該語句時遇到錯誤,解決方法為:
(1)在要分析的用戶下:
Sqlplus @ ?
dbmsadminutlxplan.sql
(2) 用sys用戶登陸
Sqlplus @ ?sqlplusadminplustrce.sql
Sqlplus grant plustrace to user_name;
- - user_name是上面所說的分析用戶
2.用explain plan命令
(1) sqlplus explain plan for select * from testdb.myuser
(2) sqlplus select * from table(dbms_xplan.display);
上面這2種方法只能為在本會話中正在運(yùn)行的語句產(chǎn)生執(zhí)行計劃,即我們需要已經(jīng)知道了哪條語句運(yùn)行的效率很差,我們是有目的只對這條SQL語句去優(yōu)化。其實,在很多情況下,我們只會聽一個客戶抱怨說現(xiàn)在系統(tǒng)運(yùn)行很慢,而我們不知道是哪個SQL引起的。此時有許多現(xiàn)成的語句可以找出耗費(fèi)資源比較多的語句,如:
SELECT ADDRESS, substr(SQL_TEXT,1,20) Text, buffer_gets, executions,
buffer_gets/executions AVG FROM v$sqlarea
WHERE executions0 AND buffer_gets 100000 ORDER BY 5;
ADDRESS TEXT BUFFER_GETS EXECUTIONS AVG
-------- ---------------------------------------- ----------- ---------- ------------------------------------------------------------
66D83D64 select t.name, (sel 421531 60104 7.01336017
66D9E8AC select t.schema, t.n 1141739 2732 417.913250
66B82BCC select s.synonym_nam 441261 6 73543.5
從而對找出的語句進(jìn)行進(jìn)一步優(yōu)化。當(dāng)然我們還可以為一個正在運(yùn)行的會話中運(yùn)行的所有SQL語句生成執(zhí)行計劃,這需要對該會話進(jìn)行跟蹤,產(chǎn)生trace文件,然后對該文件用tkprof程序格式化一下,這種得到執(zhí)行計劃的方式很有用,因為它包含其它額外信息,如SQL語句執(zhí)行的每個階段(如Parse、Execute、Fetch)分別耗費(fèi)的各個資源情況(如CPU、DISK、elapsed等)。
3、啟用SQL_TRACE跟蹤所有后臺進(jìn)程活動:
全局參數(shù)設(shè)置: .OracleHome/admin/SID/pfile中指定: SQL_TRACE = true (10g)
當(dāng)前session中設(shè)置:
SQL alter session set SQL_TRACE=true;
SQL select * from dual;
SQL alter session set SQL_TRACE=false;
對其他用戶進(jìn)行跟蹤設(shè)置:
SQL select sid,serial#,username from v$session where username='XXX';
SID SERIAL# USERNAME
------ ---------- ------------------
127 31923 A
128 54521 B
開啟跟蹤:SQL exec dbms_system.set_SQL_TRACE_in_session(127,31923,true);
關(guān)閉跟蹤:SQL exec dbms_system.set_SQL_TRACE_in_session(127,31923,false);
然后使用oracle自帶的tkprof命令行工具格式化跟蹤文件。
4、使用10046事件進(jìn)行查詢:
10046事件級別:
Lv1 - 啟用標(biāo)準(zhǔn)的SQL_TRACE功能,等價于SQL_TRACE
Lv4 - Level 1 + 綁定值(bind values)
Lv8 - Level 1 + 等待事件跟蹤
Lv12 - Level 1 + Level 4 + Level 8
全局設(shè)定:
OracleHome/admin/SID/pfile中指定: EVENT="10046 trace name context forever,level 12"
當(dāng)前session設(shè)定:
開啟:SQL alter session set events '10046 trace name context forever, level 8';
關(guān)閉:SQL alter session set events '10046 trace name context off';
對其他用戶進(jìn)行設(shè)置:
SQL select sid,serial#,username from v$session where username='XXX';
SID SERIAL# USERNAME
------ ---------- ------------------
127 31923 A
SQL exec dbms_system.set_ev(127,31923,10046,8,'A');
5、使用tkprof格式化跟蹤文件: (根據(jù)下面SQL語句得到的文件都不存在該目錄下,郁悶啊,懵懂啊...)
一般,一次跟蹤可以分為以下幾步:
1、界定需要跟蹤的目標(biāo)范圍,并使用適當(dāng)?shù)拿顔⒂盟韪櫋?/p>
2、經(jīng)過一段時間后,停止跟蹤。此時應(yīng)該產(chǎn)生了一個跟蹤結(jié)果文件。
3、找到跟蹤文件,并對其進(jìn)行格式化,然后閱讀或分析。
--使用一下SQL找到當(dāng)前session的跟蹤文件:
SELECT d.value|| '/' ||lower(rtrim(i.instance, chr( 0 )))|| '_ora_' ||p.spid|| '.trc' trace_file_namefrom( select p.spid from v$mystat m,v$session s, v$process pwhere m.statistic# = 1 and s.sid = m.sid and p.addr = s.paddr) p,( select t.instance from v$thread t,v$parameter vwhere v.name = 'thread' and (v.value = 0 or t.thread# = to_number(v.value))) i,( select value from v$parameter where name = 'user_dump_dest' ) d;-- 其它用戶的 session SELECT d.value|| '/' ||lower(rtrim(i.instance, chr( 0 )))|| '_ora_' ||p.spid|| '.trc' trace_file_name from ( select p.spid from v$session s, v$process p where s.sid= '27' and s. SERIAL#= '30' and p.addr = s.paddr) p, ( select t.instance from v$thread t,v$parameter v where v.name = 'thread' and (v.value = 0 or t.thread# = to_number(v.value))) i, ( select value from v$parameter where name = 'user_dump_dest' ) d;
--查找后使用tkprof命令,將TRACE文件格式為到D盤的explain_format.txt文件中
SQL $tkprof d:/oracle/admin/FZLGFM/udump/fzlgfm_ora_3468.trc d:/explain_format.txt
文件內(nèi)容大致如下(看不太懂....懵懂啊.....天啊....神啊.....過幾時就懂了/////////////)
TKPROF: Release 9.2.0.1.0 - Production on 星期二 4月 20 13:59:20 2010
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
Trace file: d:/oracle/admin/FZLGFM/udump/fzlgfm_ora_3468.trc
Sort options: default
********************************************************************************
count = number of times OCI procedure was executed
cpu = cpu time in seconds executing
elapsed = elapsed time in seconds executing
disk = number of physical reads of buffers from disk
query = number of buffers gotten for consistent read
current = number of buffers gotten in current mode (usually for update)
rows = number of rows processed by the fetch or execute call********************************************************************************
alter session set events '10046 trace name context forever, level 8'
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 0 0.00 0.00 0 0 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 0 0.00 0.00 0 0 0 0
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 1 0.00 0.00 0 0 0 0
Misses in library cache during parse: 0
Misses in library cache during execute: 1
Optimizer goal: CHOOSE
Parsing user id: SYS
查詢Oracle正在執(zhí)行的sql語句及執(zhí)行該語句的用戶
SELECT b.sid oracleID, b.username 登錄Oracle用戶名, b.serial#, spid 操作系統(tǒng)ID, paddr, sql_text 正在執(zhí)行的SQL, b.machine 計算機(jī)名FROM v$process a, v$session b, v$sqlarea cWHERE a.addr = b.paddr AND b.sql_hash_value = c.hash_value
查看正在執(zhí)行sql的發(fā)起者的發(fā)放程序
SELECT OSUSER 電腦登錄身份, PROGRAM 發(fā)起請求的程序, USERNAME 登錄系統(tǒng)的用戶名, SCHEMANAME, B.Cpu_Time 花費(fèi)cpu的時間, STATUS, B.SQL_TEXT 執(zhí)行的sqlFROM V$SESSION ALEFT JOIN V$SQL B ON A.SQL_ADDRESS = B.ADDRESS AND A.SQL_HASH_VALUE = B.HASH_VALUEORDER BY b.cpu_time DESC
一般需要借助第三方工具來查看執(zhí)行計劃。
工具:PL/SQL
步驟:
1、打開第三方工具PL/SQL,并登錄到指定數(shù)據(jù)庫。
2、新建一個查詢,編寫SQL語句。
3、此時不要執(zhí)行該語句,而是按電腦上的F5鍵,部分筆記本鍵盤需要同時按FN和F5鍵。
4、然后就能看到執(zhí)行計劃了。
打開PL/SQL Developer,找到tables底下對應(yīng)的表,右鍵選擇“查看”菜單,右下角有個“查看SQL”的按鈕,點下就可以看到建表語句了?;蛘摺靶陆ā?-“SQL窗口”,然后輸入表名,右鍵選擇“查看”菜單,再點擊“查看SQL”按鈕。
其實沒有那么為麻煩,你可以打開ORACLE視圖編輯器。 中顯示ORACLE語句,想要什么語句你自己試吧! 包括表的一些屬性項都可以加上的,先從數(shù)據(jù)庫避免死鎖的一般方法談起,然后分別說明各種方法的應(yīng)用場景以及在不同應(yīng)用場景下鎖的類型,并舉例在什么時候應(yīng)用并說明原因,還要說明不同機(jī)制在什么情況下可能發(fā)生死鎖,最后提出改進(jìn)意見。