大數(shù)據(jù)“復(fù)活”記
1939
2025-04-01
VACUUM
功能描述
VACUUM回收表或B-Tree索引中已經(jīng)刪除的行所占據(jù)的存儲(chǔ)空間。在一般的數(shù)據(jù)庫(kù)操作里,那些已經(jīng)DELETE的行并沒(méi)有從它們所屬的表中物理刪除;在完成VACUUM之前它們?nèi)匀淮嬖凇R虼擞斜匾芷诘剡\(yùn)行VACUUM,特別是在經(jīng)常更新的表上。
注意事項(xiàng)
如果沒(méi)有參數(shù),VACUUM處理當(dāng)前數(shù)據(jù)庫(kù)里用戶擁有相應(yīng)權(quán)限的每個(gè)表。如果參數(shù)指定了一個(gè)表,VACUUM只處理指定的那個(gè)表。
要對(duì)一個(gè)表進(jìn)行VACUUM操作,通常用戶必須是表的所有者或系統(tǒng)管理員。數(shù)據(jù)庫(kù)的所有者允許對(duì)數(shù)據(jù)庫(kù)中除了共享目錄以外的所有表進(jìn)行VACUUM操作(該限制意味著只有系統(tǒng)管理員才能真正對(duì)一個(gè)數(shù)據(jù)庫(kù)進(jìn)行VACUUM操作)。VACUUM命令會(huì)跳過(guò)那些用戶沒(méi)有權(quán)限的表進(jìn)行垃圾回收操作。
VACUUM不能在事務(wù)塊內(nèi)執(zhí)行。
建議生產(chǎn)數(shù)據(jù)庫(kù)經(jīng)常清理(至少每晚一次),以保證不斷地刪除失效的行。尤其是在增刪了大量記錄之后,對(duì)受影響的表執(zhí)行VACUUM ANALYZE命令是一個(gè)很好的習(xí)慣。這樣將更新系統(tǒng)目錄為最近的更改,并且允許查詢優(yōu)化器在規(guī)劃用戶查詢時(shí)有更好的選擇。
不建議日常使用FULL選項(xiàng),但是可以在特殊情況下使用。例如在用戶刪除了一個(gè)表的大部分行之后,希望從物理上縮小該表以減少磁盤(pán)空間占用。VACUUM FULL通常要比單純的VACUUM收縮更多的表尺寸。FULL選項(xiàng)并不清理索引,所以推薦周期性的運(yùn)行REINDEX命令。實(shí)際上,首先刪除所有索引,再運(yùn)行VACUUM FULL命令,最后重建索引通常是更快的選擇。如果執(zhí)行此命令后所占用物理空間無(wú)變化(未減少),請(qǐng)確認(rèn)是否有其他活躍事務(wù)(刪除數(shù)據(jù)事務(wù)開(kāi)始之前開(kāi)始的事務(wù),并在VACUUM FULL執(zhí)行前未結(jié)束)存在,如果有等其他活躍事務(wù)退出進(jìn)行重試。
VACUUM會(huì)導(dǎo)致I/O流量的大幅增加,這可能會(huì)影響其他活動(dòng)會(huì)話的性能。因此,有時(shí)候會(huì)建議使用基于開(kāi)銷(xiāo)的VACUUM延遲特性。
如果指定了VERBOSE選項(xiàng),VACUUM將打印處理過(guò)程中的信息,以表明當(dāng)前正在處理的表。各種有關(guān)當(dāng)前表的統(tǒng)計(jì)信息也會(huì)打印出來(lái)。但是對(duì)于列存表執(zhí)行VACUUM操作,指定了VERBOSE選項(xiàng),無(wú)信息輸出。
當(dāng)含有帶括號(hào)的選項(xiàng)列表時(shí),選項(xiàng)可以以任何順序?qū)懭搿H绻麤](méi)有括號(hào),則選項(xiàng)必須按語(yǔ)法顯示的順序給出。
VACUUM和VACUUM FULL時(shí),會(huì)根據(jù)參數(shù)vacuum_defer_cleanup_age延遲清理行存表記錄,即不會(huì)立即清理剛剛刪除的元組。
VACUUM ANALYZE先執(zhí)行一個(gè)VACUUM操作,然后給每個(gè)選定的表執(zhí)行一個(gè)ANALYZE。對(duì)于日常維護(hù)腳本而言,這是一個(gè)很方便的組合。
簡(jiǎn)單的VACUUM(不帶FULL選項(xiàng))只是簡(jiǎn)單地回收空間并且令其可以再次使用。這種形式的命令可以和對(duì)表的普通讀寫(xiě)并發(fā)操作,因?yàn)闆](méi)有請(qǐng)求排他鎖。VACUUM FULL執(zhí)行更廣泛的處理,包括跨塊移動(dòng)行,以便把表壓縮到最少的磁盤(pán)塊數(shù)目里。這種形式要慢許多并且在處理的時(shí)候需要在表上施加一個(gè)排他鎖。
VACUUM列存表內(nèi)部執(zhí)行的操作包括三個(gè):遷移delta表中的數(shù)據(jù)到主表、VACUUM主表的delta表、VACUUM主表的desc表。該操作不會(huì)回收delta表的存儲(chǔ)空間,如果要回收delta表的冗余存儲(chǔ)空間,需要對(duì)該列存表執(zhí)行VACUUM DELTAMERGE。
如果有長(zhǎng)查詢?cè)L問(wèn)系統(tǒng)表,此時(shí)執(zhí)行VACUUM FULL,長(zhǎng)查詢可能會(huì)阻塞VACUUM FULL連接訪問(wèn)系統(tǒng)表,導(dǎo)致連接超時(shí)報(bào)錯(cuò)。
語(yǔ)法格式
回收空間并更新統(tǒng)計(jì)信息,對(duì)關(guān)鍵字順序無(wú)要求。
VACUUM [ ( { FULL | FREEZE | VERBOSE | {ANALYZE | ANALYSE }} [,...] ) ] [ table_name [ (column_name [, ...] ) ] ] [ PARTITION ( partition_name ) ];
僅回收空間,不更新統(tǒng)計(jì)信息。
VACUUM [ FULL [COMPACT] ] [ FREEZE ] [ VERBOSE ] [ table_name ] [ PARTITION ( partition_name ) ];
回收空間并更新統(tǒng)計(jì)信息,且對(duì)關(guān)鍵字順序有要求。
VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] { ANALYZE | ANALYSE } [ VERBOSE ] [ table_name [ (column_name [, ...] ) ] ] [ PARTITION ( partition_name ) ];
針對(duì)HDFS表和列存表,將delta table中的數(shù)據(jù)轉(zhuǎn)移到主表存儲(chǔ)。
VACUUM DELTAMERGE [ table_name ];
針對(duì)HDFS表,刪除HDFS表在HDFS存儲(chǔ)上的空值分區(qū)目錄。
VACUUM HDFSDIRECTORY [ table_name ];
參數(shù)說(shuō)明
FULL
選擇“FULL”清理,這樣可以恢復(fù)更多的空間,但是需要耗時(shí)更多,并且在表上施加了排他鎖。
FULL選項(xiàng)還可以帶有COMPACT參數(shù),該參數(shù)只針對(duì)HDFS表,指定該參數(shù)的VACUUM FULL操作性能要好于未指定該參數(shù)的VACUUM FULL操作。
COMPACT和PARTITION參數(shù)不能同時(shí)使用。
說(shuō)明:使用FULL參數(shù)會(huì)導(dǎo)致統(tǒng)計(jì)信息丟失,如果需要收集統(tǒng)計(jì)信息,請(qǐng)?jiān)赩ACUUM FULL語(yǔ)句中加上analyze關(guān)鍵字。
FREEZE
指定FREEZE相當(dāng)于執(zhí)行VACUUM時(shí)將vacuum_freeze_min_age參數(shù)設(shè)為0。
VERBOSE
為每個(gè)表打印一份詳細(xì)的清理工作報(bào)告。
ANALYZE | ANALYSE
更新用于優(yōu)化器的統(tǒng)計(jì)信息,以決定執(zhí)行查詢的最有效方法。
table_name
要清理的表的名稱(可以有模式修飾)。
取值范圍:要清理的表的名稱。缺省時(shí)為當(dāng)前數(shù)據(jù)庫(kù)中的所有表。
column_name
要分析的具體的字段名稱。
取值范圍:要分析的具體的字段名稱。缺省時(shí)為所有字段。
PARTITION
HDFS表不支持PARTITION參數(shù),COMPACT和PARTITION參數(shù)不能同時(shí)使用。
partition_name
要清理的表的分區(qū)名稱。缺省時(shí)為所有分區(qū)。
DELTAMERGE
只針對(duì)HDFS表和列存表,將HDFS表或者列存表的delta table中的數(shù)據(jù)轉(zhuǎn)移到主表存儲(chǔ)上。對(duì)HDFS表而言,當(dāng)delta表中數(shù)據(jù)量小于六萬(wàn)行,則不作遷移,只有在大于或者等于六萬(wàn)行數(shù)據(jù)時(shí),將delta表中所有數(shù)據(jù)遷移到HDFS上,并通過(guò)truncate清理delta表的存儲(chǔ)空間。對(duì)列存表而言,此操作受enable_delta_store和參數(shù)說(shuō)明中的deltarow_threshold控制。
說(shuō)明:
為了檢查列存delta表中的信息(HDFS表的delta表數(shù)據(jù)可以通過(guò)explain analyze查到),提供下述DFX函數(shù),用于獲取某個(gè)列存表的delta表中數(shù)據(jù)存儲(chǔ)情況:
pgxc_get_delta_info(TEXT),傳入?yún)?shù)為列存表名,搜集并顯示各個(gè)節(jié)點(diǎn)上的對(duì)應(yīng)delta表信息,包括當(dāng)前存活tuple數(shù)量、表大小、使用的最大block ID。
get_delta_info(TEXT),傳入?yún)?shù)為列存表名,匯總pgxc_get_delta_info得到的結(jié)果,返回其delta表整體的當(dāng)前存活tuple數(shù)量、表大小、使用的最大block ID。
HDFSDIRECTORY
只針對(duì)HDFS表,刪除HDFS表在HDFS存儲(chǔ)上表目錄下的空值分區(qū)目錄。
示例
--在表tpcds.reason上創(chuàng)建索引 CREATE UNIQUE INDEX ds_reason_index1 ON tpcds.reason(r_reason_sk); --對(duì)帶索引的表tpcds.reason執(zhí)行VACUUM操作。 VACUUM (VERBOSE, ANALYZE) tpcds.reason; --刪除索引 DROP INDEX ds_reason_index1 CASCADE; DROP TABLE tpcds.reason;
ANALYZE
功能描述
用于收集與數(shù)據(jù)庫(kù)中普通表內(nèi)容相關(guān)的統(tǒng)計(jì)信息,統(tǒng)計(jì)結(jié)果存儲(chǔ)在系統(tǒng)表PG_STATISTIC下。執(zhí)行計(jì)劃生成器會(huì)使用這些統(tǒng)計(jì)數(shù)據(jù),以確定最有效的執(zhí)行計(jì)劃。
如果沒(méi)有指定參數(shù),ANALYZE會(huì)分析當(dāng)前數(shù)據(jù)庫(kù)中的每個(gè)表和分區(qū)表。同時(shí)也可以通過(guò)指定table_name、column和partition_name參數(shù)把分析限定在特定的表、列或分區(qū)表中。
ANALYZE|ANALYSE VERIFY用于檢測(cè)數(shù)據(jù)庫(kù)中普通表(行存表、列存表)的數(shù)據(jù)文件是否損壞,目前此命令暫不支持HDFS表
注意事項(xiàng)
由于現(xiàn)版本ANALYZE非臨時(shí)表是一個(gè)多事務(wù)的行為,因此ANALYZE非臨時(shí)表不能在一個(gè)匿名塊、事務(wù)塊、函數(shù)或存儲(chǔ)過(guò)程內(nèi)被執(zhí)行,且當(dāng)ANALYZE與部分DML語(yǔ)句,例如ALTER TABLE,DROP TABLE,UPDATE等并發(fā)時(shí),可能會(huì)引發(fā)ANALYZE流程報(bào)錯(cuò),報(bào)錯(cuò)信息例如找不到目標(biāo)列,對(duì)于這種情況,只需要再次ANALYZE收集統(tǒng)計(jì)信息即可。現(xiàn)版本支持存儲(chǔ)過(guò)程中ANALYZE臨時(shí)表,不支持統(tǒng)計(jì)信息回滾操作。
ANALYZE VERIFY 操作處理的大多為異常場(chǎng)景檢測(cè)需要使用RELEASE版本。ANALYZE VERIFY 場(chǎng)景不觸發(fā)遠(yuǎn)程讀,因此遠(yuǎn)程讀參數(shù)不生效。對(duì)于關(guān)鍵系統(tǒng)表出現(xiàn)錯(cuò)誤被系統(tǒng)檢測(cè)出頁(yè)面損壞時(shí),將直接報(bào)錯(cuò)不再繼續(xù)檢測(cè)。
語(yǔ)法格式
收集表的統(tǒng)計(jì)信息。
{ ANALYZE | ANALYSE } [ VERBOSE ] [ table_name [ ( column_name [, ...] ) ] ];
收集分區(qū)表的統(tǒng)計(jì)信息。
{ ANALYZE | ANALYSE } [ VERBOSE ] [ table_name [ ( column_name [, ...] ) ] ] PARTITION ( patrition_name ) ;
說(shuō)明:
普通分區(qū)表目前支持針對(duì)某個(gè)分區(qū)的統(tǒng)計(jì)信息的語(yǔ)法,但功能上不支持針對(duì)某個(gè)分區(qū)的統(tǒng)計(jì)信息收集。
收集外表的統(tǒng)計(jì)信息。
{ ANALYZE | ANALYSE } [ VERBOSE ] { foreign_table_name | FOREIGN TABLES };
收集多列統(tǒng)計(jì)信息
{ANALYZE | ANALYSE} [ VERBOSE ] table_name (( column_1_name, column_2_name [, ...] ));
說(shuō)明:
收集多列統(tǒng)計(jì)信息時(shí),請(qǐng)?jiān)O(shè)置GUC參數(shù)default_statistics_target為負(fù)數(shù),以使用百分比采樣方式。
每組多列統(tǒng)計(jì)信息最多支持32列。
不支持收集多列統(tǒng)計(jì)信息的表:系統(tǒng)表、HDFS外表復(fù)制表。檢測(cè)當(dāng)前庫(kù)的數(shù)據(jù)文件
檢測(cè)當(dāng)前庫(kù)的數(shù)據(jù)文件
{ANALYZE | ANALYSE} VERIFY {FAST|COMPLETE};
說(shuō)明:
支持對(duì)全庫(kù)進(jìn)行操作,由于涉及的表較多,建議以重定向保存結(jié)果gsql -d database -p port -f "verify.sql"> verify_warning.txt 2>&1。
不支持HDFS表(內(nèi)表和外表),不支持臨時(shí)表和unlog表。
對(duì)外提示NOTICE只核對(duì)外可見(jiàn)的表,內(nèi)部表的檢測(cè)會(huì)包含在它所依賴的外部表,不對(duì)外顯示和呈現(xiàn)。
此命令的處理可容錯(cuò)ERROR級(jí)別的處理。由于debug版本的Assert可能會(huì)導(dǎo)致core無(wú)法繼續(xù)執(zhí)行命令,建議在release模式下操作。
對(duì)于全庫(kù)操作時(shí),當(dāng)關(guān)鍵系統(tǒng)表出現(xiàn)損壞則直接報(bào)錯(cuò),不再繼續(xù)執(zhí)行。
檢測(cè)表和索引的數(shù)據(jù)文件
{ANALYZE | ANALYSE} VERIFY {FAST|COMPLETE} table_name|index_name [CASCADE];
說(shuō)明:
支持對(duì)普通表的操作和索引表的操作,但不支持對(duì)索引表index使用CASCADE操作。原因是由于CASCADE模式用于處理主表的所有索引表,當(dāng)單獨(dú)對(duì)索引表進(jìn)行檢測(cè)時(shí),無(wú)需使用CASCADE模式。
不支持HDFS表(內(nèi)表和外表),不支持臨時(shí)表和unlog表。
對(duì)于主表的檢測(cè)會(huì)同步檢測(cè)主表的內(nèi)部表,例如toast表、cudesc表等。
當(dāng)提示索引表?yè)p壞時(shí),建議使用reindex命令進(jìn)行重建索引操作。
檢測(cè)表分區(qū)的數(shù)據(jù)文件
檢測(cè)表和索引的數(shù)據(jù)文件
說(shuō)明:
支持對(duì)表的單獨(dú)分區(qū)進(jìn)行檢測(cè)操作,但不支持對(duì)索引表index使用CASCADE操作。
不支持HDFS表(內(nèi)表和外表),不支持臨時(shí)表和unlog表.
參數(shù)說(shuō)明
VERBOSE
啟用顯示進(jìn)度信息。
說(shuō)明:
如果指定了VERBOSE,ANALYZE發(fā)出進(jìn)度信息,表明目前正在處理的表。各種有關(guān)表的統(tǒng)計(jì)信息也會(huì)打印出來(lái)。
table_name
需要分析的特定表的表名(可能會(huì)帶模式名),如果省略,將對(duì)數(shù)據(jù)庫(kù)中的所有表(非外部表)進(jìn)行分析。
對(duì)于ANALYZE收集統(tǒng)計(jì)信息,目前僅支持行存表、列存表、HDFS表、ORC格式的OBS外表、CARBONDATA格式的OBS外表、協(xié)同分析的外表。
取值范圍:已有的表名。
column_name,column_1_name,column_2_name
需要分析特定列的列名,默認(rèn)為所有列。
取值范圍:已有的列名。
partition_name
如果table為分區(qū)表,在關(guān)鍵字PARTITION后面指定分區(qū)名partition_name表示分析該分區(qū)表的統(tǒng)計(jì)信息。目前語(yǔ)法上支持分區(qū)表做ANALYZE,但功能實(shí)現(xiàn)上暫不支持對(duì)指定分區(qū)統(tǒng)計(jì)信息的分析。
取值范圍:表的某一個(gè)分區(qū)名。
foreign_table_name
需要分析的特定表的表名(可能會(huì)帶模式名),該表的數(shù)據(jù)存放于HDFS分布式文件系統(tǒng)中。
取值范圍:已有的表名。
FOREIGN TABLES
分析所有當(dāng)前用戶權(quán)限下,數(shù)據(jù)位于HDFS分布式文件系統(tǒng)中的HDFS外表。
index_name
需要分析的特定索引表的表名(可能會(huì)帶模式名)。
取值范圍:已有的表名。
FAST|COMPLETE
對(duì)于行存表,F(xiàn)AST模式下主要對(duì)于行存表的CRC和page header進(jìn)行校驗(yàn),如果校驗(yàn)失敗則會(huì)告警; 而COMPLETE模式下,則主要對(duì)行存表的指針、tuple進(jìn)行解析校驗(yàn)。 對(duì)于列存表,F(xiàn)AST模式下主要對(duì)于列存表的CRC和magic進(jìn)行校驗(yàn),如果校驗(yàn)失敗則會(huì)告警; 而COMPLETE模式下,則主要對(duì)列存表的CU進(jìn)行解析校驗(yàn)。
CASCADE
CASCADE模式下會(huì)對(duì)當(dāng)前表的所有索引進(jìn)行檢測(cè)處理。
示例
--- 創(chuàng)建表。
--- 創(chuàng)建分區(qū)表。
--- 使用ANALYZE語(yǔ)句更新統(tǒng)計(jì)信息。
--- 使用ANALYZE VERBOSE語(yǔ)句更新統(tǒng)計(jì)信息,并輸出表的相關(guān)信息。
說(shuō)明:
若環(huán)境若有故障,需查看CN的log。
--- 刪除表。
傾斜檢查
操作場(chǎng)景
數(shù)據(jù)傾斜會(huì)造成查詢表性能下降。對(duì)于記錄數(shù)超過(guò)千萬(wàn)條的表,建議在執(zhí)行全量數(shù)據(jù)導(dǎo)入前,先導(dǎo)入部分?jǐn)?shù)據(jù),以進(jìn)行數(shù)據(jù)傾斜檢查和調(diào)整分布列,避免導(dǎo)入大量數(shù)據(jù)后發(fā)現(xiàn)數(shù)據(jù)傾斜,調(diào)整成本高。
背景信息
GaussDB(DWS)是采用Shared-nothing架構(gòu)的MPP(Massive Parallel Processor,大規(guī)模并發(fā)處理)系統(tǒng),采用水平分布的方式,將業(yè)務(wù)數(shù)據(jù)表的元組按合適的分布策略分散存儲(chǔ)在所有的DN。
當(dāng)前產(chǎn)品支持復(fù)制(Replication)和散列(Hash)兩種用戶表分布策略。
Replication方式:在每一個(gè)DN上存儲(chǔ)一份全量表數(shù)據(jù)。對(duì)于數(shù)據(jù)量比較小的表建議采取Replication分布策略。
Hash方式:采用這種分布方式,需要為用戶表指定一個(gè)分布列(distribute key)。當(dāng)插入一條記錄時(shí),系統(tǒng)會(huì)根據(jù)分布列的值進(jìn)行hash運(yùn)算后,將數(shù)據(jù)存儲(chǔ)在對(duì)應(yīng)的DN中。對(duì)于數(shù)據(jù)量比較大的表建議采取Hash分布策略。
對(duì)于Hash分布策略,如果分布列選擇不當(dāng),可能導(dǎo)致數(shù)據(jù)傾斜。因此在采用Hash分布策略之后會(huì)對(duì)用戶表的數(shù)據(jù)進(jìn)行數(shù)據(jù)傾斜性檢查,以確保數(shù)據(jù)在各個(gè)DN上是均勻分布的。一般情況下分布列都是選擇鍵值重復(fù)度小,數(shù)據(jù)分布比較均勻的列。
操作步驟
1. 分析數(shù)據(jù)源特征,選擇若干個(gè)鍵值重復(fù)度小,數(shù)據(jù)分布比較均勻的備選分布列。
2. 從步驟1中選擇一個(gè)備選分布列創(chuàng)建目標(biāo)表。
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name ({ column_name data_type [ compress_mode ] [ COLLATE collation ] [ column_constraint [ ... ] ] | table_constraint | LIKE source_table [ like_option [...] ] } [, ... ]) [ WITH ( {storage_parameter = value} [, ... ] ) ] [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ] [ COMPRESS | NOCOMPRESS ] [ TABLESPACE tablespace_name ] [ DISTRIBUTE BY { REPLICATION | { HASH ( column_name [,...] ) } } ];
3. 參照前面章節(jié)中的辦法向目標(biāo)表中導(dǎo)入小批量數(shù)據(jù)。
對(duì)于單個(gè)數(shù)據(jù)源文件,在導(dǎo)入時(shí),可通過(guò)均勻切割,導(dǎo)入部分切割后的數(shù)據(jù)源文件來(lái)驗(yàn)證數(shù)據(jù)傾斜性。
4. 檢驗(yàn)數(shù)據(jù)傾斜性。命令中的table_name ,請(qǐng)?zhí)钊雽?shí)際的目標(biāo)表名。
SELECT a.count,b.node_name FROM (SELECT count(*) AS count,xc_node_id FROM table_name GROUP BY xc_node_id) a, pgxc_node b WHERE a.xc_node_id=b.node_id ORDER BY a.count desc;
5. 若各DN上數(shù)據(jù)分布差小于10%,表明數(shù)據(jù)分布均衡,選擇的分布列合適。請(qǐng)清理已導(dǎo)入小批量數(shù)據(jù),導(dǎo)入全量數(shù)據(jù),以完成數(shù)據(jù)遷移。
若各DN上數(shù)據(jù)分布差大于等于10%,表明數(shù)據(jù)分布傾斜,請(qǐng)從步驟1的備選分布列中刪除該列,刪除目標(biāo)表,并重復(fù)步驟2?、步驟3?、步驟4?和步驟5。
6. (可選)如果上述步驟不能選出適合的分布列,需要從備選分布列選擇多個(gè)列的組合作為分布列來(lái)完成數(shù)據(jù)遷移。
示例
對(duì)目標(biāo)表staffs選擇合適的分布列。
1. 分析表staffs的數(shù)據(jù)源特征,選擇數(shù)據(jù)重復(fù)度低且分布均勻的備選分布列staff_ID、FIRST_NAME和LAST_NAME。
2. 先選擇staff_ID作為分布列,創(chuàng)建目標(biāo)表staffs。
CREATE TABLE staffs ( staff_ID NUMBER(6) not null, FIRST_NAME VARCHAR2(20), LAST_NAME VARCHAR2(25), EMAIL VARCHAR2(25), PHONE_NUMBER VARCHAR2(20), HIRE_DATE DATE, employment_ID VARCHAR2(10), SALARY NUMBER(8,2), COMMISSION_PCT NUMBER(2,2), MANAGER_ID NUMBER(6), section_ID NUMBER(4) ) DISTRIBUTE BY hash(staff_ID);
3. 向目標(biāo)表staffs中導(dǎo)入部分?jǐn)?shù)據(jù)。
根據(jù)以下查詢所得,集群環(huán)境中主DN數(shù)為8個(gè),則建議導(dǎo)入的記錄數(shù)為80000條。
SELECT count(*) FROM pgxc_node where node_type='D'; count ------- 8 (1 row)
4. 校驗(yàn)以staff_ID為分布列的目標(biāo)表staffs的數(shù)據(jù)傾斜性。
SELECT a.count,b.node_name FROM (select count(*) as count,xc_node_id FROM staffs GROUP BY xc_node_id) a, pgxc_node b WHERE a.xc_node_id=b.node_id ORDER BY a.count desc; count | node_name ------+----------- 11010 | datanode4 10000 | datanode3 12001 | datanode2 8995 | datanode1 10000 | datanode5 7999 | datanode6 9995 | datanode7 10000 | datanode8 (8 rows)
5. 根據(jù)上一步驟查詢所得,各DN上數(shù)據(jù)分布差大于10%,數(shù)據(jù)分布傾斜。所以從步驟1的備選分布列中刪除該列,并刪除目標(biāo)表staffs。
DROP TABLE staffs;
6. 嘗試選擇staff_ID、FIRST_NAME和LAST_NAME的組合作為分布列,創(chuàng)建目標(biāo)表staffs。
CREATE TABLE staffs ( staff_ID NUMBER(6) not null, FIRST_NAME VARCHAR2(20), LAST_NAME VARCHAR2(25), EMAIL VARCHAR2(25), PHONE_NUMBER VARCHAR2(20), HIRE_DATE DATE, employment_ID VARCHAR2(10), SALARY NUMBER(8,2), COMMISSION_PCT NUMBER(2,2), MANAGER_ID NUMBER(6), section_ID NUMBER(4) ) DISTRIBUTE BY hash(staff_ID,FIRST_NAME,LAST_NAME);
7. 校驗(yàn)以staff_ID、FIRST_NAME和LAST_NAME的組合為分布列的目標(biāo)表staffs的數(shù)據(jù)傾斜性。
SELECT a.count,b.node_name FROM (select count(*) as count,xc_node_id FROM staffs GROUP BY xc_node_id) a, pgxc_node b WHERE a.xc_node_id=b.node_id ORDER BY a.count desc; count | node_name ------+----------- 10010 | datanode4 10000 | datanode3 10001 | datanode2 9995 | datanode1 10000 | datanode5 9999 | datanode6 9995 | datanode7 10000 | datanode8 (8 rows)
8. 根據(jù)上一步驟查詢所得,各DN上數(shù)據(jù)分布差小于10%,數(shù)據(jù)分布均衡,選擇的分布列合適。
9. 清理已導(dǎo)入小批量數(shù)據(jù)。
TRUNCATE TABLE staffs;
10. 導(dǎo)入全量數(shù)據(jù),以完成數(shù)據(jù)遷移
EI企業(yè)智能 Gauss AP 數(shù)據(jù)倉(cāng)庫(kù)服務(wù) GaussDB(DWS)
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。