台灣最大程式設計社群網站
線上人數
2126
 
會員總數:245257
討論主題:189112
歡迎您免費加入會員
討論區列表 >> Oracle >> <轉載oracle電子報>關於剩餘資料塊的檢驗 之2
[]  
[我要回覆]
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
<轉載oracle電子報>關於剩餘資料塊的檢驗 之2
價值 : 10 QP  點閱數:2561 回應數:0

樓主

SHOYO
門外漢
0 7
28 0
發送站內信

轉自 http://www.performance-insight.com/china/html/ora3/back/freeblock_2_ct.html
---

<關於剩餘資料塊的檢驗 之2>
∼∼∼∼讀者的疑問∼∼∼∼
有位讀者問道:coalesce(結合)會自動執行嗎?Oracle的版本不同coalesce的動作就會不同嗎?只要看了這次的介紹,大家應該就能明白這兩個問題的答案。

接著上次的內容,這次要繼續介紹剩餘資料塊的檢驗。
進行「coalesce(結合)」有下面三種時間點:

1. 執行alter tablespace <表空間名>coalesce 的時候
2. 每隔5分鐘smon會自動執行一次(僅限於設定為表空間pctincrease 0以外的表空間)
3. 不論是否設定為pctincrease 0,假如不執行coalesce,就沒有足夠的空閒空間分配為extent

上次我們已經介紹了1.的部分,並且說明了執行1. 的指令之後V$LOCK的動作。這次我們將檢驗2.的部分並且加以說明。 首先,我們先單純地確認pctincrease取值為0與非0的時候,間隔了5分鐘之後會不會執行coalesce。當然,在進行檢驗之前,先執行CREATE TABLE和DROP TABLE等步驟,創建有extent邊界的剩餘資料塊。換句話說,先讓系統生成碎片。結果,在pctincrease為0的情況下,不會執行coalesce,但是在pctincrease非0的情況下會執行coalesce。create tablespace和alter tablespace在default storage指定的pctincrease有兩種意義。一種是現在檢驗的「是否執行coalesce」,另一種是執行create table的時候, 如果沒有指定pctincrease,就會以缺省設定使用存放那個表的tablespace的pctincrease。

此外,coalesce是以表空間為單位,所以即使對一些TABLE指定了幾個pctincrease,對表空間來說,是以pctincrease是不是0決定。接下來,我們來看看smon執行coalesce的時候為了鎖定對象表空間所執行的SQL語句。下面是在Oracle 8.1的環境得到的結果。

*************************************************************
select f.file#, f.block#, f.ts#, f.length from fet$ f, ts$ t
where t.ts#=f.ts# and t.dflextpct!=0 and t.bitmapped=0
*************************************************************



順帶一提,這個sql語句可以利用

*************************************************************
SELECT SID,SQL_TEXT FROM V$SQL ,V$SESSION
WHERE ADDRESS = SQL_ADDRESS AND TYPE='BACKGROUND';
*************************************************************



在BACKGROUND執行就能看得到sql語句,請大家試試看。另外,看看v$session_wait,就能看到每隔300秒,也就是每隔5分鐘,smon就會執行一次。

下面的SID(Session ID)和上面在BACKGROUND執行的SQL語句的SID一致。
*************************************************************
SID SEQ# EVENT P1TEXT P1
----------------------------------------
5 1457 smon timer sleep time 300
*************************************************************



回到原來的主題,執行coalesce的時候為了鎖定對象表空間所執行的SQL語句的where語句的t.dflextpct!=0部分,代表pctincrease限定在0以外。另外,where語句的t.bitmapped=0部分是ts# 表的項目,不過其實這和8.1的新功能有關。 執行create database的時候,會執行sql.bsq(oracle_home/rdbms/admin)。其中包括了建立這個ts# 表的script。其中, bitmapped帶有下面的說明。/* If not bitmapped, 0 else unit size */

看起來好像是使用bitmap來管理表空間。在USER_TABLESPACES畫面,EXTENT_MANAGEMENT項目會根據這個bitmapped以decode函數改換成下面這樣。

decode(ts.bitmapped, 0, 'DICTIONARY', 'LOCAL')

如果是0就返回'DICTIONARY'如果不是就返回'LOCAL'。

這裡表示了表空間的種類不是'DICTIONARY'就是'LOCAL'。'DICTIONARY'是原來的表空間, 'LOCAL'是Local extent management的表空間。換句話說,如果是原來的表空間就還是會coalesce,但是Oracle 8.1之後的新功能Local extent management的表空間就不會coalesce。

因為Local extent management是Oracle 8.1之後的新功能,所以更早的版本的SQL語句的where語句只到where t.ts#=f.ts# and t.dflextpct!=0為止。

關於Local extent management,過一陣子我們會另外加以檢驗說明。在Oracle 8.1當中,會在create tablespace的時候決定究竟是Local extent management還是原來的表空間。Oracle 8.1的sql說明手冊的create tablespace語句和Oracle 8.1的概要裡有詳細說明,請大家參考。

大家明白coalesce了嗎?此外,關於SMON的自動coalesce功能,根據我們檢驗的結果,Oracle7.1.6之後的版本都會執行。 (之前的版本我們沒有進行檢驗)


搜尋相關Tags的文章: [ oracle ] , [ 資料庫 ] , [ 技術 ] ,
本篇文章發表於2005-04-15 18:18
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
目前尚無任何回覆
   

回覆
如要回應,請先登入.