① Oracle如何查看sql實際執行計劃
1、 查看最近執行的SQL語句
select/*recentsql*/s.SQL_ID,s.CHILD_NUMBER,s.HASH_VALUE,s.ADDRESS,s.EXECUTIONS,s.SQL_TEXT
fromv$sqls
wheres.PARSING_USER_ID=(
selectu.user_idfromall_usersu
whereu.username='YH_TEST'
)ands.COMMAND_TYPEin(2,3,6,7,189)
anpper(s.SQL_TEXT)notlikeupper('%recentsql%')
select/*+gather_plan_statistics*//*plan_statistics1*/name,salaryfromtestwherename='t1';
2、使用dbms_xplan.display_cursor查看執行計劃,它的用法見筆記 《dbms_xplan.display_cursor的用法》,
注意了:若dbms_xplan.display_cursor要以ALLSTATS LAST格式輸出的話,/*+gather_plan_statistics*/這個提示信息放到查詢語句中是必須的。
② sql server 2000 怎麼查看執行計劃
sql執行計劃查看方式
參閱以上鏈接,
裡面講述了,採用按鈕直接查看執行計劃和採用命令行查看執行計劃的兩種方式
③ 怎麼使用plsql查看執行計劃
一段SQL代碼寫好以後,可以通過查看SQL的執行計劃,初步預測該SQL在運行時的性能好壞,尤其是在發現某個SQL語句的效率較差時,我們可以通過查看執行計劃,分析出該SQL代碼的問題所在。
那麼,作為開發人員,怎麼樣比較簡單的利用執行計劃評估SQL語句的性能呢?總結如下步驟供大家參考:
1、 打開熟悉的查看工具:PL/SQL Developer。
在PL/SQL Developer中寫好一段SQL代碼後,按F5,PL/SQL Developer會自動打開執行計劃窗口,顯示該SQL的執行計劃。
2、 查看總COST,獲得資源耗費的總體印象
一般而言,執行計劃第一行所對應的COST(即成本耗費)值,反應了運行這段SQL的總體估計成本,單看這個總成本沒有實際意義,但可以拿它與相同邏輯不同執行計劃的SQL的總體COST進行比較,通常COST低的執行計劃要好一些。
3、 按照從左至右,從上至下的方法,了解執行計劃的執行步驟
執行計劃按照層次逐步縮進,從左至右看,縮進最多的那一步,最先執行,如果縮進量相同,則按照從上而下的方法判斷執行順序,可粗略認為上面的步驟優先執行。每一個執行步驟都有對應的COST,可從單步COST的高低,以及單步的估計結果集(對應ROWS/基數),來分析表的訪問方式,連接順序以及連接方式是否合理。
④ SQL SERVER如何應用執行計劃
工具/材料
SQLSERVER2012
首先我們來執行一個SQL語句,在輸出結果欄中可以看到並沒有執行計劃頁
然後我們點擊查詢菜單,在下拉菜單中我們選擇」顯示估計的執行計劃」選項,如下圖所示
這個時候在查看輸出結果欄,你會看到多出了執行計劃頁,如下圖所示
下面我們執行兩個SQL語句,如下圖所示,接下來會通過這兩個SQL語句來展示一下執行計劃功能怎麼用
我們執行完上述的SQL語句後,會在執行計劃頁看到如下圖所示的執行計劃內容,SQLSERVER已經幫我們生成了對應的執行計劃
我們先來看第一個SQL語句的執行計劃,如下圖所示,主要展示了SQL語句對資源的消耗情況
然後觀察第二個執行計劃,你會發現第二個SQL語句的執行效率要高一些,這在數據量大的情況下會更明顯
⑤ Mysql學會查看sql的執行計劃
首先在Mysql的服務中有 連接器、查詢緩存(Mysql8 已經刪除)、分析器、優化器、執行器等,所有跨存儲引擎的功能都在這一層實現
而一條sql怎麼執行是由優化器決定的, 優化器是在表裡面有多個索引的時候,決定使用哪個索引;或者在一個語句有多表關聯(join)的時候,決定各個表的連接順序。
而執行計劃就是優化器優化後的sql的執行的詳細方案
Mysql中查看執行計劃的方式有兩種 : 1. 使用desc 2.使用 explain 使用它倆的效果是一樣的
接下來要通過執行計劃知道sql是怎麼執行的
執行計劃中有幾個重要的欄位, 分別是
id, table, type, possible_keys, key, key_len, Extra
id : 可以通過ID來查看在多表聯查中sql是先查詢哪張表的 id相同的從上往下依次執行,id不同的id大的先執行
table : table當然就是查詢的表名
type : 查詢的類型 查詢類型分為 ALL, index, range, ref , eq_ref, const(system), null
ALL: 指的全盤掃描,沒有走任何索引 查詢結果集大於25% 優化器可能會走全盤掃描 字元串查詢的時候一定要加"" 不然可能會全索引掃描(隱式轉換) 統計信息 失效 或者 過舊 也可能走全盤掃描 因為優化器會參考統計信息來制定執行計劃
index: 全索引掃描 就是掃描整顆索引樹
range: 索引范圍 查詢索引樹的一部分范圍 范圍索引中 > < <= >= like 的效率會比 or in 的效率高, 使用like %再前面的不走索引
ref: 輔助索引的等值查詢
當查詢的數據量小,優化器也有可能會走索引的全盤掃描 這里我就不貼圖了;
eq_ref : 多表連接查詢中,被連接的表的連接條件列是主鍵或者唯一鍵
const(system): 主鍵 或者 唯一鍵 的等值查詢
null: 沒有數據
他們的性能是依次遞增的 全盤掃描性能最差, const性能最高
possible_keys: 查詢過程中可能用到的索引
key: 真正使用到的索引
key_len: 走索引的長度
這個是怎麼計算的呢?
key_len 的計算方法 :
int 類型最長存儲4個位元組長度的數字 有not null 是4位元組 沒有的話會花1位元組存儲是不是null
tinyint 最大存儲一個位元組 也會花1位元組來判斷是不是null
字元串類型 : 字元集 utf8mb4 1-4位元組
varchar超過255會預留2個位元組存儲長度 沒超預留1個位元組
key_len 永遠是你設置的長度的最大的
聯合索引可以通過key_len 來判斷走了幾個索引
使用desc format=json select * from table 可以查看詳細情況
filtered: 索引掃描過濾掉數據的佔比
Extra: 額外的信息
Using filesort :MySQL 對數據在sql層進行了排序,而不是按照表內的索引進行排序讀 取。 效率比較低
Using temporary :使用臨時表保存中間結果,也就是說 MySQL 在對查詢結果排序時使用了臨時表,常見於order by 或 group by。
Using index :表示 SQL 操作中使用了覆蓋索引(Covering Index),避免了訪問表的數據行,效率高。
Using index condition :表示 SQL 操作命中了索引,但不是所有的列數據都在索引樹上,還需要訪問實際的行記錄。
Using where :表示 SQL 操作使用了 where 過濾條件。
Select tables optimized away :基於索引優化 MIN/MAX 操作或者 MyISAM 存儲引擎優化 COUNT(*) 操作,不必等到執行階段再進行計算,查詢執行計劃生成的階段即可完成優化。
Using join buffer (Block Nested Loop) :表示 SQL 操作使用了關聯查詢或者子查詢,且需要進行嵌套循環計算
⑥ 獲取SQL執行計劃的常見幾種方法
1. 預估執行計劃 - Explain Plan
Explain plan以SQL語句作為輸入,得到這條SQL語句的執行計劃,並將執行計劃輸出存儲到計劃表中。
首先,在你要執行的SQL語句前加explain plan for,此時將生成的執行計劃存儲到計劃表中,語句如下:
explain plan for SQL語句
然後,在計劃表中查詢剛剛生成的執行計劃,語句如下:
select * from table(dbms_xplan.display);
注意:Explain plan只生成執行計劃,並不會真正執行SQL語句,因此產生的執行計劃有可能不準,因為:
1)當前的環境可能和執行計劃生成時的環境不同;
2)不會考慮綁定變數的數據類型;
3)不進行變數窺視。
2. 查詢內存中緩存的執行計劃 (dbms_xplan.display_cursor)
如果你想獲取正在執行的或剛執行結束的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)獲取庫緩存中的執行計劃
為了獲取緩存庫中的執行計劃,可以直接查詢動態性能視圖v$sql_plan和v$sql_plan_statistics_all等,但更方便的方法是以sql_id和子游標為參數,執行如下語句:
select * from table(dbms_xplan.display_cursor('sql_id',child_number));
3)獲取前一次的執行計劃:
set serveroutput off
select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));
3. 查詢歷史執行計劃(dbms_xplan.display_awr)
AWR會定時把動態性能視圖中的執行計劃保存到dba_hist_sql_plan視圖中,如果你想要查看歷史執行計劃,可以採用如下方法查詢:
select * from table(dbms_xplan.display_awr('sql_id');
4. 在用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
5. 生成Trace文件查詢詳細的執行計劃 (SQL_Trace, 10046)
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
10046事件是SQL_TRACE的一個升級版,它也是追蹤會話,生成Trace文件,只是它裡面的內容更詳細,