一資料庫版本
LEO1@LEO1>select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
TNS for Linux:Version 11.2.0.1.0 - Production
NLSRTL Version11.2.0.1.0 - Production
二示範使用SQL_TRACE和10046事件對其它會話進行跟蹤,並給出trace結果
SQL_TRACE:Oracle這個功能主要是為了追蹤SQL的執行過程,分析SQL的效能,資源消耗情況。
1.查看SQL是如何操作處理資料
2.查看SQL在執行過程中產生了的等待事件
3.查看SQL的執行過程資源消耗
4.查看SQL的實際執行計畫
5.查看SQL的遞迴語句
6.如果要探索SQL如何執行的可以詳細看看
10046:用於分析SQL執行過程中效能消耗情況,可以查看綁定變數資訊,可以查看等待事件資訊,它比SQL_TRACE輸入輸出更多參數。
上述工具使用場合:1.最佳化SQL語句
2.查看SQL語句執行計畫
3.跟蹤SQL語句執行過程
4.把會話中SQL的資訊重新導向到一個檔案裡
SET AUTO TRACE:1.輸出SQL語句估算的執行計畫(猜出來的)
2.SQL語句並沒有真正執行,只關注這條SQL的執行計畫對不對
3.只是用來估算執行計畫
實驗
使用SQL_TRACE對其它會話進行跟蹤
如果對當前會話進行跟蹤只需alter session set sql_trace=true;即可,如果對其它會話進行跟蹤還需要設定另外一些參數。
我們現在做一下,從144會話跟蹤12會話的SQL
144會話我們使用leo1使用者操作
12會話我們使用leo2使用者操作
144會話
LEO1@LEO1> selectdistinct sid from v$mystat; 可以查詢當前會話ID
SID
----------------
144
我們用會話ID和串號來唯一定位一個會話,現在我們把2個會話資訊都顯示出來了
LEO1@LEO1>select sid,serial# from v$session where sid in (144,12);
SID SERIAL#
---------------------------------
12 4472
144 979
這時我有了一個疑問,定位一個會話一般來說看sid就可以了,那麼為什麼後面還跟著個serial呢,這個serial是幹什麼用的呢,諮詢了一下Alantany查了一下官方文檔
SID NUMBER:Sessionidentifier 就是會話標識
SERIAL# NUMBER :是用來標識唯一一個會話操作對象的,保證這個會話發出的命令可以正確的應用到對應的會話對象上。
場合一個會話的結束和另一個會話開始都使用了同一個SID,區分這是2個不同的會話
例子
第一次leonarding登陸sid=12,操作了leo1表,退出
SID SERIAL#
---------------------------------
12 4472
第二次Alan登陸sid=12,又操作了leo2表,退出
SID SERIAL#
---------------------------- ----
12 4777
如果只是看SID我們不能分辨出是誰登入了會話操作了leo1表和leo2表,而serial可以分辨出不同會話的命令正確應用到對應的對象上,區分這是2個不同的人登入的會話。
LEO1@LEO1> droptable leo1; 清理環境
Table dropped.
LEO1@LEO1>create table leo1 as select * from dba_objects; 用leo1使用者建立leo1表
Table created.
LEO1@LEO1>select count(*) from leo1; 看看有多少條記錄
COUNT(*)
----------------
72007
LEO1@LEO1>execute dbms_stats.gather_table_stats('LEO1','LEO1',method_opt=>'for allcolumns size 254');
PL/SQL proceduresuccessfully completed.
隨便做個表分析和長條圖
LEO1@LEO1> conn/ as sysdba 切換為管理員