DB2 10.5引入列式存儲表技術,做爲DW數據應用的特性,對性能具備很大的提高,同時對SQL基本不作索引優化,查詢時直接能夠按照列存儲格式查詢相關列便可,能夠說管理很簡單了。做爲一個新特性,DB2 LUW V10.5的列式組織表功能依然做爲一個可選擇功能項,用戶能夠按照本身數據庫業務的特色,選擇是否啓用該功能,對於升級到DB2 LUW V10.5的數據庫環境來講,須要通過一樣的參數配置,也能夠支持這個功能。數據庫
在建立數據庫前,在DB2 V10.5實例提供了註冊變量選項值,即DB2_WORK_LOAD新增可配置值ANALYTICS,配置改參數值後,DB2會爲新建立的分析性工做負載數據庫創建最佳缺省配置,啓用改參數後,數據庫會自動配置以下參數,也是支持和影響列式存儲環境的幾個關鍵參數:緩存
dft_table_org該參數指定建立表的默認類型,一般設定爲row,啓用ANALYTICS註冊變量值後,系統會自動配置爲columnide
dft_degree 指定分區內SQL語句的並行度,該參數會被自動配置爲any工具
dft_extent_sz 缺省表空間的擴張塊大小,該參數會自動被設置爲4(默認值爲32)性能
catalogcache_sz 即目錄高速緩存,該參數會被自動設置爲比一般數據庫類型的默認值更大的值測試
util_heap_sz 即實用程序堆大小,該參數會被自動配置爲一個用於裝載列組織表時所需額外內存的大小優化
auto_reorg 即自動重組操做,該參數會被配置爲onspa
sortheap(排序堆)和sheapthres_shr須要根據實際計算配置對象
固然,若是在已經建立好的數據庫庫後纔對DB2_WORK_LOAD註冊變量參數配置analytics,當數據庫運行autoconfigure也具備相同效果排序
那麼如何建立DB2列組織表呢?其實建立列組織表和建立普通行式組織表的語句大致相同,只是列式組織表在creat table後添加了ORGANIZE BY COLUMN的語句。固然若是你當前的數據庫級的配置參數dft_table_org設置爲column的話,也能夠不使用organize by column語句選項,由於在啓用該參數值的數據庫中,建立的表默認就是列組織表類型,以下是一個建立列組織表的示例DDL:
CREATE TABLE "DB2INST1"."EMPLOYEE" (
"EMPNO" CHAR(6 OCTETS) NOT NULL ,
"FIRSTNME" VARCHAR(12 OCTETS) NOT NULL ,
"MIDINIT" CHAR(1 OCTETS) ,
"LASTNAME" VARCHAR(15 OCTETS) NOT NULL ,
"WORKDEPT" CHAR(3 OCTETS) ,
"PHONENO" CHAR(4 OCTETS) ,
"HIREDATE" DATE ,
"JOB" CHAR(8 OCTETS) ,
"EDLEVEL" SMALLINT NOT NULL ,
"SEX" CHAR(1 OCTETS) ,
"BIRTHDATE" DATE ,
"SALARY" DECIMAL(9,2) ,
"BONUS" DECIMAL(9,2) ,
"COMM" DECIMAL(9,2) )
IN "USERSPACE1"
ORGANIZE BY COLUMN;
那麼對於建立時沒有指定列式組織或者由低版本升級的數據庫中的行式組織表,如何將其轉換成列式組織表呢?DB2 V10.5充分考慮了用戶需求,提供了一個新的實用程序工具db2convert,用於將行式組織錶轉換爲列式組織表,以下依然以db2inst2.employee表爲例,將其轉換爲列式組織表,獲取到的原始表的DDL語句以下:
CREATE TABLE"DB2INST2"."EMPLOYEE" (
"EMPNO" CHAR(6 OCTETS) NOT NULL ,
"FIRSTNME" VARCHAR(12 OCTETS) NOT NULL ,
"MIDINIT" CHAR(1 OCTETS) ,
"LASTNAME" VARCHAR(15 OCTETS) NOT NULL ,
"WORKDEPT" CHAR(3 OCTETS) ,
"PHONENO" CHAR(4 OCTETS) ,
"HIREDATE" DATE ,
"JOB" CHAR(8 OCTETS) ,
"EDLEVEL" SMALLINT NOT NULL ,
"SEX" CHAR(1 OCTETS) ,
"BIRTHDATE" DATE ,
"SALARY" DECIMAL(9,2) ,
"BONUS" DECIMAL(9,2) ,
"COMM" DECIMAL(9,2) )
IN "USERSPACE1"
ORGANIZE BY ROW;
爲了便於觀察過程,咱們最好爲其導入數據,有必定的數據量,以便於觀察轉換過程,此測試數據來源都是DB2示例數據庫sample中相關表中獲取的,在此就很少講,讀者能夠本身自行測試效果。
如此,咱們就能夠對其進行轉換,其實db2convert工具的用法相對簡單,能夠進行整庫轉換,也能夠指定單表,須要提供表的schema和tablename,具體用法能夠參閱相關使用說明:
[db2inst1@dblab test]$ db2convert -d sample -z db2inst2 -t employee
Proceeding with the conversion...
Table RowsNum RowsComm Status Progress (%)
--------------------------------------- --------------- ---------------
"DB2INST2"."EMPLOYEE" 42 0 UNSTARTED 0.00
Table RowsNum RowsComm Status Progress (%)
--------------------------------------- --------------- ---------------
"DB2INST2"."EMPLOYEE" 42 0 UNSTARTED 0.00 Table RowsNum RowsComm Status Progress (%)
--------------------------------------- --------------- ---------------
"DB2INST2"."EMPLOYEE" 42 0 INIT 0.00 Table RowsNum RowsComm Status Progress (%)
--------------------------------------- --------------- ---------------
"DB2INST2"."EMPLOYEE" 42 0 INIT 100.00 Table RowsNum RowsComm Status Progress (%)
--------------------------------------- --------------- ---------------
"DB2INST2"."EMPLOYEE" 42 0 INIT 100.00 Table RowsNum RowsComm Status Progress(%)
--------------------------------------- --------------- ---------------
"DB2INST2"."EMPLOYEE" 42 0 COPY 0.00 Table RowsNum RowsComm Status Progress(%)
--------------------------------------- --------------- ---------------
"DB2INST2"."EMPLOYEE" 42 0 COPY 0.00 Table RowsNum RowsComm Status Progress(%)
--------------------------------------- --------------- ---------------
"DB2INST2"."EMPLOYEE" 42 0 COPY 0.00
Table RowsNum RowsComm Status Progress(%)
--------------------------------------- --------------- ---------------
"DB2INST2"."EMPLOYEE" 42 0 COPY 100.00
Table RowsNum RowsComm Status Progress(%)
--------------------------------------- --------------- ---------------
"DB2INST2"."EMPLOYEE" 42 0 COPY 100.00 Table RowsNum RowsComm Status Progress (%)
--------------------------------------- --------------- ---------------
"DB2INST2"."EMPLOYEE" 0 0 REPLAY 100.00
Table RowsNum RowsComm Status Progress (%)
--------------------------------------- --------------- ---------------
"DB2INST2"."EMPLOYEE" 0 0 REPLAY 100.00
Table RowsNum RowsComm Status Progress(%)
--------------------------------------- --------------- ---------------
"DB2INST2"."EMPLOYEE" 0 0 SWAP 0.00
Table RowsNum RowsComm Status Progress(%)
--------------------------------------- --------------- ---------------
"DB2INST2"."EMPLOYEE" 0 0 SWAP 100.00
Final Summary:
Table RowsNum InitSize(MB) FinalSize (MB) CompRate (%) State
--------------------------------------- --------------- ---------------
"DB2INST2"."EMPLOYEE" 42 0.50 10.25 -1950.00 Completed
Pre-Conversion Size (MB): 0.50
Post-Conversion Size (MB): 10.25
Compression Rate (Percent): -1950.00
SQL2446I The db2convert command completed successfully. Allrow-organized tables that satisfy the specified matching criteria have beenconverted to column-organized tables.
能夠看到db2convert整個過程實際上是基於admin_move_table的原理實現,整個過程也是對錶在線作的類型轉換。另外注意的是,範圍分區表,MDC表和ITC表默認是不能被轉換成列式組織表的,須要在上面的命令中使用-force選項才能夠執行該命令進行轉換。在轉換前表存在的依賴對象最好可以刪掉,外鍵約束會影響轉換的時間,最重要的一點就是表的類型轉換操做在線是不可逆的,因此建議最好在轉換成列式組織表前對相關表或者對轉換庫作完整的備份。
db2convert -d sample
能夠將數據庫sample中全部的行式組織錶轉換成列式組織表。
在平常維護和使用列式組織表也須要按期對數據量增刪操做比較頻繁的表進行重組,以便於提升運程序的查詢的執行性能,固然若是啓用了auto_reorg參數,數據庫會自動對相關列組織表進行重組操做,若是手動重組列組織表只須要在reorg table命令後面加上RECLAIM EXTENTS選項便可,以下演示了列式表的重組操做:
[db2inst1@dblab test]$ db2 reorgtable db2inst2.employee RECLAIM EXTENTS
DB20000I The REORG command completedsuccessfully.
若是不加該選項的手動重組的話,對於列式組織表的重組會有以下報錯信息:
[db2inst1@dblab test]$ db2 reorgtable db2inst2.employee
SQL2216N SQL error "-1667"occurred while reorganizing a database table or its indexes.
列式組織表的統計信息收集方法與普通的行式組織表相同,在此就不介紹。對於列式組織表的訪問,經過以下的示例SQL,能夠看到執行計劃也會發生相應:
示例SQL:
SELECT
EMPNO,
ACTNO,
CHAR(EMSTDATE, USA),
CHAR(EMENDATE, USA)
FROM
DB2inst1.EMPPROJACT
WHERE
EMPNO IN
(SELECT
EMPNO
FROM
db2inst1.EMPLOYEE
WHERE
WORKDEPT='E11'
)
新的 CTQ 計劃運算符表示列組織數據處理與行組織數據處理之間的轉變,捕獲列組織表說明信息的步驟與用於針對行組織表運行性能查詢的步驟相同。
db2 set current explain mode explain
執行測試SQL語句
db2exfmt -d sample -1 -o output.exfmt
獲取的執行計劃信息以下:
Access Plan:
-----------
Total Cost: 71.9656
Query Degree: 1
Rows
RETURN
( 1)
Cost
I/O
|
12.1667
CTQ
( 2)
71.9656
10.5689
|
12.1667
HSJOIN
( 3)
71.9606
10.5689
/-------+-------\
73 7
TBSCAN TBSCAN
( 4) ( 5)
40.1348 31.8243
5.89474 4.67416
| |
73 42
CO-TABLE: DB2INST1 CO-TABLE:DB2INST1
EMPPROJACT EMPLOYEE
Q2 Q1
能夠看到,對列式組織表訪問多了一個叫CTQ的訪問計劃,表示將數據從按行組織的數據處理傳遞至按列組織的數據處理的按列組織的表隊列。而且從CO-TABLE信息能夠斷定,兩表均爲列組織表,以上是一個簡單的執行計劃,固然實際應用SQL比較複雜,可是經過這些信息仍是能夠判斷的,在此就不作詳細的案例分析。