Oracle中的 統計溢位為負數的現象(zt)

tolywang發表於2008-07-04
v$sql.buffer_gets由於採用的是C的int型別,C的unsigned int型可以表示2^32,而包含正負整數,就只能表示一半。所以這個數值經常會溢位而顯示負數。隨便找一個生產的資料庫,就可以找到類似的情況:[@more@]

SQL> select sql_text,executions,to_char(buffer_gets) from v$sql where buffer_gets <0;

SQL_TEXT
------------------------------------------------------------------------------------------------------------------------
EXECUTIONS TO_CHAR(BUFFER_GETS)
---------- ----------------------------------------
select count(*) as col_0_0_ from HS_forummessage forummessa0_ where (forummessa0_.forumID=:1 )
205681 -1321805203

select count(info0_.NUMINFOGUID) as col_0_0_ from HS_INFO info0_, HS_C3_LEVEL level1_ where info0_.INTLEVEL=level1_.NUML
EVELID and info0_.INTENABLEDFLAG=1 and info0_.INTPUBLISHSTATE=1 and info0_.DATPUBLISHDATE<=:1 and info0_.NUMCATALOGGUID=
:2 and (level1_.INTLEVEL in (1 , 2 , 3 , 4 , 5)) order by info0_.DATPUBLISHDATE DESC, info0_.NUMORDER DESC
14718967 -1261787636

select count(info0_.NUMINFOGUID) as col_0_0_ from HS_INFO info0_ where info0_.INTENABLEDFLAG=1 and info0_.INTPUBLISHSTAT
E=1 and info0_.DATPUBLISHDATE<=:1 and (info0_.NUMCATALOGGUID in (select catalog1_.NUMCATALOGGUID from HS_CATALOG catalog
1_ where catalog1_.INTCATALOGTYPE=1 and catalog1_.NUMAPPGUID=:2)) and (info0_.VC2INDEXWORDS like :3)
359138 -1950604219

也就是說v$sql檢視中的buffer_gets最多能表示:

SQL> select power(2,32)/2 from dual;

POWER(2,32)/2
-------------
2147483648

基本上超過了2 billion,就要轉為負數了。

那麼這是不是一個Bug呢?
搜尋Metalink可以發現很多相關的Bug報告,例如bug no:5689640

但是最終Oracle不認為這是一個Bug,因為即使底層表x$kglob的相關值定義從KQFCINT() 變更位 KQFCUIN()。也只不過將這個限制擴大了一倍而已,這個限制早晚還會被達到。
所以,這個修正請求被Oracle定義位增強而不是Bug。據說在Oracle11g中這個增強被加入。

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

相關文章