【08】SAP ABAP性能優化 - 正確使用簇表(Cluster Table)和池表(Pooled Table)

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版本的程序。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章