版權聲明: 本文可以任意轉載,轉載時請務必以超鏈接形式標明文章原始出處和作者信息。
原文出處: http://www.aivIEw.com/notes/db2_note.htm
作者: 張洋 Alex_doesAThotmail.com
目錄
在DB2中有關實例(Instance), 數據庫(Database),表空間(TableSpace),容器(Container)等概念:
在一個操作系統中,DB2數據服務可以同時運行多個實例(有別於Oracle(大型網站數據庫平台)在一個系統內只能起一個實例),數據庫定義在實例中,一個實例可以包含多個數據庫。在同一個實例中的不同數據庫是完全獨立的,分別擁有自己獨立的系統編目表。
表空間分為DMS方式和SMS(System manegement Space)方式,定義在數據庫中,一個數據庫中必須存在兩個系統基本的表空間,分別是系統編目表空間(SysCatSpace)與系統臨時表空間(SysTempSpace)。在數據庫中創建的任何對象都以在系統編目表空間中增加記錄的方式體現,對於臨時表空間,其占用磁盤大小是根據使用情況動態伸縮的,即僅在需要時才分配磁盤空間,並在使用後進行回收。此外,若用戶需要創建表,則需要創建用戶表空間(UserSpace),若需要使用臨時表,則需要創建用戶臨時表空間(UserTempSpace)。
DMS與SMS類型在表空間建立時指定,建好後不能轉換。對於DMS方式,一個表空間對應了一個或多個容器(Container),容器指定了數據的物理存儲位置。對於SMS方式,只能夠指定一個目錄,不能夠增加。
容器分為三種類型,前兩種是文件與設備,用於DMS方式的表空間;還有一種是目錄,用於SMS方式的表空間,此種方式不需要人工管理數據存儲文件,DB2可根據情況在目錄中自動增加存儲文件,只要磁盤空間允許。實質上,表空間是數據存儲的邏輯位置定義,容器則是數據存儲的物理位置定義。
影響一個數據庫的性能主要有以下因素:磁盤(Disk), 內存(Memory), 處理器(CPU), 網絡(Network)。其中以磁盤最為顯著,90%的性能瓶頸可能來自於磁盤的IO競爭;其次是內存,一方面是指物理內存的總量要滿足需求,另一方面是指與內存相關的配置參數應正確配置;當然處理器的性能也很重要,多路CPU會對哪些依賴計算能力的復雜SQL查詢起到顯著的效果;網絡不屬於主要因素,屬於客觀的環境因素,是指過慢的網速會對數據的傳輸造成影響。以下列出一些對於提高數據庫性能有效的方法:
對於運行數據庫服務的服務器可以盡可能的配置多塊物理磁盤,每塊的容量不必太大,這樣可以有效的分擔數據存儲與讀取操作過程的磁盤IO競爭。即采用多塊小容量的磁盤在性能上要優於僅采用一塊大容量的磁盤。
如果條件允許,盡量使數據存儲服務與操作系統分別運行在物理分開的磁盤上。
采用DMS(Database Management Space)管理方式的表空間。
在物理不同的磁盤上創建多個表空間。然後可以將數據和索引分別存放在不同的表空間,這樣可以顯著的提高性能。還可以把一個使用頻繁的大表縱向拆成多個小表,分別存放在不同的表空間中,然後用一個視圖進行聯合。
DB2服務器可以管理裸設備,即除系統以及DB2服務運行磁盤以外,為DB2數據存放單獨准備磁盤,可以是多塊,分區後不需要格式化,創建裸設備後直接交給DB2進行管理,用於存儲數據。
系統的臨時表空間對數據庫性能影響很大,當由管理的物理內存不能滿足數據庫操作的需要時,DB2便會把臨時數據寫到磁盤上,這時便用到了系統臨時表空間,並且這種情況會經常發生。
盡量在磁盤靠近最內層磁道的位置安放數據,因為此處磁盤的訪問速度較快。
DB2的參數配置分為兩個級別,一個是實例級別,另一個是數據庫級別。對數據服務性能影響較大的參數主要在數據庫級別配置。以下是三個比較重要的內存配置參數:
bufferpage: 由同一個數據庫中的所有對象共享。
sortheap: 用於排序的內存交換區,非共享,不宜設置太大,否則,很容易引起內存耗盡,因為每一個事務都會申請獨立的內存用於排序。
locklist: 共享內存,用於記錄數據服務運行中建立的鎖。建議設置20Mb左右,需要時根據實際情況進行調整。DB2默認使用行級鎖,如果設置太小,當鎖的記錄太多時,則會導致內存不足,此時DB2會把多個行鎖升級為一個表鎖,這樣就會大大降低應用程序的並發性能。如果設置太大,則多分配的內存很少會被用到,導致浪費。
其他的一些配置參數:
numdb: 同時可以啟動的實例數目
DB2的常用命令:
db2ilist 列出當前系統中定義的DB2實例
daslist 列出系統中的DAS
db2 list database directory 列出當前實例中定義的數據庫
db2 list tablespaces 列出當前數據庫中定義的表空間
db2 list tabses [for all] 列出當前數據庫中的表
db2 list active db 列出活動的數據庫
db2 get dbm config
get db cfg for databasename
db2 update db cfg for databasename using bufferpage 600M
db2 alter bufferpool IABMDEFAULTBP size =1
db2 list applications show detail
以上命令可以在後面加 " show detail" 參數,顯示詳細信息。
DB2數據存儲的頁大小只能在表空間級別統一指定(區別於Oracle(大型網站數據庫平台),可以定義在表級別), 並且建好後不能修改。
可以手工建立一個頁大小為4K的DMS用戶臨時表空間,然後把系統默認的SMS系統臨時表空間刪除。為滿足應用需求,一般還應再建立一個頁大小在8K以上的用戶臨時表空間。
DB2 UDB V8.1 對RedHat Linux 9 的支持不好,默認情況下無法啟動GUI安裝程序(可以通過設置環境LD_ASSUME_KERNEL=2.2.5解決),並且不會安裝Sample數據庫,控制中心也無法正常啟動。
當使用COUNT()函數時,如果表中的記錄數 > 2 147 483 647行,則函數可能返回錯誤的結果,這時可以使用返回類型為DECIMAL(31, 0)的COUNT_BIG()函數。
DISTINCT 關鍵字可以用在COUNT()函數中,如:SELECT COUNT(DISTINCT id) FROM TABLE,這代表將不對id列的重復值進行計數。
ORDER BY子句後面如果寫了多個列名,需要分別指定升序或是降序。
可以在load大量數據時,暫時關閉表的日志選項。使用:ALTER TABLE ... ACTIVATE NOT LOGGED INITIALLY
DB2的幾個特殊寄存器:CURRENT DATE, CURRENT TIME, CURRENT TIMESTAMP, USER(用戶ID).
有關日期的操作:CURRENT TIMESTAMP + 2 DAYS(or HOURS, SECONDS, MONTHS, YEARS, etc.)
case 語句的使用:case when 條件一 then 動作一 else 動作二 end; 可以欠套使用。
在視圖的創建語句中無法使用order by 子句與 fetch n rows 子句。但對於order by可以用如下方法替代實現,不過會影響效率。
create vIEw v_name1(c1, c2, c3) as
select * from (
select column1, column2, column3
from t1
order by column1 ) as t1;
學習筆記-DB2 UDB V8.1 管理 學習筆記(二)
學習筆記-DB2 UDB V8.1 管理 學習筆記(三)
IBM DB2 開發者園地
http://www-900.ibm.com/developerWorks/cn/dmdd/certify/index.sHtml
IBM DB2 信息中心
http://publib.boulder.ibm.com/infocenter/db2help/index.JSP(SUN企業級應用的首選)
dbforums 論壇
http://dbforums.com/
《DB2 UDB v8.1 for Linux, UNIX, Windows 數據庫管理》George Baklarz, Bill Wong 合著,機械工業出版社出版
《DB2數據庫管理與應用教程》莊濟誠 著,清華大學出版社出版