驗證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
- launchbadge/sqlx: Rust SQL工具包讓SQL在編譯時驗證檢查SQLRust編譯
- sqlx是一個Rust SQL工具包:讓SQL在編譯時驗證檢查SQLRust編譯
- 微課sql最佳化(3)、統計資訊收集(2)-如何收集統計資訊SQL
- 驗證碼---js重新整理驗證碼JS
- [非專業翻譯] Mapster - 對映配置驗證和編譯編譯
- 傳送簡訊驗證,後按鈕倒數計時,防止重新整理倒數計時失效
- MAC使用APKTool反編譯apk修改版本號後重新打包MacAPK編譯
- 手動收集——收集統計資訊
- CentOS 下重新編譯 nginx 新增模組CentOS編譯Nginx
- 【TUNE_ORACLE】定製化收集統計資訊SQL參考OracleSQL
- 微課sql最佳化(8)、統計資訊收集(6)-統計資訊查詢SQL
- MySQL中普通sql與預編譯sql 區別MySql編譯
- 日常收集整理正規表示式驗證大全
- 圖形驗證碼無痕重新整理
- 微課sql最佳化(2)-為什麼需要收集統計資訊SQL
- 在使用make編譯時,修改原始檔的註釋內容,是否會重新編譯?編譯
- 用Gulp編譯Sass並實時重新整理編譯
- nginx 重新編譯 lua 模組不停服(記錄)Nginx編譯
- Oracle收集統計資訊Oracle
- 收集統計資訊方案
- 精讀《手寫SQL編譯器-回溯》SQL編譯
- GraphJin:GraphQL自動編譯轉為SQL編譯SQL
- 編譯器後端總結編譯後端
- 後端編譯與優化後端編譯優化
- 編譯系統概要編譯
- 短視訊商城系統,通過Java實現圖片驗證碼,點選重新整理圖片驗證碼Java
- 【譯】新的 MSBuild 編輯體驗UI
- 【記憶體資料庫】TimesTen記憶體資料庫
- 雙重保險——前端bootstrapValidator驗證+後臺MVC模型驗證前端bootMVC模型
- 收集全庫統計資訊
- GCC編譯器背後的故事GC編譯
- sql server 重新啟動計算機失敗SQLServer計算機
- 微課sql最佳化(7)、統計資訊收集(5)-關於直方圖SQL直方圖
- windows下體驗quarkus原生編譯打包Windows編譯
- 如何建立SQL Server分析系統資料收集組BSSQLServer
- 簡單幾步實現滑動驗證碼(後端驗證)後端
- sql 注入越過登入驗證例項SQL
- 預編譯SQL為什麼能夠防止SQL隱碼攻擊編譯SQL