第一篇:090511DB2如何計算和添加表空間、索引的檢查和手動進行執(zhí)行對索引的runstats操作
如何計算和添加表空間、索引的檢查和手動執(zhí)行對索引的runstats
操作
DB2】runstats詳解
2009年06月24日 星期三 11:01 1.runstats的語法:
runstats on table [模式名].[表名] with distribution and detailed indexes all 注意:你可以在所有列上,或者僅僅在某些列或列組(除了LONG和LOB列)上執(zhí)行RUNSTATS。如果沒有指定特定列的子句,系統(tǒng)則會使用默認的ON ALL COLUMNS子句。
使用RUNSTATS WITH DISTRIBUTION 當您已確定表中包含不是統(tǒng)一分布的數(shù)據(jù)時,可以運行包含WITH DISTRIBUTION子句的RUNSTATS。目錄統(tǒng)計信息表通常包含關(guān)于表中最高和最低值的信息,而優(yōu)化器假定數(shù)據(jù)值是在兩個端點值之間均勻分布的。然而,如果數(shù)據(jù)值彼此之間差異較大,或者群集在某些點上,或者是碰到許多重復(fù)的數(shù)據(jù)值,那么優(yōu)化器就無法選擇一個最佳的訪問路徑,除非收集了分布統(tǒng)計信息。使用WITH DISTRIBUTION子句還可以幫助查詢處理沒有參數(shù)標志符(parameter marker)或主機變量的謂詞,因為優(yōu)化器仍然不知道運行時的值是有許多行,還是只有少數(shù)行。
如果為單一索引進行runstats,可以使用:
runstats on table [模式名].[表名] for indexes [索引名]
2.runstats的作用:
一個SQL在寫完并運行之后,其實我們只是告訴了DB2去做什么,而不是如何去做。而,具體的如何去做,就取決于優(yōu)化器。優(yōu)化器為了生成最優(yōu)的執(zhí)行計劃,就得掌握當前的系統(tǒng)信息,目錄中的統(tǒng)計信息等等。
runstats命令就是用來收集數(shù)據(jù)庫對象的狀態(tài)信息,這對優(yōu)化器生成最優(yōu)的執(zhí)行計劃至關(guān)重要。
3.什么時候需要runstats:
·在給表創(chuàng)建一個index后,我們最好做一次runstat,否則可能index沒有生效。不過有說法稱在8.2版本以后的DB2中,會在INDEX之后自動進行runstats; ·.在對table做了一次reorg后,記得要做一次runstats。因為對表做reorg,會修改表的很多信息,比如高水位等,所以做一次runstats,可以更新統(tǒng)計信息。·當表里數(shù)據(jù)發(fā)生了比較大的變化,一般來說,大約表里面的數(shù)據(jù)量的10%-20%發(fā)生了變化,就應(yīng)該作一次runstats。這些變化包括刪除,修改,插入。對于一些非常大的表,比方在數(shù)據(jù)倉庫的項目里面,某些事實表非常巨大。這個時候,完整的對一個大表作runstats可能花費時間相當大,DB2 8.1里面支持我們對這些大表作抽樣,比方說只對20%的數(shù)據(jù)作runstats,這樣的話,一般來說也能保證得到正確的執(zhí)行計劃。當然首先要確保這個表里面的數(shù)據(jù)最好分布比較均勻。
·.當你在分區(qū)(DPF)數(shù)據(jù)庫里面使用了REDISTRIBUTE DATABASE PARTITION GROUP這個命令,那么就需要用runstats來收集新的統(tǒng)計信息。
4.其他
當表比較小的時候,runstats是一件很普通的事情。但是當表非常大的時候,runstats將會占用相當大的時間,cpu和內(nèi)存。通常只在關(guān)鍵查詢的速度開始減慢時,管理員才會對RUNSTATS給予適當?shù)淖⒁狻D梢酝ㄟ^制定高效、有效收集統(tǒng)計信息的策略,避免未經(jīng)思考就調(diào)優(yōu)查詢和執(zhí)行RUNSTATS。
一、DB2 的表空間介紹:
DB2 的表空間按管理方式分為兩種:系統(tǒng)管理空間(System Management Space,SMS)和數(shù)據(jù)庫管理空間(Database Management Space,DMS)。
按類型分為:規(guī)則表空間、長整數(shù)表空間、系統(tǒng)臨時表空間、用戶臨時表空間。其中長整數(shù)表空間只能是DMS的。
規(guī)則表空間中包含用戶數(shù)據(jù)的表。默認用戶表空間名為USERSPACE1,索引也存儲在規(guī)則表空間中,另外系統(tǒng)目錄表也放在規(guī)則表空間中。
默認的系統(tǒng)目錄表空間名為SYSCATSPACE。
臨時表空間分為系統(tǒng)臨時表空間和用戶臨時表空間。系統(tǒng)臨時表空間用來存儲各種數(shù)據(jù)操作(排序、重組表、創(chuàng)建索引、連接表)中所需的內(nèi)部臨時數(shù)據(jù),雖然可以創(chuàng)建任意多個系統(tǒng)臨時表空間,但建議用戶只使用大多數(shù)表所使用的頁大小創(chuàng)建一個,默認系統(tǒng)臨時表空間名為TEMPSPACE1。用戶臨時表空間用來存儲已說明全局臨時表(已說明全局臨時表存儲的是應(yīng)用程序臨時數(shù)據(jù))。用戶臨時表空間不是在數(shù)據(jù)庫創(chuàng)建時默認創(chuàng)建的。
SMS每個容器是操作系統(tǒng)的文件空間中的一個目錄;DMS每個容器是一個固定的、預(yù)分配的文件,或是物理設(shè)備。
SMS的管理比較簡單,由操作系統(tǒng)自動管理,空間的大小隨數(shù)據(jù)量的變化系統(tǒng)自動調(diào)整。
DMS是由數(shù)據(jù)庫管理的,空間大小在創(chuàng)建時確定,空間不夠時要手工添加或刪除部分數(shù)據(jù)以釋放空間。
二、DB2 表空間的計算和添加:
在我們導(dǎo)入數(shù)據(jù)庫表或建索引的時候,如果該表對應(yīng)的表空間不足,無法存放,會引起導(dǎo)入失敗,并有相應(yīng)的提示。這時候,需要粗略計算該表所需的用戶表空間大小,然后手動去修改該表空間的大小之后,重新執(zhí)行。下面介紹一下表空間的修改方法:
(1)通過QC,以數(shù)據(jù)庫的實例身份登錄數(shù)據(jù)庫,找到需要修改大小的表空間,如圖
(一)所示;
圖
(一)(2)在需要修改的表空間上,點擊右鍵,選擇“計算表空間”,如圖
(二)所示;
圖
(二)(3)得到如下圖
(三)所示:
圖
(三)從圖
(三)中,可以看到數(shù)據(jù)表空間的使用情況,發(fā)現(xiàn)表空間不足,進行修改。選中紅色區(qū)域后,點擊“edit”后,如下圖示:(4)圖中粉色區(qū)域能計算出該表空間的大小: 10001—page,表示該表空間有10001頁,而每一頁大小是32k(ZM_DATA_32K),該表空間的實際大小就是:10001*32=320032k 將320032K單位轉(zhuǎn)換為G:320032除1024除1024約等于0.3G
圖
(四)(5)根據(jù)自己需要的該表空間大小,在此頁面進行修改,如下圖示:
圖
(五)修改成需要的大小,單位可直接選擇Gb,確認無誤后,ok,進入下一個界面:
圖
(六)Build script,執(zhí)行修改表空間大小的語句即可,至此完成表空間大小的修改。
三、檢驗索引是否添加成功
當成功執(zhí)行完一個索引的添加后,會在下圖中某個表相關(guān)性的index的統(tǒng)計中顯示出來的。
由上圖我們可以看到在used by的indexs中,已經(jīng)有了一個索引了,紅框的位置分別顯示了它的模式名和索引名稱。
四、如何手動執(zhí)行對索引的runstats操作
索引添加后,是必須要進行runstats的,因為要更新很多和這個表相關(guān)的系統(tǒng)文件信息。如果索引添加后,在執(zhí)行runstats的時候,qc表錯,沒有執(zhí)行下去,我們就要手動來執(zhí)行runstats操作了。操作很簡單,步驟如下: 1.在相關(guān)性中,找到已經(jīng)添加成功的索引,如下圖所示 右鍵=》utilities=》Collect Statistics,進入操作界面
2.如下圖所示,在紅框的位置進行勾選,之后創(chuàng)建語句并執(zhí)行就可以了。
五、其他
1.個別省,若出現(xiàn)添加索引重復(fù) 的報錯信息的,說明已經(jīng)添加過此索引,則可以不進行當前索引的添加。
2.本文檔不涉及oracle數(shù)據(jù)庫的索引的添加。
另外:1.剛剛發(fā)了090512 內(nèi)管數(shù)據(jù)庫(DB2)大表添加索引語句及注意事項 的郵件,大家抽空看看
2.關(guān)于表結(jié)構(gòu)等的更新
當完成對某個表的表結(jié)構(gòu)的更新(比如加字段,改字段類型等)或是更新存儲過程后,一般在packages中會需要重新編譯一下。正常情況下,在qc中進行表結(jié)構(gòu)和存儲過程的更新后,系統(tǒng)會自動進行重新編譯,但是也有無法自動編譯的情況出現(xiàn),此時,就需要我們手動的到qc中,進行手動的rebind的操作。操作步驟如下:
A、查找packages中,模式名為SXZMUSER的,同時,Vaild顯示為No的內(nèi)容; B、在 Vaild顯示為No的內(nèi)容中,可以單選或是多選,之后,點擊右鍵,選擇rebind,之后執(zhí)行語句,即可。
如果為NO那么在執(zhí)行存儲過程的時候新增加或者新修改的字段有可能會出現(xiàn)問題或者存儲過程執(zhí)行不成功。
大家好!
在這個特殊的日子里面,我把最新的內(nèi)管數(shù)據(jù)庫(DB2)大表添加索引語句及注意事項,發(fā)給大家
1.執(zhí)行要求是
A.要在客戶不使用系統(tǒng)的時候進行添加
B.一共有12個添加索引的sql語句,在每次執(zhí)行sql時,只能一次執(zhí)行一個;絕對不可以在一次里面多個或全部的執(zhí)行。
C.每次執(zhí)行前要對索引占用的表空間(ZM_INDEX)的 剩余空間進行檢查,不 剩余空間足10G的,要先擴充表空間,再執(zhí)行。
D.執(zhí)行過程中,必須有專人跟蹤,順利完成索引的添加后,再離開現(xiàn)場。若出現(xiàn)問題,及時和公司聯(lián)系。
2.db2如何計算和添加表空間、索引的檢查和手動進行執(zhí)行對索引的runstats操作,大家可以參考附件的文檔。
詳見附件