摘要: 工作學習之余對DB2使用知識的一點零散記錄,包括DB2的基礎知識、數據庫管理、性能調優以及開發等方面,內容非常零散,而且有時不免理解有誤,可能并未回頭改掉,望見諒,僅供參考。
工作學習之余對DB2使用知識的一點零散記錄,包括DB2的基礎知識、數據庫管理、性能調優以及開發等方面,內容非常零散,而且有時不免理解有誤,可能并未回頭改掉,望見諒,僅供參考。
在DB2中由上至下的幾個概念:
在一個操作系統中,DB2數據服務可以同時運行多個實例(有別于Oracle在一個系統內只能起一個實例).
數據庫定義在實例中,一個實例可以包含多個數據庫。在同一個實例中的不同數據庫是完全獨立的,分別擁有自己獨立的系統編目表。
表空間有2種管理方式:
DMS與SMS方式在表空間建立時指定,建好后不能轉換。對于DMS方式,一個表空間對應了一個或多個容器(Container),容器指定了數據的物理存儲位置。對于SMS方式,只能夠指定一個目錄,不能夠增加。
表空間具有以下類型:
一個數據庫中必須存在兩個系統基本的表空間,分別是系統編目表空間與系統臨時表空間。在數據庫中創建的任何對象都以在系統編目表空間中增加記錄的方式體現,對于臨時表空間,其占用磁盤大小是根據使用情況動態伸縮的,即僅在需要時才分配磁盤空間,并在使用后進行回收。此外,若用戶需要創建表,則需要創建用戶表空間,若需要使用臨時表,則需要創建用戶臨時表空間。
容器分為三種類型:
文件與設備,用于DMS方式的表空間;
目錄,用于SMS方式的表空間,此種方式不需要人工管理數據存儲文件,DB2可根據情況在目錄中自動增加存儲文件,只要磁盤空間允許。
實質上,表空間是數據存儲的邏輯位置定義,容器則是數據存儲的物理位置定義。
影響一個數據庫的性能主要有以下因素:
其中以磁盤最為顯著,90%的性能瓶頸可能來自于磁盤的IO競爭;
其次是內存,一方面是指物理內存的總量要滿足需求,另一方面是指與內存相關的配置參數應正確配置;
當然處理器的性能也很重要,多路CPU會對哪些依賴計算能力的復雜SQL查詢起到顯著的效果;
網絡不屬于主要因素,屬于客觀的環境因素,是指過慢的網速會對數據的傳輸造成影響。以下列出一些對于提高數據庫性能有效的方法:
DB2的參數配置分為兩個級別,一個是實例級別,另一個是數據庫級別。對數據服務性能影響較大的參數主要在數據庫級別配置。以下是三個比較重要的內存配置參數:
bufferpage
locklist
sortheap
其他的一些配置參數:
numdb: 同時可以啟動的實例數目
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;
IBM DB2 開發者園地
http://www-128.ibm.com/developerworks/cn/db2/
IBM DB2 信息中心
http://publib.boulder.ibm.com/infocenter/db2help/index.jsp
dbforums 論壇
http://dbforums.com/
《DB2 UDB v8.1 for Linux, UNIX, Windows 數據庫管理》George Baklarz, Bill Wong 合著,機械工業出版社出版
《DB2數據庫管理與應用教程》莊濟誠 著,清華大學出版社出版