ORACLE檢視SQL的執行次數/頻率
ORACLE檢視SQL的執行次數/頻率
在ORACLE資料庫應用調優中,一個SQL的執行次數/頻率也是常常需要關注的,因為某個SQL執行太頻繁,要麼是由於應用設計有缺陷,需要在業務邏輯上做出最佳化處理,要麼是業務特殊性所導致。如果執行頻繁的SQL,往往容易遭遇一些併發性的問題。
那麼如何檢視ORACLE資料庫某個SQL的執行頻率/次數呢? 有哪些途徑方法呢?
方法1: 透過查詢V$SQLAREA或V$SQL的EXECUTIONS來檢視SQL的執行次數,但是這個值的有效性需要結合FIRST_LOAD_TIME來判斷。因為V$SQLAREA或V$SQL中不儲存歷史資料,具有一定的時效性,所以如果要查詢很久以前的某個SQL執行次數是辦不到的。
關於V$SQLAREA
FIRST_LOAD_TIME VARCHAR2(19) Timestamp of the parent creation time
EXECUTIONS NUMBER Total number of executions, totalled over all the child cursors
如下所示,我們透過一個例子來演示如何查詢一個語句的執行次數。
SQL> COL START_TIME FOR A20;
SQL> SELECT TO_CHAR(sysdate,'YYYY-MM-DD HH24:MI:SS') AS START_TIME FROM DUAL;
START_TIME--------------------2014-11-20 13:51:21
SQL>
SQL> SELECT SQL_ID, SQL_TEXT,FIRST_LOAD_TIME, EXECUTIONS
2 FROM V$SQLAREA
3 WHERE SQL_TEXT LIKE '%SELECT * FROM TEST%';
SQL_ID SQL_TEXT RST_LOAD_TIME EXECUTIONS----------- -------------------------------------- ---------------- ----------
SQL> SELECT * FROM TEST;
ID NAME----------- ----------
SQL>
SQL> SELECT SQL_ID, SQL_TEXT,FIRST_LOAD_TIME, EXECUTIONS
2 FROM V$SQLAREA
3 WHERE SQL_TEXT LIKE '%SELECT * FROM TEST%';
SQL_ID SQL_TEXT FIRST_LOAD_TIME EXECUTIONS----------- -------------------------------------- -4ntr8ag38ujwd SELECT * FROM TEST 2014-11-20/13:51:40 1
SQL> SELECT * FROM TEST; ID NAME----------- ----------
SQL>
SQL> SELECT SQL_ID, SQL_TEXT,FIRST_LOAD_TIME, EXECUTIONS
2 FROM V$SQLAREA
3 WHERE SQL_TEXT LIKE '%SELECT * FROM TEST%';
SQL_ID SQL_TEXT FIRST_LOAD_TIME EXECUTIONS------------- -------------------------------- --4ntr8ag38ujwd SELECT * FROM TEST 2014-11-20/13:51:40 2
如果此時清空共享池,那麼你會發現V$SQLAREA中對應的SQL的EXECUTIONS次數清零了。
SQL> ALTER SYSTEM FLUSH SHARED_POOL;
System altered
SQL> SELECT * FROM TEST;
ID NAME----------- ----------
SQL>
SQL> SELECT SQL_ID, SQL_TEXT,FIRST_LOAD_TIME, EXECUTIONS
2 FROM V$SQLAREA
3 WHERE SQL_TEXT LIKE '%SELECT * FROM TEST%';
SQL_ID SQL_TEXT FIRST_LOAD_TIME EXECUTIONS------------- ----------------------------------- ----4ntr8ag38ujwd SELECT * FROM TEST 2014-11-20/13:52:38 1
如果要檢視某個時間段該SQL語句執行了多少次,那麼必須在這兩個時間段執行上面SQL語句,兩次EXECUTIONS的差值表示這段時間內SQL語句的執行次數。EXECUTIONS是全域性的,往往不能檢視某個會話或使用者執行了多少次。這也是其侷限性之一。
方法2:透過DBA_HIST_SQLSTAT關聯DBA_HIST_SNAPSHOT找出某些SQL的執行次數,但是部分快照如果沒有捕獲到有些SQL。這樣也就無法透過下面SQL語句檢視執行次數。也是就說這種方法是有缺陷的。執行越頻繁的語句,也越容易被SNAPSHOT抓取到.
SELECT M.SQL_ID ,
TO_CHAR(N.BEGIN_INTERVAL_TIME, 'YYYY-MM-DD') "DATETIME",
SUM(M.EXECUTIONS_DELTA) EXECUTIONS
FROM DBA_HIST_SQLSTAT M, DBA_HIST_SNAPSHOT N
WHERE M.SNAP_ID = N.SNAP_ID AND M.DBID = N.DBID AND M.INSTANCE_NUMBER = N.INSTANCE_NUMBER AND M.INSTANCE_NUMBER=1 AND TO_CHAR(N.BEGIN_INTERVAL_TIME, 'YYYY-MM-DD') ='2014-11-20' AND M.SQL_ID=&SQL_ID
GROUP BY M.SQL_ID , TO_CHAR(N.BEGIN_INTERVAL_TIME, 'YYYY-MM-DD')
ORDER BY M.SQL_ID
方法3:AWR報告檢視某個SQL的執行次數,同上面一樣,AWR報告也受SNAPSHOT影響。不一定捕獲了你需要查詢的SQL
檢視當前資料庫執行次數最多的SQL,例如,查詢執行最頻繁的TOP 15的SQL語句。
SELECT SQL_TEXT, EXECUTIONS
FROM (SELECT SQL_TEXT,
EXECUTIONS,
RANK() OVER(ORDER BY EXECUTIONS DESC) EXEC_RANK
FROM V$SQLAREA)
WHERE EXEC_RANK <= 15;
在ORACLE資料庫應用調優中,一個SQL的執行次數/頻率也是常常需要關注的,因為某個SQL執行太頻繁,要麼是由於應用設計有缺陷,需要在業務邏輯上做出最佳化處理,要麼是業務特殊性所導致。如果執行頻繁的SQL,往往容易遭遇一些併發性的問題。
那麼如何檢視ORACLE資料庫某個SQL的執行頻率/次數呢? 有哪些途徑方法呢?
方法1: 透過查詢V$SQLAREA或V$SQL的EXECUTIONS來檢視SQL的執行次數,但是這個值的有效性需要結合FIRST_LOAD_TIME來判斷。因為V$SQLAREA或V$SQL中不儲存歷史資料,具有一定的時效性,所以如果要查詢很久以前的某個SQL執行次數是辦不到的。
關於V$SQLAREA
FIRST_LOAD_TIME VARCHAR2(19) Timestamp of the parent creation time
EXECUTIONS NUMBER Total number of executions, totalled over all the child cursors
如下所示,我們透過一個例子來演示如何查詢一個語句的執行次數。
SQL> COL START_TIME FOR A20;
SQL> SELECT TO_CHAR(sysdate,'YYYY-MM-DD HH24:MI:SS') AS START_TIME FROM DUAL;
START_TIME--------------------2014-11-20 13:51:21
SQL>
SQL> SELECT SQL_ID, SQL_TEXT,FIRST_LOAD_TIME, EXECUTIONS
2 FROM V$SQLAREA
3 WHERE SQL_TEXT LIKE '%SELECT * FROM TEST%';
SQL_ID SQL_TEXT RST_LOAD_TIME EXECUTIONS----------- -------------------------------------- ---------------- ----------
SQL> SELECT * FROM TEST;
ID NAME----------- ----------
SQL>
SQL> SELECT SQL_ID, SQL_TEXT,FIRST_LOAD_TIME, EXECUTIONS
2 FROM V$SQLAREA
3 WHERE SQL_TEXT LIKE '%SELECT * FROM TEST%';
SQL_ID SQL_TEXT FIRST_LOAD_TIME EXECUTIONS----------- -------------------------------------- -4ntr8ag38ujwd SELECT * FROM TEST 2014-11-20/13:51:40 1
SQL> SELECT * FROM TEST; ID NAME----------- ----------
SQL>
SQL> SELECT SQL_ID, SQL_TEXT,FIRST_LOAD_TIME, EXECUTIONS
2 FROM V$SQLAREA
3 WHERE SQL_TEXT LIKE '%SELECT * FROM TEST%';
SQL_ID SQL_TEXT FIRST_LOAD_TIME EXECUTIONS------------- -------------------------------- --4ntr8ag38ujwd SELECT * FROM TEST 2014-11-20/13:51:40 2
如果此時清空共享池,那麼你會發現V$SQLAREA中對應的SQL的EXECUTIONS次數清零了。
SQL> ALTER SYSTEM FLUSH SHARED_POOL;
System altered
SQL> SELECT * FROM TEST;
ID NAME----------- ----------
SQL>
SQL> SELECT SQL_ID, SQL_TEXT,FIRST_LOAD_TIME, EXECUTIONS
2 FROM V$SQLAREA
3 WHERE SQL_TEXT LIKE '%SELECT * FROM TEST%';
SQL_ID SQL_TEXT FIRST_LOAD_TIME EXECUTIONS------------- ----------------------------------- ----4ntr8ag38ujwd SELECT * FROM TEST 2014-11-20/13:52:38 1
如果要檢視某個時間段該SQL語句執行了多少次,那麼必須在這兩個時間段執行上面SQL語句,兩次EXECUTIONS的差值表示這段時間內SQL語句的執行次數。EXECUTIONS是全域性的,往往不能檢視某個會話或使用者執行了多少次。這也是其侷限性之一。
方法2:透過DBA_HIST_SQLSTAT關聯DBA_HIST_SNAPSHOT找出某些SQL的執行次數,但是部分快照如果沒有捕獲到有些SQL。這樣也就無法透過下面SQL語句檢視執行次數。也是就說這種方法是有缺陷的。執行越頻繁的語句,也越容易被SNAPSHOT抓取到.
SELECT M.SQL_ID ,
TO_CHAR(N.BEGIN_INTERVAL_TIME, 'YYYY-MM-DD') "DATETIME",
SUM(M.EXECUTIONS_DELTA) EXECUTIONS
FROM DBA_HIST_SQLSTAT M, DBA_HIST_SNAPSHOT N
WHERE M.SNAP_ID = N.SNAP_ID AND M.DBID = N.DBID AND M.INSTANCE_NUMBER = N.INSTANCE_NUMBER AND M.INSTANCE_NUMBER=1 AND TO_CHAR(N.BEGIN_INTERVAL_TIME, 'YYYY-MM-DD') ='2014-11-20' AND M.SQL_ID=&SQL_ID
GROUP BY M.SQL_ID , TO_CHAR(N.BEGIN_INTERVAL_TIME, 'YYYY-MM-DD')
ORDER BY M.SQL_ID
方法3:AWR報告檢視某個SQL的執行次數,同上面一樣,AWR報告也受SNAPSHOT影響。不一定捕獲了你需要查詢的SQL
檢視當前資料庫執行次數最多的SQL,例如,查詢執行最頻繁的TOP 15的SQL語句。
SELECT SQL_TEXT, EXECUTIONS
FROM (SELECT SQL_TEXT,
EXECUTIONS,
RANK() OVER(ORDER BY EXECUTIONS DESC) EXEC_RANK
FROM V$SQLAREA)
WHERE EXEC_RANK <= 15;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28686045/viewspace-1702607/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- win10如何檢視記憶體執行頻率_win10檢視記憶體執行頻率的方法Win10記憶體
- 檢視Oracle的redo日誌切換頻率Oracle
- Oracle檢視sql_id 的歷史執行計劃OracleSQL
- 檢視oracle的redo日誌組切換頻率Oracle
- 如何檢視SQL的執行計劃SQL
- Oracle檢視執行計劃的命令Oracle
- Oracle“並行執行”——監控檢視Oracle並行
- 【SQL_PLAN】Oracle 透過檢視sql_plan 格式化執行計劃SQLOracle
- [ORACLE] SQL執行OracleSQL
- 【TUNE_ORACLE】檢視錶的總塊數SQL參考OracleSQL
- 檢視mysql執行狀態的一些sqlMySql
- Oracle - 執行過的SQL、正在執行的SQL、消耗資源最多的SQLOracleSQL
- [Python手撕]執行操作使頻率分數最大Python
- 檢視JVM執行時引數JVM
- linux檢視網路報文頻率Linux
- Oracle檢視歷史TOP SQLOracleSQL
- 檢視SQL執行計劃的幾種常用方法YQSQL
- Oracle如何檢視真實執行計劃(一)Oracle
- Laravel 佇列執行頻率限制Laravel佇列
- 檢視一個正在執行的sql的執行計劃(explain for connection processlist_id)SQLAI
- Oracle sql執行計劃OracleSQL
- 檢視Github 發行版下載次數Github
- 達夢資料庫SQL執行計劃檢視方法資料庫SQL
- oracle查詢sql執行耗時、執行時間、sql_idOracleSQL
- Jtti:linux怎麼檢視oracle資料庫的執行狀態JttiLinuxOracle資料庫
- oracle資料庫sql查詢檢視第二次查詢很慢Oracle資料庫SQL
- 如何檢視CPU核數和執行緒數?CPU的核心數、執行緒數的關係和區別執行緒
- 今天寫了一個統計執行sql次數的指令碼SQL指令碼
- Oracle SQL Profile固定執行計劃的方法OracleSQL
- Oracle提高SQL執行效率的三種方法ITOracleSQL
- 後臺執行SQL語句(oracle)SQLOracle
- [20190125]簡單快速檢視那些sql語句正在執行.txtSQL
- 微課sql最佳化(11) 、如何檢視執行計劃SQL
- 【TUNE_ORACLE】檢視每個列的選擇性和基數SQL參考OracleSQL
- 結合作業系統執行緒 檢視mysql中的sql資源 消耗作業系統執行緒MySql
- 查詢oracle正在執行的SQL和事務OracleSQL
- 檢視伺服器CPU的個數、CPU的核數、多核超執行緒數伺服器執行緒
- ORACLE DBA必須記住的常用SQL命令和檢視OracleSQL
- 【TUNE_ORACLE】檢視索引的叢集因子SQL參考Oracle索引SQL