Oracle中SQL語句執行效率的查詢與解決 (2)
三、使用資料庫特性來獲得有助於檢視效能的處理統計資訊(解釋計劃和AUTOTRACE)
No1: Explain Plan
A)使用Explain工具需要建立Explain_plan表,這必須先進入相關應用表、檢視和索引的所有者的帳戶內. (@D:\oracle\ora92\rdbms\admin\utlxplan)
B) 表結構:
STATEMENT_ID:為一條指定的SQL語句確定特定的執行計劃名稱。如果在EXPLAN PLAN語句中沒有使用SET STATEMENT_ID,那麼此值會被設為NULL。
OPERATION:在計劃的某一步驟執行的操作名稱,例如:Filters,Index,Table,Marge Joins and Table等。
OPTION:對OPERATION操作的補充,例如:對一個表的操作,OPERATION可能是TABLE ACCESS,但OPTION可能為by ROWID或FULL。
Object_Owner:擁有此database Object的Schema名或Oracle帳戶名。
Object_name:Database Object名
Object_type:型別,例如:表、檢視、索引等等
ID:指明某一步驟在執行計劃中的位置。
PARENT_ID:指明從某一操作中取得資訊的前一個操作。通過對與ID和PARENT_ID使用Connect By操作,我們可以查詢整個執行計劃樹。
C)EXPLAIN搜尋路徑解釋
•全表掃描(Full Table Scans)(無可用索引,大量資料,小表 ,全表掃描hints,HWM(High Water Mark), Rowid掃描)
•索引掃描
索引唯一掃描(Index Unique Scans)
索引範圍掃描(Index Range Scans)
索引降序範圍掃描(Index Range Scans Descending)
索引跳躍掃描(Index Skip Scans)
全索引掃描(Full Scans)
快速全索引掃描(Fast Full Index Scans)
索引連線(Index Joins)
點陣圖連線(Bitmap Joins)
•如何選擇訪問路徑: CBO首先檢查WHERE子句中的條件以及FROM子句,確定有哪些訪問路徑是可用的。然後CBO使用這個訪問路徑產生一組可能的執行計劃,再通過索引、表的統計資訊評估每個計劃的成本,最後優化器選擇成本最低的一個。
•表的連線方式:
Nested Loops會迴圈外表(驅動表),逐個比對和內表的連線是否符合條件。在驅動表比較小,內表比較大,而且內外表的連線列有索引的時候比較好。當SORT_AREA空間不足的時候,Oracle也會選擇使用NL。基於Cost的Oracle優化器(CBO)會自動選擇較小的表做外表。(優點:巢狀迴圈連線比其他連線方法有優勢,它可以快速地從結果集中提取第一批記錄,而不用等待整個結果集完全確定下來。缺點:如果內部行源表(讀取的第二張表(內表)已連線的列上不包含索引,或者索引不是高度可選時, 巢狀迴圈連線效率是很低的。如果驅動行源表(從驅動表中提取的記錄)非常龐大時,其他的連線方法可能更加有效。)
SORT- merge JOIN,將兩表的連線列各自排序然後合併,只能用於連線列相等的情況,適合兩表大小相若的情況(在缺乏資料的選擇性或者可用的索引時,或者兩個源表都過於龐大(超過記錄數的5%)時,排序合併連線將比巢狀迴圈連更加高效。但是,排列合併連線只能用於等價連線(WHERE D.deptno=E.dejptno,而不是WHERE D.deptno>=E.deptno)。排列合併連線需要臨時的記憶體塊,以用於排序(如果SORT_AREA_SIZE設定得太小的話)。這將導致在臨時表空間佔用更多的記憶體和磁碟I/O。)
HASH JOIN在其中一表的連線列上作雜湊,因此只有另外一個表做排序合併,理論上比SORT JOIN會快些,需?/td>
"FONT-FAMILY: 宋體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或FULL。
Object_Owner:擁有此database Object的Schema名或Oracle帳戶名。
Object_name:Database Object名
Object_type:型別,例如:表、檢視、索引等等
ID:指明某一步驟在執行計劃中的位置。
PARENT_ID:指明從某一操作中取得資訊的前一個操作。通過對與ID和PARENT_ID使用Connect By操作,我們可以查詢整個執行計劃樹。
C)EXPLAIN搜尋路徑解釋
•全表掃描(Full Table Scans)(無可用索引,大量資料,小表 ,全表掃描hints,HWM(High Water Mark), Rowid掃描)
•索引掃描
索引唯一掃描(Index Unique Scans)
索引範圍掃描(Index Range Scans)
索引降序範圍掃描(Index Range Scans Descending)
索引跳躍掃描(Index Skip Scans)
全索引掃描(Full Scans)
快速全索引掃描(Fast Full Index Scans)
索引連線(Index Joins)
點陣圖連線(Bitmap Joins)
• 如何選擇訪問路徑: CBO首先檢查WHERE子句中的條件以及FROM子句,確定有哪些訪問路徑是可用的。然後CBO使用這個訪問路徑產生一組可能的執行計劃,再通過索引、表的統計資訊評估每個計劃的成本,最後優化器選擇成本最低的一個。
• 表的連線方式:
Nested Loops會迴圈外表(驅動表),逐個比對和內表的連線是否符合條件。在驅動表比較小,內表比較大,而且內外表的連線列有索引的時候比較好。當SORT_AREA空間不足的時候,Oracle也會選擇使用NL。基於Cost的Oracle優化器(CBO)會自動選擇較小的表做外表。(優點:巢狀迴圈連線比其他連線方法有優勢,它可以快速地從結果集中提取第一批記錄,而不用等待整個結果集完全確定下來。缺點:如果內部行源表(讀取的第二張表(內表)已連線的列上不包含索引,或者索引不是高度可選時, 巢狀迴圈連線效率是很低的。如果驅動行源表(從驅動表中提取的記錄)非常龐大時,其他的連線方法可能更加有效。)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1384/viewspace-264857/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle中SQL語句執行效率的查詢與解決 (3)OracleSQL
- Oracle中SQL語句執行效率的查詢與解決 (1)OracleSQL
- Oracle中SQL語句執行效率問題的查詢與解決OracleSQL
- 查詢Oracle正在執行的SQL語句OracleSQL
- 查詢Oracle正在執行和執行過的SQL語句OracleSQL
- 查詢執行慢的SQL語句SQL
- 查詢正在執行的SQL語句SQL
- 查詢Oracle正在執行的sql語句及執行該語句的使用者OracleSQL
- 查詢效率低下的sql的語句SQL
- Oracle 查詢某個session正在執行的sql語句OracleSessionSQL
- oracle檢視執行最慢與查詢次數最多的sql語句OracleSQL
- mysql查詢效率慢的SQL語句MySql
- Laravel 框架查詢執行的 SQL 語句Laravel框架SQL
- 查詢sql語句執行次數SQL
- SQL Server 查詢歷史執行的SQL語句SQLServer
- 查詢正在執行的sql語句及該語句執行的時間SQL
- 文章主題: 在Oracle中查詢剛才執行過的SQL語句OracleSQL
- SQL查詢語句 (Oracle)SQLOracle
- 【SQL】Oracle sql語句 minus函式執行效率與join對比SQLOracle函式
- oracle查詢語句執行計劃中的表消除Oracle
- SQL 查詢語句的執行順序解析SQL
- 查詢orcale執行的SQL語句記錄SQL
- 在mysql查詢效率慢的SQL語句MySql
- 資料庫查詢優化:使用explain分析sql語句執行效率資料庫優化AISQL
- 一條 SQL 查詢語句是如何執行的?SQL
- T-sql語句查詢執行順序SQL
- GaussDB SQL查詢語句執行過程解析SQL
- 輸入的查詢 SQL 語句,是如何執行的?SQL
- sql server中如何檢視執行效率不高的語句SQLServer
- 查詢當前正在執行的SQL語句並KILLSQL
- oracle、my sql、sql隨機查詢語句OracleSQL隨機
- MySQL資料庫詳解(一)SQL查詢語句是如何執行的?MySql資料庫
- MySql定位執行效率較低的SQL語句MySql
- ORACLE 鎖表的解決方法及查詢引起鎖表SQL語句[轉]OracleSQL
- ORACLE 鎖表的解決方法及查詢引起鎖表SQL語句方法OracleSQL
- oracle使用profiler分析語句執行效率Oracle
- 一條查詢語句的執行流程
- 查詢阻塞與被阻塞SQL語句SQL