從OBS并行導入數據
? 將導入數據拆分為多個文件
導入大數據量的數據時通常需要較長的時間及耗費較多的計算資源。
從OBS上導入數據時,如下方法可以提升導入性能:將數據文件存儲到OBS前,盡可能均勻地將文件切分成多個,文件的數量以DN的整數倍更適合。
? 在導入前后驗證數據文件
從OBS導入數據時,首先將您的文件上傳到OBS存儲桶中,我們建議您列出存儲桶的內容,然后驗證該存儲桶是否包含所有正確的文件并且僅包含這些文件。
在完成導入操作后,請使用SELECT查詢語句以驗證所需文件是否已導入。
? OBS導入導出數據時,不支持中文路徑。
使用GDS導入數據
? 數據傾斜會造成查詢表性能下降。對于記錄數超過千萬條的表,建議在執行全量數據導入前,先導入部分數據,以進行數據傾斜檢查和調整分布列,避免導入大量數據后發現數據傾斜,調整成本高。
? 為了優化導入速度,建議拆分文件,使用多GDS進行并行導入。另外,單個導入任務可以拆分成多個導入任務并發執行導入,多個導入任務使用同一GDS時可以使用-t參數打開GDS多線程并發執行導入。GDS建議掛載在不同物理盤以及不同網卡上,避免物理IO以及網絡可能出現的瓶頸。
? 在GDS IO與網卡未達到物理瓶頸前,可以考慮在數據倉庫開啟SMP進行加速。SMP開啟之后會對對應的GDS產生成倍的壓力。需要特別說明的是:SMP自適應衡量的標準是數據倉庫的CPU壓力,而不是GDS所承受的壓力。
? GDS與數據倉庫通信要求物理網絡暢通,并且盡量使用萬兆網。千兆網無法承載高速的數據傳輸壓力,極易出現斷連。即使用千兆網時數據倉庫無法提供通信保障。滿足萬兆網的同時,數據磁盤組I/O性能大于GDS單核處理能力上限(約400MB/s)時,方可尋求單文件導入速率最大化。
? 并發導入場景,與單表導入相似,至少應保證I/O性能大于網絡最大速率。
? GDS跟DN的數據比例建議在1:3至1:6之間。
? 為了優化列存分區表的批量插入效率,在批量插入過程中會對數據進行緩存后再批量寫盤。通過GUC參數“partition_mem_batch”和“partition_max_cache_size”,可以設置緩存個數以及緩存區大小。這兩個參數的值越小,列存分區表的批量插入越慢。當然,越大的緩存個數和緩存分區,會帶來越多的內存消耗。
使用INSERT多行插入
如果不能使用COPY命令,而您需要進行SQL插入,可以根據情況使用多行插入。如果一次只添加一行或幾行,則數據壓縮效率低下。
多行插入是通過批量進行一系列插入而提高性能。下面的示例使用一條INSERT語句向一個三列表插入三行。這仍屬于少量插入,只是用來說明多行插入的語法。
向表customer_t1中插入多行數據:
INSERT INTO customer_t1 VALUES
(6885, 'maps', 'Joes'),
(4321, 'tpcds', 'Lily'),
(9527, 'world', 'James');
使用COPY命令導入數據
COPY命令從本地或其它數據庫的多個數據源并行導入數據。COPY導入大量數據的效率要比INSERT語句高很多,而且存儲數據也更有效率。
使用gsql元命令導入數據
\copy命令在任何psql客戶端登錄數據庫成功后可以執行導入數據。與COPY命令相比較,\copy命令不是讀取或寫入指定文件的服務器,而是直接讀取或寫入文件。
這個操作不如SQL COPY命令有效,因為所有的數據必須通過客戶端/服務器的連接來傳遞。對于大量的數據來說SQL命令可能會更好。
說明\COPY只適合小批量,格式良好的數據導入,容錯能力較差。導入數據應優先選擇GDS或COPY 。