驗證TimesTen統計收集後SQL重新編譯

tangyunoracle發表於2013-12-27
統計資訊收集無論是在Oracle還是在TimesTen中,都是屬於例行的工作,為SQL執行能夠採用最新的統計資訊,採用最優的執行計劃,生產系統我們一般都會採用定時統計收集的作業,Oracle比較強大,一般不會出現統計收集獲取不到鎖而引發問題,頂多就是使用不到最新的執行計劃,但是對於TimesTen來說就沒那麼強大了,很容易由於獲取不到鎖而引發故障。
術語解釋:
SQL command: 每個SQL在編譯後,都會被重複使用,如果在一個transaction中執行了這個SQL,那麼就會在這個SQL編譯好的command上面加一個S(共享鎖)。
Invalidate: 統計資訊收集之後,所有的SQL都會被標記為invalid,下一次這個SQL被執行的時候就會被重新編譯,來使用最新的統計資訊。
 為了重新編譯,必須加一個X(排他)鎖,獲取不到X鎖,將會不斷的嘗試,阻塞後面的業務。
===》測試:
Command> set autocommit off;
The command succeeded.
Command> Prepare select * from t;
Assigning new prepared command id = 0.
The command succeeded.
Command>
Command> Execute;
Executing prepared command id = 0.
The command succeeded.
===》開啟一個新的視窗,檢視鎖資訊。
[timesten@TT11g-03 ~]$ ttxactadmin abm
2013-09-30 15:41:07.462
/ttchk/DataStore/11g/ABM/abmdata
TimesTen Release 11.2.1.9.8
Outstanding locks

PID     Context            TransID     TransStatus Resource  ResourceID           Mode  SqlCmdID             Name
Program File Name: ttIsqlCmd
4725    0x1f32a780            1.7      Active      Database  0x01312d0001312d00   IX    0                    
                                                   Command   2152156912           S     2152156912           
===》這裡可以看到有一個Command S鎖,下面執行統計收集。
Command> call ttOptEstimateStats('TIMESTEN.T',1,'51 PERCENT');
The command succeeded.
===》統計資訊收集完成後,在一個新的視窗(當前視窗也可以,只要與第一個回話相異),就可以看到請求鎖超時,也就是說在之前的回話沒有結束前,其他使用該SQL的新回話都會超時退出。
Command> set autocommit off;
The command succeeded.
Command> Prepare select * from t;
Assigning new prepared command id = 0.
Source File: cmdutil.c on line number 1497
SQL State: S1T00
Native Error Code: 6003
Error Message: [TimesTen][TimesTen 11.2.1.9.8 ODBC Driver][TimesTen]TT6003: Lock request denied because of time-out
Details: Tran 3.2 (pid 4752) wants X lock on command 2152156912. But tran 1.7 (pid 4725) has it in S (request was S). Holder SQL (select * from t) -- file "cmdComp.c", lineno 2829, procedure "sbSqlCmdRecompile"
The command failed.
Command> exit
問題:為什麼統計資訊收集完成後會造成鎖等待?
答:1、每個SQL在編譯後,都會被重複使用,如果在一個事務中執行了這個SQL,那麼就會在上面加一個S(共享鎖),直到事務提交完成。
   2、在統計收集完成後,所有的SQL都會被標記為invalid,這樣,統計收集後的第一次執行這個SQL被執行的時候就會被重新編譯,來使用最新的統計資訊,往後都會被重複使用。 為了重新編譯,必須加一個X(排他)鎖,如果在獲取X鎖的時候,因為有些事務還沒有結束,那麼這個SQL的S鎖還存在, 那麼X鎖就無法獲得。

Created by Tony.Tang[TangYun]2015.01
------------------End----------------------

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24930246/viewspace-1064993/,如需轉載,請註明出處,否則將追究法律責任。

相關文章