大數據“復活”記
1994
2025-04-01
1.1 ? ?Delta表是什么
Delta表就是列存表附帶的行存表,如果創建列存表時開啟了delta表(開啟/關閉方式見下文),那么在某些情況下,插入該列存表的數據,也會以行存的方式保存。
1.2 ? ?Delta表存在的意義
Delta表是依附于列存表的,所以先簡單的介紹下列存的基本原理:
在GaussDB中,列存表按列存儲數據,每列默認60000行存儲在一個CU中,CU是列存表存儲數據的最下單元,CU生成后數據固定不可更改。
無論是向列存表中插入1條還是60000條數據,都只會生成一個CU,在多次插入少量數據時,不能有效的利用列存壓縮能力,導致數據膨脹影響查詢的性能和磁盤使用率。
并且CU只能追加寫。也就是說,后面對這個CU中的數據做更新或刪除都不會真正更改這個CU,刪除是將老數據在字典中標記為作廢,更新操作是標記老數據刪除后,再寫入一條新記錄到新CU,CU不會有任何的modify。
從這里我們可以看出,在對列存表進行多次更新/刪除,或每次只插入很少量的數據后,會導致列存表空間膨脹,大量空間無法有效利用,這是因為列存表在設計上就是為了大批量數據導入以及海量數據按列存儲/查詢。
Delta表正是為了解決這兩個問題。在啟用delta表后,單條或者小批量數據導入時,數據將進入delta表中,避免小CU的產生,delta表的增刪改查與行存表一致。開啟delta表后,將顯著提升列存表單條導入的性能。
1.3 ? ?如何開關delta表
Delta表默認是關閉的,若需要開啟delta表,可以創建列存表時指定enable_delta為true
當然表創建完之后也可以隨時開關delta表:
開啟delta表:ALTER TABLE table_name SET (enable_delta=TRUE);
關閉delta表:ALTER TABLE table_name SET (enable_delta=FALSE);
1.4 ? ?開啟delta表后的性能提升
前文說到,開啟delta表能夠防止小cu的產生,所以在小規模數據導入時,開啟delta表能夠帶來顯著的性能提升,在3CN,6DN的集群上測試,每次導入100條數據,導入時間能減少25%,存儲空間減少97%,所以在需要多次插入小批量數據前應該先開啟delta表,等到確定接下來沒有小批量數據導入了再關閉。
1.5 ? ?開啟delta表的負面影響
Delta表就是列存表附帶的行存表,那么將數據插入delta表后將失去列存表的高壓縮比等優勢,正常情況下使用列存表的場景都是大批量數據導入,所以默認關閉delta表,如果開啟delta表做大批量數據導入,反而會額外消耗更多時間和空間,同樣在3C6D的集群上測試,每次導入10000條數據時,開啟delta表會比不開啟時慢4倍,額外消耗10倍以上的空間。所以開啟delta表需謹慎,根據實際業務需要來選擇開啟和關閉。
1.6 ? ?將delta表的數據轉移到主表存儲
Delta表解決了小批量插入的問題,但是在多次小批量插入后,delta表也會變成一張大表,對此,需要用deltaMerge操作將數據從delta存儲轉移到列存儲。
GaussDB提供兩種合并操作:自動的auto-deltaMerge和手動的deltaMerge。auto-deltaMerge會將默認60000行以上的數據合并到列存儲,而手動deltaMerge會將全部數據從Delta存儲合并至列存儲。但手動deltaMerge依賴高級別的鎖,需謹慎使用。
手動deltaMerge的語法:vacuum deltamerge tablename;
1.7 ? ?總結
本文從delta表的概念、來歷、用法、開啟后的影響,delta表數據轉移到主表幾個方面做了詳細的介紹。列存Delta表應用于行列混合存儲,適合實時分析統計,解決了實時小批量數據入庫引起的性能問題,定期合并到主表保證分析查詢的性能。在實際使用時需要根據業務場景來評估是否需要開啟delta表,否則不僅無法充分發揮GaussDB列存表的優勢,反而會造成額外的空間和時間的浪費。
EI企業智能 Gauss AP 數據倉庫服務 GaussDB(DWS)
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。