SAP提供了三種類型的數據庫表,透明表(Transparent Table),簇表(Cluster Table)和池表(Pooled Table)。其中,透明表是最常見的數據庫表,其使用主要注意“Buffer”和“Index”兩個方面。但對於簇表和池表,很多ABAPer並不熟悉其原理和用法。
在本篇博客中,將介紹如何在ABAP中使用簇表和池表。
1.概念解析
1.1 “簇表”和“表簇”
首先要強調的一個認知是,簇表和池表在數據庫層是真實的物理存在,這也就是說簇表和池表是真實的數據庫表。
在應用層SE11中定義和看到是簇表(Cluster Table)和池表(Pooled Table),在數據庫層面存在的物理實體是“表簇(Table Cluser)”和“表池(Table Pool)”,也即簇表和池表並不是以獨立表的形式存在的,而是以“表簇”和“表池”的存儲形式存在。
下圖展示了“表簇”在數據庫層的存儲方式。表簇是以簇表中定義的主鍵爲Key值字段,然後通過特殊主鍵Pageno來確保數據的唯一性的。簇表中實際的字段內容是在Vardata字段中,通過壓縮後的字符串的形式存儲的。
簇表這種存儲方式的優點是,簇表可以將相關的數據歸集到一起,便於統一管理;並在存儲過程中,通過壓縮的形式存儲,進行數據加密,同時節省數據空間。
但也帶來了一些缺點,簇表不支持Index。當通過非主鍵字段訪問簇表時,數據庫的搜索效率是很低的。可以想象一下這個過程,數據的搜索對象是一個表簇(不僅僅是一張簇表,而是多個簇表的集合),面對的數據量是遠大於真實的數據量的,通過在搜索之前,數據庫還要經歷解壓的過程,然後在經過數據的處理和搜索。
因此,在面對簇表的數據時,首先儘可能要使用主鍵訪問,如不能滿足需求,使用簇表所對應的業務透明表進行操作。
1.2 “池表”和“表池”
與簇表的概念類似,池表和簇表的不同點在於,池表的主鍵包括Tabname和Varkey, 這樣的話,不同的池表在表池中是以相對獨立的方式存儲的,但在數據的壓縮程度上(壓縮的數據存儲在Vardata字段中),要小於簇表的效果。因此,池表面對的對象通常是數據量較小的系統表。
2. 舉例
2.1 簇表BSEG和表簇RFBLG
在SE11中,可以看到這張非常著名的簇表BSEG,以及其對應的表簇RFBLG。
表簇RFBLG是衆多簇表的大集合,包括BSEG,BSED, BSEC 等等。
當使用Open SQL操作簇表BSEG時,可以看到轉化的Native SQL操作的對象是表簇RFBLG。
2.2 池表A001和表簇KAPOL
在SE11中,可以看到池表A001的定義,以及其對應的表池KAPOL。
表簇KAPOL是衆多池表的大集合,包括A001,A004, A005 等等。與簇表類似,在Open SQL操作池表A001時,可以看到轉化的Native SQL操作的對象是表池KAPOL。
3 使用備註
1. 簇表和池表不支持INDEX,JOIN, GROUP BY, ORDER BY 等類型的數據庫操作( 這是由於數據的存儲形式造成的 )。
2. 簇表和池表不支持DB View
3. 避免使用非主鍵字段檢索簇表,否則對於程序性能將會造成很大的影響。應使用對應的透明表進行操作(例如:使用BSID、BSAD, BSIK、BSAK, BSIS、BSAS替代簇表BSEG )。
4. 在S/4版本上,BSEG和A001等簇表或池表已經變成的透明表,上述約束僅對ECC版本的程序。