天天看點

深入解析:DB2 V10.5新特性列式存儲表的優點與缺點

1.什麼是列組織表

列組織表技術是 DB10.5 BLU 引入的新技術,按列組織的表,更加友善了複雜的查詢,如果将這種表格式與星型模式資料集市配合,那麼可以簡化設計和調優,進而顯著改進存儲性能、查詢性能和易用性

2.列組織表的管理方式
深入解析:DB2 V10.5新特性列式存儲表的優點與缺點

可以看到行組織模式的表是都是存放在一起的,而列組織模式的表是被分開儲存的。

3.列存儲使用環境

列存儲主要适合 OLAP 類型應用,比如資料倉庫系統,資料挖掘系統,決策支援系統等。這些系統有一些共同特征:資料量大,查詢語句比重大,複雜的查詢多。

4.如何啟用列存儲

官方文檔上描述的是将 DB2_WORKLOAD 系統資料庫變量設定為 ANALYTICS,更改後重新開機便會生效。這樣做有助于配置記憶體、表組織、頁大小和擴充資料塊大小,并且會啟用工作負載管理。

4.1更改環境變量

[db2inst1@enmodb2 ~]$ db2set DB2_WORKLOAD=ANALYTICS
[db2inst1@enmodb2 ~]$ db2set -all
[i] DB2_WORKLOAD=ANALYTICS
[g] DB2_COMPATIBILITY_VECTOR=MYS
[g] DB2SYSTEM=enmodb2
[g] DB2INSTDEF=db2inst1
           

4.2建立列組織測試表

[db2inst1@enmodb2 ~]$ db2 "create table  testinfo (empno char(6),lastname varchar(15),hirdate date,salary decimal(9),comm decimal(9)) organize by column"
DB20000I  The SQL command completed successfully.
           

使用者在沒有指定 organize by 的情況下可以将資料庫參數 dft_table_org 設定為 COLUMN,預設就是建立列組織表。

4.3添加資料

有選擇的導出 employee 的資料。

[db2inst1@enmodb2 ~]$ db2 "export to '/home/db2inst1/export/employee.del' of del messages exp_employee.msg select empno,lastname,hiredate,salary,comm from employee"
           

Number of rows exported: 42

将資料導入 testinfo 中。

深入解析:DB2 V10.5新特性列式存儲表的優點與缺點
深入解析:DB2 V10.5新特性列式存儲表的優點與缺點

4.4查詢資料

然後對資料進行查詢。

深入解析:DB2 V10.5新特性列式存儲表的優點與缺點
深入解析:DB2 V10.5新特性列式存儲表的優點與缺點

4.5行組織表與列組織表的對比

深入解析:DB2 V10.5新特性列式存儲表的優點與缺點
深入解析:DB2 V10.5新特性列式存儲表的優點與缺點

同樣的查詢在行組織表與列組織表的差別,在進行全表掃描,或者幾個列全掃描的時候,列組織表可以發揮出很大的優勢,在列式存儲中同類型的資料存放在同一個block裡面,壓縮性能比較好。而且在列式存儲中,任何列都可以作為索引。

5.列式存儲優點

5.1自動回收空間

當 DB2_WORKLOAD 設定成 ANALYTICS 的時候,對于列組織表預設會開啟 reorg,這個時候 DB2 的列組織表就會處于一個自動維護的狀态。DBA 也不用再對一些表進行定期的 reorg 操作,而且存儲空間支援線上釋放,不會影響系統的正常運作。

[db2inst1@enmodb2 ~]$ db2 update db cfg using AUTO_REORG on
DB20000I  The UPDATE DATABASE CONFIGURATION command completed successfully.
[db2inst1@enmodb2 ~]$ db2 update db cfg using auto_maint on
DB20000I  The UPDATE DATABASE CONFIGURATION command completed successfully.
[db2inst1@enmodb2 ~]$ db2 update db cfg using auto_tbl_maint on
DB20000I  The UPDATE DATABASE CONFIGURATION command completed successfully.
[db2inst1@enmodb2 ~]$ db2 restart db testinfo
DB20000I  The RESTART DATABASE command completed successfully.
Automatic maintenance                      (AUTO_MAINT) = ON
Automatic table maintenance          (AUTO_TBL_MAINT) = ON
Automatic reorganization               (AUTO_REORG) = ON
           

測試自動回收空間

[db2inst1@enmodb2 ~]$ db2 get db cfg |grep reorg
     Automatic reorganization               (AUTO_REORG) = ON

[db2inst1@enmodb2 ~]$ db2 "select count(0) from testinfo"

1          
-----------
   16252928
[db2inst1@enmodb2 ~]$ db2 "delete from db2inst1.testinfo where salary<500000"
DB20000I  The SQL command completed successfully.
[db2inst1@enmodb2 ~]$ db2 runstats on table DB2INST1.TESTINFO
DB20000I  The RUNSTATS command completed successfully.
[db2inst1@enmodb2 ~]$ db2 "select RECLAIMABLE_SPACE from
> Table(SYSPROC.ADMIN_GET_TAB_INFO('DB2INST1','TESTINFO'))"

RECLAIMABLE_SPACE   
--------------------
                   0
           

5.2 減少 IO

在某些環境下,對于行存儲是按行存放的,在讀取的時候需要将整行的資料都讀出,這樣無形中增加了資料的 IO。而列存儲的存儲方式是按列存儲,任何列都可以作為索引,隻讀出所需通路的列,讀取時備援很少,進而減少了 I/O,提高了性能。

5.3良好的壓縮比

當 UTIL_HEAP_SZ 足夠大,能使得在轉換成列存儲表之後擷取很好的壓縮比。對于傳統的壓縮技術了來講,可以很大程度的節省存儲,某些壓縮算法甚至可以不需要解壓縮而實作對資料的直接操作,節省了解壓縮的開銷,進而降低了對 CPU 的消耗。經過優化後的資料庫,很多壓縮資料會存儲在記憶體中,減少查詢時消耗的記憶體資源。

6.列式存儲缺點

6.1篩選條件限制

如果查詢中有篩選條件,這樣列式存儲未必就能發揮相應的優勢,而且相對資源消耗可能會比行式存儲更高。

深入解析:DB2 V10.5新特性列式存儲表的優點與缺點
深入解析:DB2 V10.5新特性列式存儲表的優點與缺點

6.2不支援 GBK 字元集

而且在 DB2 中,列式存儲隻支援資料庫 UTF-8 并且國家地域必須為 cn。因為unicode裡面好像不支援 GBK,如果是 GBK 字元集的資料庫,建立列組織表的時候直接會報錯,提示該資料庫的字元集不支援。

[db2inst1@enmodb2 ~]$ db2 connect to coco
Database Connection Information
 Database server        = DB2/LINUXX8664 10.5.9
 SQL authorization ID   = DB2INST1
 Local database alias   = COCO
 [db2inst1@enmodb2 ~]$ db2 get db cfg 

 Database Configuration for Database 

 Database configuration release level                    = 0x1000
 Database release level                                          = 0x1000

 Database territory                                                  = cn
 Database code page                                              = 1386
 Database code set                                                 = gbk
 Database country/region code                               = 86
 Database collating sequence                                 = UNIQUE
 Alternate collating sequence              (ALT_COLLATE) = 
 Number compatibility                                              = OFF
 Varchar2 compatibility                                             = OFF
 Date compatibility                                                    = OFF
 Database page size                                                 = 32768
           

建立列組織表

[db2inst1@enmodb2 ~]$ db2 "create table  testinfo (empno char(6),lastname varchar(15),hirdate date,salary decimal(9),comm decimal(9)) organize by column"
DB21034E  The command was processed as an SQL statement because it was not a 
valid Command Line Processor command.  During SQL processing it returned:
SQL1233N  The statement failed because the statement includes the use of 
functionality that is supported only in Unicode databases or Unicode databases 
with specific database collations, but the current database is not a Unicode 
database or is a Unicode database with unsupported database collations.  
SQLSTATE=560AA
           

6.3必須存儲于自動存儲表空間

必須将列存儲表存儲在自動存儲的表空間裡面。

[db2inst1@enmodb2 ~]$ db2 "create  tablespace mytem02 pagesize 32K managed by database using (file '/home/db2inst1/tbs/mytem02' 10M) bufferpool IBMDEFAULTBP"
DB20000I  The SQL command completed successfully.
[db2inst1@enmodb2 ~]$ db2 "create table  testinfo3 (empno char(6),lastname varchar(15),hirdate date,salary decimal(9),comm decimal(9)) organize by column in mytem02"
DB21034E  The command was processed as an SQL statement because it was not a 
valid Command Line Processor command.  During SQL processing it returned:
SQL0284N  Table creation failed because the table space "MYTEM02" that was 
specified in the statement after the clause "IN" is not a supported type of 
table space for that clause.  Table space type: "MANAGED BY DATABASE".  
SQLSTATE=42838
>>>
           

7.總結

相對于列存儲,行存儲的好處是增加修改資料容易,适合于 OLTP 事務型應用。列存儲表在進行查詢的時候需要占用大量的記憶體,同時列存儲表中的資料是按照列存儲的,這樣的組織方式不太适合查詢單行或者幾行資料,這就決定了列存儲表不适合 OLTP 的系統,是以不是所有的表都适合轉換成列存儲表。但是在某些場景下,比如資料倉庫,在對資料進行查詢時可以實作資料跳讀,進而進一步降低資料庫的 IO,提升查詢的性能。

原文釋出時間為:2018-07-18

本文來自雲栖社群合作夥伴“

資料和雲

”,了解相關資訊可以關注“

”。