驗證TimesTen統計收集後SQL重新編譯
統計資訊收集無論是在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----------------------
術語解釋:
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 重新編譯python(親證有效)編譯Python
- 重新收集oracle表的統計資訊Oracle
- launchbadge/sqlx: Rust SQL工具包讓SQL在編譯時驗證檢查SQLRust編譯
- sqlx是一個Rust SQL工具包:讓SQL在編譯時驗證檢查SQLRust編譯
- 驗證碼---js重新整理驗證碼JS
- 微課sql最佳化(3)、統計資訊收集(2)-如何收集統計資訊SQL
- Hadoop SRC重新編譯Hadoop編譯
- [非專業翻譯] Mapster - 對映配置驗證和編譯編譯
- C# 反編譯問題收集C#編譯
- js驗證碼重新傳送倒數計時效果JS
- 批量修改資料後應收集統計資訊
- 傳送簡訊驗證,後按鈕倒數計時,防止重新整理倒數計時失效
- 收集統計資訊的SQL指令碼(sosi.sql)--崔華大師SQL指令碼
- CentOS 下重新編譯 nginx 新增模組CentOS編譯Nginx
- oracle 失效物件自動重新編譯Oracle物件編譯
- MAC使用APKTool反編譯apk修改版本號後重新打包MacAPK編譯
- 微課sql最佳化(8)、統計資訊收集(6)-統計資訊查詢SQL
- oracle 儲存過程重新編譯方法Oracle儲存過程編譯
- 【TUNE_ORACLE】定製化收集統計資訊SQL參考OracleSQL
- SQL 收集SQL
- Oracle收集統計資訊Oracle
- Oracle 統計資訊收集Oracle
- 收集oracle統計資訊Oracle
- ORACLE 收集統計資訊Oracle
- nginx 重新編譯 lua 模組不停服(記錄)Nginx編譯
- Unity3D-重新編譯Mono加密DLLUnity3D編譯Mono加密
- 短視訊商城系統,通過Java實現圖片驗證碼,點選重新整理圖片驗證碼Java
- 後端安全驗證過程後端
- MVC 後設資料驗證MVC
- 雙重保險——前端bootstrapValidator驗證+後臺MVC模型驗證前端bootMVC模型
- 後端編譯與優化後端編譯優化
- 編譯器後端總結編譯後端
- MyEclipse10——java專案clean重新編譯EclipseJava編譯
- 用Gulp編譯Sass並實時重新整理編譯
- Oracle EBS 重新編譯無效物件 invalid objectOracle編譯物件Object
- 在使用make編譯時,修改原始檔的註釋內容,是否會重新編譯?編譯
- 收集全庫統計資訊
- mysql如收集統計資訊MySql