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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- [BUG反饋]AdminController類的一個小bugController
- 一個分詞指令碼分詞指令碼
- 一個方便 LeetCode 複習的指令碼LeetCode指令碼
- oracle的一個bugOracle
- TestHome 的一個 Bug
- Snakeyaml的一個bugYAML
- 一個奇怪的 Bug
- gulp-px2rem-plugin 外掛的一個小bugREMPlugin
- Mybatis order by 動態傳參出現的一個小bugMyBatis
- 抓到Dubbo非同步呼叫的小BUG,再送你一個貢獻開原始碼的機會非同步原始碼
- 向大家分享一個shell指令碼的坑指令碼
- 一個快速檢視trace的小指令碼指令碼
- 共享一個iptables的shell指令碼檔案指令碼
- 一個centos初始化指令碼CentOS指令碼
- 將一個Python指令碼做成一個Windows服務Python指令碼Windows
- 由一個bug找到JS挖礦程式碼JS
- 分享工作中常用的一個Git指令碼Git指令碼
- 分享一個提高運維效率的 Python 指令碼運維Python指令碼
- 一個能夠生成 Markdown 表格的 Bash 指令碼指令碼
- 一個網站故障排查的、程式碼更新的簡便指令碼網站指令碼
- 【緊急情況】:回宿舍放下書包的我,花了20分鐘敲了一個搶購指令碼指令碼
- 發現Mapstruct的一個bugStruct
- 一個排序引發的BUG排序
- 擼一個 iOS 重簽名指令碼iOS指令碼
- 一個“指令碼執行夯死”問題的分析指令碼
- Shell:如何寫一個多選選單的指令碼指令碼
- 6 個方便的 Git 指令碼Git指令碼
- 寫一個Python指令碼刪除一個.py檔案的所有註釋Python指令碼
- 開始你的第一個JMeter指令碼:利用Jmeter錄製指令碼的2種方法彙總JMeter指令碼
- 10g sqlplus的一個bugSQL
- SpringBoot讀取yml的一個bugSpring Boot
- onethink安裝時的一個bug
- 一個與CONNECT BY相關的BUG
- 遭遇ORA-07445 的一個BUG
- PHP 避免同時執行一個指令碼PHP指令碼
- 如何開發一個油猴(TamperMonkey)指令碼指令碼
- 使用Java實現一個JS指令碼引擎JavaJS指令碼
- 一個簡單的Linux啟動jar包的shell指令碼LinuxJAR指令碼
- 一個用於生成大量mac地址的python指令碼MacPython指令碼