Tom新書的一個小bug——mystat指令碼
今天在看Tom的新書Oracle9i&10g程式設計藝術發現了一個小問題。
Tom在這本書開頭部分介紹了他自己的常用工具,其中包括mystat指令碼。這個指令碼的目的是獲取一個操作的某個統計結果變化情況。
其中由兩個指令碼構成,mystat記錄狀態的初始狀態,mystat2記錄最終狀態,並顯示差異。
書中給出的mystat指令碼如下:
SET ECHO OFF
SET VERIFY OFF
COLUMN VALUE NEW_VAL V
DEFINE S="&1"
SET AUTOTRACE OFF
SELECT A.NAME, B.VALUE
FROM V$STATNAME A, V$MYSTAT B
WHERE A.STATISTIC# = B.STATISTIC#
AND LOWER(A.NAME) LIKE '%' || LOWER('&S') || '%'
/
SET ECHO ON
另一個指令碼mystat2如下:
SET ECHO OFF
SET VERIFY OFF
SELECT A.NAME, B.VALUE V, TO_CHAR(B.VALUE - &V, '999,999,999,999') DIFF
FROM V$STATNAME A, V$MYSTAT B
WHERE A.STATISTIC# = B.STATISTIC#
AND LOWER(A.NAME) LIKE '%' || LOWER('&S') || '%'
/
SET ECHO ON
看一下這兩個指令碼的使用:
SQL> @e:\mystat "undo change vector size"
SQL> SET ECHO OFF
NAME VALUE
------------------------------ ----------
undo change vector size 0
SQL> delete t;
已刪除4行。
SQL> @e:\mystat2
SQL> SET ECHO OFF
NAME V DIFF
------------------------------ ---------- ----------------
undo change vector size 1592 1,592
書中給出的例子沒有任何的問題,但是指令碼本身存在問題。
由於Tom使用了SQLPLUS的NEW_VALUE功能來獲取前後兩次統計結果的差異,因此這個功能僅對單個統計項有效。
但是Tom給出的指令碼中在輸入的統計項兩邊追加了%,使得統計項可以模糊匹配,這雖然方便了查詢輸入,但是很容易造成輸入的關鍵字匹配多個統計項。而一旦出現這種情況,則MYSTAT2指令碼中的差異統計就會完全錯誤:
SQL> @e:\mystat "redo"
SQL> SET ECHO OFF
NAME VALUE
------------------------------ ----------
redo synch writes 1
redo synch time 1
redo blocks read for recovery 0
redo entries 6
redo size 4152
redo buffer allocation retries 0
redo wastage 0
redo writer latching time 0
redo writes 0
redo blocks written 0
redo write time 0
redo log space requests 0
redo log space wait time 0
redo log switch interrupts 0
redo ordering marks 0
redo subscn max counts 0
IMU Redo allocation size 1248
已選擇17行。
SQL> create table t_redo as select * from dba_objects;
表已建立。
SQL> @e:\mystat2
SQL> SET ECHO OFF
NAME V DIFF
------------------------------ ---------- ----------------
redo synch writes 3 -1,245
redo synch time 1 -1,247
redo blocks read for recovery 0 -1,248
redo entries 1223 -25
redo size 5817596 5,816,348
redo buffer allocation retries 0 -1,248
redo wastage 0 -1,248
redo writer latching time 0 -1,248
redo writes 0 -1,248
redo blocks written 0 -1,248
redo write time 0 -1,248
redo log space requests 0 -1,248
redo log space wait time 0 -1,248
redo log switch interrupts 0 -1,248
redo ordering marks 20 -1,228
redo subscn max counts 0 -1,248
IMU Redo allocation size 1248 0
已選擇17行。
這個結果已經很清晰的說明了問題,因此這裡應該將指令碼從LIKE方式改為等於的方式,這樣可以避免錯誤的發生。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-214965/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mystat指令碼以及使用指令碼
- 自定義統計結果指令碼mystat指令碼
- 從一個小程式指令碼看DB Time指令碼
- [BUG反饋]AdminController類的一個小bugController
- 一件新的事情-指令碼指令碼
- SQL指令碼生成的一些BUG(1)(轉)SQL指令碼
- SQL指令碼生成的一些BUG(2)(轉)SQL指令碼
- 分享一例指令碼發版和tomcat重啟指令碼指令碼Tomcat
- mystat.sql & mystat2.sqlSQL
- Bash指令碼debug攻略指令碼
- unix下幾個有用的小shell指令碼(轉)指令碼
- 一個awk if 巢狀 if 的指令碼巢狀指令碼
- mysql的一個備份指令碼MySql指令碼
- Tomcat的啟停指令碼原始碼解析Tomcat指令碼原始碼
- Tomcat安裝指令碼Tomcat指令碼
- Tomcat啟動指令碼Tomcat指令碼
- Unity3D熱更新全書-指令碼(一) 初識指令碼Unity3D指令碼
- 一個分詞指令碼分詞指令碼
- Tomcat 7 啟動分析(一)啟動指令碼Tomcat指令碼
- jdk 原始碼的一個BUG,大家來看看JDK原始碼
- 一個清理指令碼的改進思路指令碼
- 一個比較好的shell指令碼指令碼
- 一個自動ftp的指令碼(轉)FTP指令碼
- 記錄一個防止DDL的指令碼指令碼
- Mybatis order by 動態傳參出現的一個小bugMyBatis
- gulp-px2rem-plugin 外掛的一個小bugREMPlugin
- 最簡單的一個powershell的指令碼指令碼
- 抓到Dubbo非同步呼叫的小BUG,再送你一個貢獻開原始碼的機會非同步原始碼
- oracle的一個bugOracle
- 快速部署tomcat專案的Shell指令碼Tomcat指令碼
- 指令碼新選擇——用C做指令碼指令碼
- 共享一個iptables的shell指令碼檔案指令碼
- 一個快速檢視trace的小指令碼指令碼
- 向大家分享一個shell指令碼的坑指令碼
- 一個完整的RMAN備份指令碼(轉)指令碼
- 一個自動生成oracle job的指令碼Oracle指令碼
- 每天檢查正式Server的一個指令碼Server指令碼
- 一個確定trace檔案的指令碼指令碼