oracle壓縮資料以節省空間和提高速度

2021-08-31 14:04:30 字數 4353 閱讀 7054

使用表壓縮來節省空間並提高查詢效能。

很多決策支援系統通常都涉及到儲存於幾個特大表中的大量資料。隨著這些系統的發展,對磁碟空間的需求也在快速增長。在當今的環境下,儲存著數百tb(太位元組)的資料倉儲已經變得越來越普遍。

為了幫助處理磁碟容量問題,在oracle9i第2版中引入了表壓縮特性,它可以極大地減少資料庫表所需要的磁碟空間數量,並在某些情況下提高查詢效能。

在本文中,我將向你說明表壓縮是如何工作的,以及在構建和管理資料庫時如何配置表空間。我還將基於一些示例測試結構討論一些效能問題,以幫助你了解使用表壓縮預計能獲得多大好處。

表壓縮是如何工作的

在orcle9i第2版中,表壓縮特性通過刪除在資料庫表中發現的重複資料值來節省空間。壓縮是在資料庫的資料塊級別上進行的。當確定乙個表要被壓縮後,資料庫便在每乙個資料庫資料塊中保留空間,以便儲存在該資料塊中的多個位置上出現的資料的單一拷貝。這一被保留的空間被稱作符號表(symbol table)。被標識為要進行壓縮的資料只儲存在該符號表中,而不是在資料庫行本身內。當在乙個資料庫行中出現被標識為要壓縮的資料時,該行在該符號表中儲存乙個指向相關資料的指標,而不是資料本身。節約空間是通過刪除表中資料值的冗餘拷貝而實現的。

對於使用者或應用程式開發人員來說,表壓縮的效果是透明的。無論表是否被壓縮,開發人員訪問表的方式都是相同的,所以當你決定壓縮乙個表時,不需要修改sql查詢。表壓縮的設定通常由資料庫管理人員或設計人員進行配置,幾乎不需要開發人員或使用者參與。

如何建立乙個壓縮的表

要建立乙個壓縮的表,可在create table語句中使用compress關鍵字。compress關鍵字指示oracle資料庫盡可能以壓縮的格式儲存該表中的行。下面是create table compress語句的乙個例項:

create table sales_history_comp (

part_id    varchar2(50) not null,

store_id   varchar2(50) not null,

sale_date   date not null,

quantity   number(10,2) not null

)compress

;或者,你可以用alter table語句來修改已有表的壓縮屬性,如下所示:

alter table sales_history_comp compress;

為了確定是否已經利用compress對乙個表進行了定義,可查詢user_tables資料字典檢視並檢視compression列,如下面的例子所示:

select table_name, compression from user_tables;

table_name      compression

------------------  -----------

sales_history    disabled

sales_history_comp  enabled

也可以在表空間級別上定義compress屬性,既可以在生成時利用create tablespace來定義,也可以稍後時間利用alter tablespace來定義。與其他儲存引數類似,compress屬性也具有一些繼承特性。當在乙個表空間中建立乙個表時,它從該錶空間繼承compress屬性。為了確定是否已經利用compress對乙個表空間進行了定義,可查詢user_tablespaces資料字典檢視並檢視def_tab_compression列,如下面的例子所示:

select tablespace_name,

def_tab_compression

from dba_tablespaces;

tablespace_name   def_tab_compression

---------------  -------------------

data_ts_01     disabled

index_ts_01     disabled

正如你所預計的那樣,你可以在乙個表空間直接壓縮或解壓縮乙個表,而不用考慮表空間級別上的compress屬性。

向乙個壓縮的表中載入資料

在對已分割槽的表應用壓縮時,可以有很多種選擇。你可以在表級別上應用壓縮,也可以在分割槽級別上應用壓縮。例如,**清單 1中的create table語句建立乙個具有4個分割槽的表。 由於是在表級別指定了compress,所以對全部4個分割槽都進行壓縮。

由於可以在分割槽級別上指定壓縮屬性,所以你可以選擇壓縮某些分割槽,而使另一些分割槽保持未壓縮狀態。**清單 2中的示例說明了如何在分割槽級別上指定壓縮屬性。

在**清單 2中,壓縮了兩個表分割槽(sales_q1_03和sales_q2_03) ,而另外兩個分割槽未被壓縮。要注意,在分割槽級別上指定的壓縮屬性會取代對該分割槽在表級別上特定的壓縮屬性。如果未為乙個分割槽指定壓縮屬性,那麼該分割槽將繼承在表級別上指定的壓縮屬性。在**清單 2中,由於未對分割槽sales_q3_03和sales_q4_03指定壓縮屬性,所以這兩個分割槽繼承表級別上指定的屬性值(在本例情況下為預設的nocompress)。

在通過壓縮來使用已分割槽的表時,它可以提供乙個獨特的好處。對錶進行分割槽的乙個非常有用的方法是將要對其進行dml操作(插入、更新與刪除)的資料放入與唯讀檔案分開的分區內。例如,在**清單 2的表定義中,根據sale_date對銷售資料進行了分割槽,這樣可將每一季度的銷售歷史資料儲存在乙個單獨的分區內。在此示例中,2023年第1、2季度的銷售資料不能被修改,所以將它們置於壓縮分割槽sales_q1_03 和sales_q2_03中。對於第3、4季度的銷售資料仍可以進行修改,所以相應的分割槽sales_q3_03和sales_q4_03保持未壓縮狀態。

如果在2023年第3季度末,sales_q3_03分割槽中的資料變為唯讀的,那麼你可以利用alter table ...move partition命令對此分割槽進行壓縮,如下面的語句所示:

alter table sales_part_comp

move partition sales_q3_03 compress;

要找出乙個表中的哪些分割槽被壓縮了,可以查詢資料字典檢視user_tab_partitions,如下例所示:

select table_name, partition_name,

compression

from user_tab_partitions;

table_name   partition_name compression

---------------------------- -----------

sales_part_comp sales_q4_03  disabled

sales_part_comp sales_q1_03  enabled

sales_part_comp sales_q2_03  enabled

sales_part_comp sales_q3_03  enabled

定量地評價壓縮帶來的好處

使用表壓縮的最主要原因是要節省儲存空間。壓縮形式的表所占用的空間通常小於其非壓縮形式所占用的空間。為了說明這一點,可考慮以下測試,其中有兩個表--乙個是未壓縮的(sales_history),乙個是壓縮的(sales_history_comp)。這兩個表都是利用直接路徑sql*loader由乙個包含有200萬行的單一平面檔案載入的。在完成了對兩個表的資料載入後,壓縮的表所占用的空間差不多是未壓縮表的一半。**清單 3顯示了分析結果。

乙個壓縮的表可以儲存在更少的資料塊中,從而節省了儲存空間,而使用更少的資料塊也意味著效能的提高。 在乙個i/o受到一定限制的環境中對乙個壓縮的表進行查詢通常可以更快速地完成,因為他們需要閱讀的資料庫資料塊要少得多。為了說明這一點,我對乙個壓縮的表和乙個未壓縮的表進行查詢,並執行乙個sqltrace/tkprof分析。**清單 4顯示了該分析結果。

sqltrace/tkprof報告表明:我對該壓縮表執行的物理和邏輯i/o操作相對於對非壓縮表進行的相應查詢要少得多,因而執行得也更快得多。

效能開銷

由於表壓縮是在批量載入時進行的,所以資料載入操作會因涉及附加的內務操作而需要額外的處理工作。為了衡量壓縮對效能的影響,我進行了乙個測試,在該測試中,我向兩個相同的表中(乙個壓縮的表,另乙個未壓縮的表)載入了(利用直接路徑sql*loader)100萬行資料。表 1顯示了由sql*loader日誌檔案中取出的結果,它們給出了向這兩個壓縮的與非壓縮的表中載入資料花費了多少時間。

表1:比較未壓縮的表與壓縮的表的載入時間

載入壓縮的表所需要的額外時間源自在資料載入過程中所執行的壓縮操作。在實際情況下,實際時間差取決於表的設計與給定環境下的資料的布局。

結論

oracle9i第2版中的表壓縮特性可以節省大量的磁碟空間,尤其是對於具有大型唯讀表的資料庫來說更是如此。如果你能記住載入和插入需要,並能確定那些適於進行壓縮的表,那麼你會發現,表壓縮是節省磁碟空間的絕佳方式,在某些情況下還可以提高查詢效能。

pandas壓縮csv資料 節省空間

做專案或做競賽中,會遇到很大的資料集,幾十個g以上,若是直接儲存csv,則會浪費本地磁碟空間。偶然看到一篇pandas使用小技巧,實現csv檔案壓縮與讀取,對我這樣的小白很實用。首先建立乙個資料集 300m左右 df pd.dataframe pd.np.random.randn 50000 300...

oracle壓縮表空間

tablespace created.查詢表空間資訊 sys orcl selecttablespace name,compress for from dba tablespaces tablespace name compress for system sysaux undotbs1 temp u...

oracle壓縮表表空間

表壓縮是如何工作的 在orcle9i第2版中,表壓縮特性通過刪除在資料庫表中發現的重複資料值來節省空間。壓縮是在資料庫的資料塊級別上進行的。當確定乙個表要被壓縮後,資料庫便在每乙個資料庫資料塊中保留空間,以便儲存在該資料塊中的多個位置上出現的資料的單一拷貝。這一被保留的空間被稱作符號表 symbol...