追蹤應用程式所執行的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
- linux strace追蹤mysql執行語句LinuxMySql
- mysql如何跟蹤執行的sql語句MySql
- sql語句如何執行的SQL
- 執行大的sql語句SQL
- sql語句批量執行SQL
- SQL追蹤和事件追蹤SQL事件
- mysql的sql語句執行流程MySql
- SQL 語句的執行順序SQL
- 查詢正在執行的sql語句及該語句執行的時間SQL
- SQL語句執行順序SQL
- toad執行sql語句SQL
- 利用神器BTrace 追蹤線上 Spring Boot應用執行時資訊Spring Boot
- SQL Server SQL語句執行順序SQLServer
- 通過分析SQL語句的執行計劃優化SQL語句SQL優化
- Laravel 獲取執行的sql語句LaravelSQL
- 查詢執行慢的SQL語句SQL
- CoreData執行過程的sql語句SQL
- 識別低效執行的SQL語句SQL
- 剖析SQL語句的執行過程SQL
- Oracle SQL 語句的執行過程OracleSQL
- 清除SQL語句的執行計劃SQL
- 查詢正在執行的SQL語句SQL
- 【MySQL】如何對SQL語句進行跟蹤(trace)?MySql
- 查詢Oracle正在執行的sql語句及執行該語句的使用者OracleSQL
- mysql執行sql語句過程MySql
- Mybatis 動態執行SQL語句MyBatisSQL
- sql語句執行緩慢分析SQL
- 後臺執行SQL語句(oracle)SQLOracle
- Hibernate 執行原始SQL語句SQL
- Oracle SQL語句執行步驟OracleSQL
- phalcon:跟蹤sql語句SQL
- 追蹤時間的10個給力應用程式
- SQL Server 查詢歷史執行的SQL語句SQLServer
- SQL語句各子句的執行順序SQL
- Laravel 框架查詢執行的 SQL 語句Laravel框架SQL
- 一條sql語句的執行過程SQL
- 查詢Oracle正在執行的SQL語句OracleSQL