SQL 優化筆記,持續更新

2021-10-04 12:14:39 字數 4053 閱讀 3447

sql

> var x number;

sql>

exec :x :=90;

pl/sql

procedure successfully completed.

sql>

set autot exp

usage: set autot[race] [exp[lain]

][stat[istics]

]sql

>

set autot trace exp stat

sql>

select

count(*

)from test where b> :x;

explain plan以sql語句作為輸入,得到這條sql語句的執行計畫,並將執行計畫輸出儲存到計畫表中。

首先,在你要執行的sql語句前加explain plan for,此時將生成的執行計畫儲存到計畫表中,語句如下:

explain plan for sql語句

然後,在計畫表中查詢剛剛生成的執行計畫,語句如下:

select * from table(dbms_xplan.display);

注意:explain plan只生成執行計畫,並不會真正執行sql語句,因此產生的執行計畫有可能不准,因為:

1)當前的環境可能和執行計畫生成時的環境不同;

2)不會考慮繫結變數的資料型別;

3)不進行變數窺視。

如果你想獲取正在執行的或剛執行結束的sql語句真實的執行計畫(即獲取library cache中的執行計畫),可以到動態效能檢視裡查詢。方法如下:

1)獲取sql語句的游標

游標分為父游標和子游標,父游標由sql_id(或聯合address和hash_value)字段表示,子游標由child_number欄位表示。

如果sql語句正在執行,可以從v$session中獲得它的游標資訊,如:

select status, sql_id, sql_child_number from v$session where status=『active』 and …

如果知道sql語句包含某些關鍵字,可以從v$sql檢視中獲得它的游標資訊,如:

select sql_id, child_number, sql_text from v$sql where sql_text like '%關鍵字%『

2)獲取庫快取中的執行計畫

alter

session

set statistics_level =

all;

--不設定無法獲得a-rows等資訊

sql>

select

*from

table

(dbms_xplan.display_cursor(

'fk641nh8gjzvk'

,null

,'advanced +peeked_binds'))

;sql

>

select

*from

table

(dbms_xplan.display_cursor(

null

,null

,'allstats'))

;

為了獲取快取庫中的執行計畫,可以直接查詢動態效能檢視v$sql_plan和v$sql_plan_statistics_all等,但更方便的方法是以sql_id和子游標為引數,執行如下語句:

select plan_table_output from

table

(dbms_xplan.display_cursor(

'&sql_id',0

,'allstats'))

;

3)獲取前一次的執行計畫:

set serveroutput off

select

*from

table

(dbms_xplan.display_cursor(

null

,null

,'allstats last'))

;select

/*+ gather_plan_statistics*/..

.--推薦

select

*from

table

(dbms_xplan.display_cursor(

null

,null

,'advanced allstats last peeked_binds'

))

awr會定時把動態效能檢視中的執行計畫儲存到dba_hist_sql_plan檢視中,如果你想要檢視歷史執行計畫,可以採用如下方法查詢:

select plan_table_output from

table

(dbms_xplan.display_awr(

'&sql_id'

,null

,null

,'advanced +peeked_binds'))

;

在用sqlplus做sql開發是(autotrace)

set autotrace是sqlplus工具的乙個功能,只能在通過sqlplus連線的session中使用,它非常適合在開發時測試sql語句的效能,有以下幾種引數可供選擇:

set autotrace off

---------------- 不顯示執行計畫和統計資訊,這是預設模式

set autotrace on

explain

------ 只顯示優化器執行計畫

set autotrace on

statistics

-- 只顯示統計資訊

set autotrace on

----------------- 執行計畫和統計資訊同時顯示

set autotrace traceonly ------ 不真正執行,只顯示預期的執行計畫,同explain plan

sql_trace作為初始化引數可以在例項級別啟用,也可以只在會話級別啟用,在例項級別啟用sql_trace會導致所有程序的活動被跟蹤,包括後台程序及所有使用者程序,這通常會導致比較嚴重的效能問題,所以在一般情況下,我們使用sql_trace跟蹤當前程序,方法如下:

sql>alter session set sql_trace=true;

…被跟蹤的sql語句…

sql>alter session set sql_trace=false;

如果要跟蹤其它程序,可以通過oracle提供的系統包dbms_system. set_sql_trace_in_session來實現,例如:

sql

>

exec dbms_system.set_sql_trace_in_session(sid,

serial

#,true) --開始跟蹤

sql>

exec dbms_system.set_sql_trace_in_session(sid,

serial

#,false) --結束跟蹤

生成trace檔案後,再用tkprof 工具將sql trace 生成的跟蹤檔案轉換成易讀的格式,語法如下:

tkprof inputfile outputfile

select

*from

table

(dbms_xplan.display_awr(

'sql_id'

);

select

/*+ gather_plan_statistics */ owner,object_name from t1 where object_id=

10086000

;select

*from

table

(dbms_xplan.display_cursor(

null

,null

,'allstats last'))

;

SQL效能優化 持續更新中。。。。。。

1 通過rowid訪問表 索引 你可以採用基於rowid的訪問方式情況,提高訪問表的效率,rowid包含了表中記錄的物理位置資訊.oracle採用索引 index 實現了資料和存放資料的物理位置 rowid 之間的聯絡.通常索引提供了快速訪問rowid的方法,因此那些基於索引列的查詢就可以得到效能上...

Oracle中SQL效能優化(持續更新)

decode函式相當於case when 但是decode從效率上來講是強於case when的,但是從個人使用的角度來說case when的使用可以更加多樣化,這一點強於decode,兩者的選擇還是從現實中抉擇。刪除資料的角度來說,可以使用 truncate和delete和drop,從效率來說tr...

mysql優化理解筆記(持續更新)

目前最常見的是innodb和myisam兩個儲存引擎 1 innodb 支援事務處理,提供行級鎖 外來鍵約束索引,行鎖 2 myisam 支援全文搜尋,表鎖 對於經常需要增刪改操作的表建議使用innodb,因為有事務處理 要麼成功要麼失敗回滾 而需要大量查詢操作的表建議用myisam 索引可以大大提...