免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4586 | 回复: 0
打印 上一主题 下一主题

<转载>Oracle电子杂志 -关于剩余数据块的检验 之2- [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-04-15 17:48 |只看该作者 |倒序浏览
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之後的版本都會執行。 (之前的版本我們沒有進行檢驗)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP