追蹤應用程式所執行的sql語句
我們在確定應用程式效能的時候,更多地會關注其中SQL語句的執行情況。通常應用的效能瓶頸會在資料庫這邊,因此資料庫的sql語句是我們優化的重點。
要對sql語句進行優化,首先要知道應用程式執行了哪些SQL語句。下面我介紹三種方法來獲得應用程式所執行的SQL語句。
方法一:如果你採用的資料庫是oracle的話,那麼可以利用oracle本身的10046事件跟蹤SQL語句。步驟如下:
1、首先獲得spid、sid、serial#,machine為你的機器名
SQL> select b.spid,a.sid,a.serial#,a.machine from v$session a,v$process b where a.paddr = b.addr and a.machine='yz';
SPID SID SERIAL# MACHINE
9497 49 3406 yz
2、利用10046事件開始跟蹤
SQL>execute sys.dbms_system.set_ev(49, 3406,10046,1,'');
PL/SQL procedure successfully completed.
3、這時候你可以執行應用程式,對於web 應用你就可以開啟你認為效能比較差頁面。
4、如果你要檢視這段時間執行了哪些sql語句,可以執行下面的語句結束跟蹤
SQL>execute sys.dbms_system.set_ev(49,3406,10046,0,'');
PL/SQL procedure successfully completed.
5、SQL trace 工具會收集這個過程中執行的SQL的效能狀態資料,記錄到一個跟蹤檔案中.這個跟蹤檔案提供了許多有用的資訊,例如解析次數.執行次數,CPU使用時間等。
6、這時候你可以通過下面的語句獲得產生的跟蹤檔案所在的目錄
SQL> select value from v$parameter where name = 'user_dump_dest';
VALUE
--------------------------------------------------------------------------------
/opt/oracle/admin/ocn/udump
7、在/opt/oracle/admin/ocn/udump下找到yzoracle_ora_9497.trc。9497是你當前應用的spid。
8、注意yzoracle_ora_9497.trc是不可讀的,我們需要執行oracle的tkprof命令,將yzoracle_ora_9497.trc轉化為我們可讀的文字檔案。
tkprof yzoracle_ora_9497.trc yzoracle_ora_9497.sql
這樣你就可以在yzoracle_ora_9497.sql檔案中看到所有的sql語句執行次數,CPU使用時間等資料。
方法二:採用P6Spy
p6spy是一個開源軟體,它可以跟蹤任何使用JDBC的應用產生的資料庫操作。特別適合於監控EJB伺服器產生的 SQL statements。
官方網址:http://www.p6spy.com/
目前P6Spy 適用的應用伺服器包括JBoss, ATG, Orion, JOnAS, iPlanet, WebLogic, WebSphere, Resin and Tomcat.
下面我介紹一下p6spy在weblogic上安裝的步驟:
(1)http://www.p6spy.com/download.html,下載zip包
(2)解壓出p6spy.jar spy.properties兩個檔案
(3)將p6spy.jar 和spy.properties所在目錄放入weblogic的classpath
(4)修改spy.properties
realdriver= oracle.jdbc.driver.OracleDriver 資料庫驅動程式的名字
(5)在weblogic控制檯,修改JDBC-Connection Pool的driver class 類名為com.p6spy.engine.spy.P6SpyDriver
(6)重啟weblogic
(7)這樣在weblgoic的DOMAIN_HOME目錄下的spy.log記錄了資料庫的訪問情況。
方法三:養成良好的程式設計習慣。在應用的資料訪問層DAO的程式中,採用log4j列印出資料庫操作的日誌,這樣你就可以在log中看到執行的sql語句了。
比如:
public List getContactList(String loginId) throws ImContactDAOException {
try {
conn = getDataSource().getConnection();
sql = "select a.login_id, a.contact_id,from im_contact a where a.login_id = ?";
stmt = conn.prepareStatement(sql);
stmt.setString(1, loginId);
rs = stmt.executeQuery();
log.debug("SQL: " + sql);;
......
} catch (SQLException se) {
....
} finally {
....
}
}
如果你採用hibernate實現O/R Mapping的話,只需要在hibernate.cfg.xml檔案中修改show_sql為true,hibernate就會列印出sql的語句。
true
很顯然,三種方法各有自己的優點和適用場合。
方法一,適合於oracle資料庫,獲得的資訊豐富,不僅有sql語句,而且包括了各條sql語句執行的情況,非常方便我們調優。
方法二和方法三都會列印出執行的sql語句,它與資料庫平臺無關,不過不能得到相關的sql效能資料。對於方法三,如果我們系統不是採用jdbc進行資料庫操作的話,比如EJB的Entity Bean,日誌中就不會列印出相應的sql操作。不過EJB的Entity Bean目前已經被認為是失敗之舉,你可以在專案的重構中可以把這塊重構掉,這個體外話了。
大家可以根據自己專案的情況,選擇合適的方法來跟蹤應用產生的SQL操作。
要對sql語句進行優化,首先要知道應用程式執行了哪些SQL語句。下面我介紹三種方法來獲得應用程式所執行的SQL語句。
方法一:如果你採用的資料庫是oracle的話,那麼可以利用oracle本身的10046事件跟蹤SQL語句。步驟如下:
1、首先獲得spid、sid、serial#,machine為你的機器名
SQL> select b.spid,a.sid,a.serial#,a.machine from v$session a,v$process b where a.paddr = b.addr and a.machine='yz';
SPID SID SERIAL# MACHINE
9497 49 3406 yz
2、利用10046事件開始跟蹤
SQL>execute sys.dbms_system.set_ev(49, 3406,10046,1,'');
PL/SQL procedure successfully completed.
3、這時候你可以執行應用程式,對於web 應用你就可以開啟你認為效能比較差頁面。
4、如果你要檢視這段時間執行了哪些sql語句,可以執行下面的語句結束跟蹤
SQL>execute sys.dbms_system.set_ev(49,3406,10046,0,'');
PL/SQL procedure successfully completed.
5、SQL trace 工具會收集這個過程中執行的SQL的效能狀態資料,記錄到一個跟蹤檔案中.這個跟蹤檔案提供了許多有用的資訊,例如解析次數.執行次數,CPU使用時間等。
6、這時候你可以通過下面的語句獲得產生的跟蹤檔案所在的目錄
SQL> select value from v$parameter where name = 'user_dump_dest';
VALUE
--------------------------------------------------------------------------------
/opt/oracle/admin/ocn/udump
7、在/opt/oracle/admin/ocn/udump下找到yzoracle_ora_9497.trc。9497是你當前應用的spid。
8、注意yzoracle_ora_9497.trc是不可讀的,我們需要執行oracle的tkprof命令,將yzoracle_ora_9497.trc轉化為我們可讀的文字檔案。
tkprof yzoracle_ora_9497.trc yzoracle_ora_9497.sql
這樣你就可以在yzoracle_ora_9497.sql檔案中看到所有的sql語句執行次數,CPU使用時間等資料。
方法二:採用P6Spy
p6spy是一個開源軟體,它可以跟蹤任何使用JDBC的應用產生的資料庫操作。特別適合於監控EJB伺服器產生的 SQL statements。
官方網址:http://www.p6spy.com/
目前P6Spy 適用的應用伺服器包括JBoss, ATG, Orion, JOnAS, iPlanet, WebLogic, WebSphere, Resin and Tomcat.
下面我介紹一下p6spy在weblogic上安裝的步驟:
(1)http://www.p6spy.com/download.html,下載zip包
(2)解壓出p6spy.jar spy.properties兩個檔案
(3)將p6spy.jar 和spy.properties所在目錄放入weblogic的classpath
(4)修改spy.properties
realdriver= oracle.jdbc.driver.OracleDriver 資料庫驅動程式的名字
(5)在weblogic控制檯,修改JDBC-Connection Pool的driver class 類名為com.p6spy.engine.spy.P6SpyDriver
(6)重啟weblogic
(7)這樣在weblgoic的DOMAIN_HOME目錄下的spy.log記錄了資料庫的訪問情況。
方法三:養成良好的程式設計習慣。在應用的資料訪問層DAO的程式中,採用log4j列印出資料庫操作的日誌,這樣你就可以在log中看到執行的sql語句了。
比如:
public List getContactList(String loginId) throws ImContactDAOException {
try {
conn = getDataSource().getConnection();
sql = "select a.login_id, a.contact_id,from im_contact a where a.login_id = ?";
stmt = conn.prepareStatement(sql);
stmt.setString(1, loginId);
rs = stmt.executeQuery();
log.debug("SQL: " + sql);;
......
} catch (SQLException se) {
....
} finally {
....
}
}
如果你採用hibernate實現O/R Mapping的話,只需要在hibernate.cfg.xml檔案中修改show_sql為true,hibernate就會列印出sql的語句。
很顯然,三種方法各有自己的優點和適用場合。
方法一,適合於oracle資料庫,獲得的資訊豐富,不僅有sql語句,而且包括了各條sql語句執行的情況,非常方便我們調優。
方法二和方法三都會列印出執行的sql語句,它與資料庫平臺無關,不過不能得到相關的sql效能資料。對於方法三,如果我們系統不是採用jdbc進行資料庫操作的話,比如EJB的Entity Bean,日誌中就不會列印出相應的sql操作。不過EJB的Entity Bean目前已經被認為是失敗之舉,你可以在專案的重構中可以把這塊重構掉,這個體外話了。
大家可以根據自己專案的情況,選擇合適的方法來跟蹤應用產生的SQL操作。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23205405/viewspace-701457/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle執行語句跟蹤 使用sql trace實現語句追蹤OracleSQL
- sql語句如何執行的SQL
- mysql的sql語句執行流程MySql
- SQL 語句的執行順序SQL
- SQL語句執行順序SQL
- Laravel 獲取執行的sql語句LaravelSQL
- sql語句執行緩慢分析SQL
- 後臺執行SQL語句(oracle)SQLOracle
- mysql執行sql語句過程MySql
- Mybatis 動態執行SQL語句MyBatisSQL
- 查詢Oracle正在執行的sql語句及執行該語句的使用者OracleSQL
- SQL Server 查詢歷史執行的SQL語句SQLServer
- SQL語句各子句的執行順序SQL
- Laravel 框架查詢執行的 SQL 語句Laravel框架SQL
- 一條sql語句的執行過程SQL
- MySQL cron定時執行SQL語句MySql
- java連線oracle執行sql語句JavaOracleSQL
- ACCESS2016 SQL語句應用SQL
- SQL 查詢語句的執行順序解析SQL
- 一條update SQL語句是如何執行的SQL
- python關於pymysql 執行sql語句in的用法PythonMySql
- 一條SQL更新語句是如何執行的SQL
- Hive SQL語句的正確執行順序HiveSQL
- 一條SQL更新語句是如何執行的?SQL
- 利用神器BTrace 追蹤線上 Spring Boot應用執行時資訊Spring Boot
- 一條更新的SQL語句是如何執行的?SQL
- 不同的SQL語句執行時需要申請並持有對應的鎖SQL
- [20181119]sql語句執行緩慢分析.txtSQL
- mysql sql語句執行超時設定MySql
- Mybatis原始碼解析之執行SQL語句MyBatis原始碼SQL
- 在oracle中跟蹤會話執行語句的幾種方法Oracle會話
- 一條SQL語句在MySQL中如何執行的MySql
- 一條 SQL 查詢語句是如何執行的?SQL
- MYSQL sql執行過程的一些跟蹤分析(二.mysql優化器追蹤分析)MySql優化
- 輸入的查詢 SQL 語句,是如何執行的?SQL
- DM7聯機執行SQL語句進行加密備份與設定跟蹤日誌SQL加密
- Oracle資料庫SQL語句執行過程Oracle資料庫SQL
- GaussDB SQL查詢語句執行過程解析SQL
- 一條sql語句在mysql中是如何執行的MySql