1. 程式人生 > >GreenPlum數據加載

GreenPlum數據加載

space clas nbsp valid between pass 通過 order lds

1. copy命令

  對於數據加載,GreenPlum數據庫提供copy工具,copy工具源於PostgreSQL數據庫,copy命令支持文件與表之間的數據加載和表對文件的數據卸載。使用copy命令進行數據加載,數據需要經過Master節點分發到Segment節點,同樣使用copy命令進行數據卸載,數據也需要由Segment發送到Master節點,由Master節點匯總後再寫入外部文件,這樣就限制了數據加載與卸載的效率,但是數據量較小的情況下,copy命令就非常方便。下面測試通過copy命令實現操作系統文件到數據庫中表的數據加載。

1.1 創建測試表

lottu=# create table
tbl_pay_log_copy (id int primary key,order_num varchar(100),accountid varchar(30),qn varchar(20),appid int,amount numeric(10,2),pay_time timestamp); NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "tbl_pay_log_copy_pkey" for table "tbl_pay_log_copy" CREATE TABLE lottu=# \d tbl_pay_log_copy
Table "public.tbl_pay_log_copy" Column | Type | Modifiers -----------+-----------------------------+----------- id | integer | not null order_num | character varying(100) | accountid | character varying(30) | qn | character varying
(20) | appid | integer | amount | numeric(10,2) | pay_time | timestamp without time zone | Indexes: "tbl_pay_log_copy_pkey" PRIMARY KEY, btree (id), tablespace "tbs_lottu" Distributed by: (id) Tablespace: "tbs_lottu"

1.2 準備測試數據

[gpadmin@mdw ~]$ head ios_pay.txt 
73,ysios_receipt_3793615cb10dc393bba87c82d3c6544f,27388062,yriu1244_16043_001,2616,98.00,2017-11-06 17:36:43
72,ysios_receipt_32946f3d37e774781babe103352bd230,27424976,yriu1244_16043_001,2616,30.00,2017-11-06 15:18:56
75,ysios_receipt_3e2e432550253450412692392c7675d0,27388294,yriu1244_16043_001,2616,98.00,2017-10-19 07:33:03
74,ysios_receipt_3793615cb10dc393bba87c82d3c6544f,27388062,yriu1244_16043_001,2616,98.00,2017-11-06 20:40:46
77,ysios_receipt_ee6bed338a32f836a999133cd2e6d547,27388294,yriu1244_16043_001,2616,98.00,2017-10-19 22:27:46
76,ysios_receipt_ae53b142924c0604820537d61a9dd73e,27424976,yriu1244_16043_001,2616,648.00,2017-10-19 12:10:17
79,ysios_receipt_30ec130bcdf0e864629d12f8392d4b43,27385229,yriu1244_16043_001,2616,98.00,2017-10-21 07:46:01
78,ysios_receipt_e2b62024f1b0c3a2c3aae1e80f126eb6,27387306,yriu1244_16043_001,2616,25.00,2017-10-20 01:54:24
81,ysios_receipt_3e72a8e32c9fee546ab08d103606e6cb,27424976,yriu1244_16043_001,2616,30.00,2017-10-21 13:55:54
80,ysios_receipt_6ca291884fcfe3d1583b49a3611b4ccc,27424976,yriu1244_16043_001,2616,25.00,2017-10-21 13:55:51
[gpadmin@mdw ~]$ wc -l ios_pay.txt 
20027 ios_pay.txt
[gpadmin@mdw ~]$ du -sh ios_pay.txt 
1.9M    ios_pay.txt

  現在文本“ios_pay.txt”有20027行記錄;大小約2M。

1.3 copy命令語法

lottu=# \h copy
Command:     COPY
Description: copy data between a file and a table
Syntax:
COPY table [(column [, ...])] FROM {file | STDIN}
     [ [WITH] 
       [OIDS]
       [HEADER]
       [DELIMITER [ AS ] delimiter]
       [NULL [ AS ] null string]
       [ESCAPE [ AS ] escape | OFF]
       [NEWLINE [ AS ] LF | CR | CRLF]
       [CSV [QUOTE [ AS ] quote] 
            [FORCE NOT NULL column [, ...]]
       [FILL MISSING FIELDS]
     [ [LOG ERRORS INTO error_table] [KEEP] 
       SEGMENT REJECT LIMIT count [ROWS | PERCENT] ]


COPY {table [(column [, ...])] | (query)} TO {file | STDOUT}
      [ [WITH] 
        [OIDS]
        [HEADER]
        [DELIMITER [ AS ] delimiter]
        [NULL [ AS ] null string]
        [ESCAPE [ AS ] escape | OFF]
        [CSV [QUOTE [ AS ] quote] 
             [FORCE QUOTE column [, ...]] ]

常用參數
分隔符:[DELIMITER [ AS ] ‘delimiter‘]
處理空列(含有空格符的是不行的):[NULL [ AS ] ‘null string‘]
記錄錯誤數據,錯誤日誌表自動創建: [LOG ERRORS INTO error_table] [KEEP]
允許錯誤的行數或者百分比,大於指定值導入失敗全部回滾:SEGMENT REJECT LIMIT count [ROWS | PERCENT] ]

1.4 數據加載

  執行必須擁有superuser權限的用戶

lottu=# \du lottu
                List of roles
 Role name |      Attributes      | Member of 
-----------+----------------------+-----------
 lottu     | Superuser, Create DB | 

  執行命令;使用默認參數如下:

命令:copy tbl_pay_log_copy from ‘/home/gpadmin/ios_pay.txt‘ with delimiter ‘,‘ null ‘‘ ;

lottu=# copy tbl_pay_log_copy from /home/gpadmin/ios_pay.txt with delimiter , null ‘‘ ;
ERROR:  invalid input syntax for type numeric: "w"  (seg0 sdw1:40000 pid=3183)
CONTEXT:  COPY tbl_pay_log_copy, line 32, column 3

出現錯誤行記錄;先不討論如何跳過錯誤行記錄;執行copy命令失敗;是否有必要對表進行VACUUM?可以驗證下

lottu=# select ctid,id from tbl_pay_log_copy ;
 ctid | id 
------+----
(0 rows)

lottu=# insert into tbl_pay_log_copy (id) values (1);
INSERT 0 1
lottu=# select ctid,id from tbl_pay_log_copy ;
  ctid  | id 
--------+----
 (0,17) |  1
(1 row)

執行失敗;數據是回滾了;但是插入記錄並不是從(0,0)開始的;所以執行有必要對表進行VACUUM

  如何跳過錯誤行;加入下面參數即可

LOG ERRORS INTO參數指定錯誤數據記錄到哪張表中
SEGMENT REJECT LIMIT參數指定最大跳過的錯誤數

命令:copy tbl_pay_log_copy from ‘/home/gpadmin/ios_pay.txt‘ with delimiter ‘,‘ null ‘‘ LOG ERRORS INTO tbl_pay_log_copy_errs SEGMENT REJECT LIMIT 100;

lottu=# copy tbl_pay_log_copy from /home/gpadmin/ios_pay.txt with delimiter , null ‘‘ LOG ERRORS INTO tbl_pay_log_copy_errs SEGMENT REJECT LIMIT 100;
NOTICE:  Error table "tbl_pay_log_copy_errs" does not exist. Auto generating an error table with the same name
WARNING:  The error table was created in the same transaction as this operation. It will get dropped if transaction rolls back even if bad rows are present
HINT:  To avoid this create the error table ahead of time using: CREATE TABLE <name> (cmdtime timestamp with time zone, relname text, filename text, linenum integer, bytenum integer, errmsg text, rawdata text, rawbytes bytea)
NOTICE:  Found 1 data formatting errors (1 or more input rows). Errors logged into error table "tbl_pay_log_copy_errs"
COPY 20026

  表tbl_pay_log_copy成功插入20026行記錄;1條失敗記錄插入表tbl_pay_log_copy_errs;該表不需要創建;若庫不存在表;則會創建

下面看下這20026條數據的數據分布情況。是否傾斜?

lottu=# select gp_segment_id,count(*) from tbl_pay_log_copy group by 1;
 gp_segment_id | count 
---------------+-------
             0 | 10013
             1 | 10013

1.5 數據卸載

  Copy工具不僅可以把數據從文件加載到數據庫的表中,也可以將數據從數據庫的表中卸載到操作系統的文件中。如下:

命令:copy tbl_pay_log_copy to ‘/home/gpadmin/tbl_pay_log_copy_output.txt‘ WITH DELIMITER AS ‘,‘;

lottu=# copy tbl_pay_log_copy to /home/gpadmin/tbl_pay_log_copy_output.txt WITH DELIMITER AS ,;
COPY 20026

  也可以根據query進行卸載;這樣可以根據需求導出自己需要的記錄或者列記錄。如下:

命令:copy (select * from tbl_pay_log_copy where id = 73) to ‘/home/gpadmin/tbl_pay_log_copy_id_73.txt‘ WITH DELIMITER AS ‘,‘;

lottu=# copy (select * from tbl_pay_log_copy where id = 73) to /home/gpadmin/tbl_pay_log_copy_id_73.txt WITH DELIMITER AS ,;
COPY 1

  查看導出文件

[gpadmin@mdw ~]$ ll tbl_pay_log_copy_output.txt tbl_pay_log_copy_id_73.txt
-rw-r--r--. 1 gpadmin gpadmin     109 Apr 18 22:52 tbl_pay_log_copy_id_73.txt
-rw-r--r--. 1 gpadmin gpadmin 1917463 Apr 18 22:50 tbl_pay_log_copy_output.txt

  使用SELECT的COPY效率比直接使用表名COPY效率低很多,對於數據量稍大的表,可以考慮使用中間表結合COPY的方式來卸載數據

1.6 其他參數解釋

  format:指定導入的文件格式為csv格式
  escape:指定了在引號中的轉義字符為反斜杠,這樣即使在引號字串中存在引號本身,也可以用該字符進行轉義,變為一般的引號字符,而不是字段終結
  header true:指定文件中存在表頭。如果沒有的話,則設置為false
  quote:指定了以雙引號作為字符串字段的引號,這樣它會將雙引號內的內容作為一個字段值來進行處理

2. 使用gpfdist的外部表

  外部表提供了對Greenplum數據庫之外的來源中數據的訪問。可以用SELECT語句訪問它們,外部表通常被用於抽取、裝載、轉換(ELT)模式,這是一種抽取、轉換、裝載(ETL)模式的變種,這種模式可以利用Greenplum數據庫的快速並行數據裝載能力。這是COPY命令不持有的。

技術分享圖片
外部表加載方式有很多;詳細介紹《請見Greenplum數據庫參考指南》

gpfdist原理:

  gpfdist是一個使用HTTP協議的文件服務器程序,它以並行的方式向Greenplum數據庫的Segment供應外部數據文件一個gpfdist實例,每秒能供應200MB並且很多gpfdist進程可以同時運行,每一個供應要被裝載的數據的一部分。當使用者用INSERT INTO <table> SELECT * FROM <external_table>這樣的語句開始裝載時,INSERT語句會被Master解析並且分布給主Segment。Segment連接到gpfdist服務器並且並行檢索數據,解析並驗證數據,從分布鍵數據計算一個哈希值並且基於哈希鍵把行發送給它的目標Segment。每個gpfdist實例默認將接受最多64個來自Segment的連接。通過讓許多Segment和gpfdist服務器參與到裝載處理中,可以以非常高的速率被裝載。

2.1 創建實驗環境

lottu=# create table tbl_pay_log_gpfdist(id int primary key,order_num varchar(100),accountid varchar(30),qn varchar(20),appid int,amount numeric(10,2),pay_time timestamp);
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "tbl_pay_log_gpfdist_pkey" for table "tbl_pay_log_gpfdist"
CREATE TABLE
lottu=# \d tbl_pay_log_gpfdist
         Table "public.tbl_pay_log_gpfdist"
  Column   |            Type             | Modifiers 
-----------+-----------------------------+-----------
 id        | integer                     | not null
 order_num | character varying(100)      | 
 accountid | character varying(30)       | 
 qn        | character varying(20)       | 
 appid     | integer                     | 
 amount    | numeric(10,2)               | 
 pay_time  | timestamp without time zone | 
Indexes:
    "tbl_pay_log_gpfdist_pkey" PRIMARY KEY, btree (id), tablespace "tbs_lottu"
Distributed by: (id)
Tablespace: "tbs_lottu"

[gpadmin@mdw ~]$ head ios_pay.txt 
73,ysios_receipt_3793615cb10dc393bba87c82d3c6544f,27388062,yriu1244_16043_001,2616,98.00,2017-11-06 17:36:43
72,ysios_receipt_32946f3d37e774781babe103352bd230,27424976,yriu1244_16043_001,2616,30.00,2017-11-06 15:18:56
75,ysios_receipt_3e2e432550253450412692392c7675d0,27388294,yriu1244_16043_001,2616,98.00,2017-10-19 07:33:03
74,ysios_receipt_3793615cb10dc393bba87c82d3c6544f,27388062,yriu1244_16043_001,2616,98.00,2017-11-06 20:40:46
77,ysios_receipt_ee6bed338a32f836a999133cd2e6d547,27388294,yriu1244_16043_001,2616,98.00,2017-10-19 22:27:46
76,ysios_receipt_ae53b142924c0604820537d61a9dd73e,27424976,yriu1244_16043_001,2616,648.00,2017-10-19 12:10:17
79,ysios_receipt_30ec130bcdf0e864629d12f8392d4b43,27385229,yriu1244_16043_001,2616,98.00,2017-10-21 07:46:01
78,ysios_receipt_e2b62024f1b0c3a2c3aae1e80f126eb6,27387306,yriu1244_16043_001,2616,25.00,2017-10-20 01:54:24
81,ysios_receipt_3e72a8e32c9fee546ab08d103606e6cb,27424976,yriu1244_16043_001,2616,30.00,2017-10-21 13:55:54
80,ysios_receipt_6ca291884fcfe3d1583b49a3611b4ccc,27424976,yriu1244_16043_001,2616,25.00,2017-10-21 13:55:51
[gpadmin@mdw ~]$ wc -l ios_pay.txt 
20027 ios_pay.txt
[gpadmin@mdw ~]$ du -sh ios_pay.txt 
1.9M    ios_pay.txt

現在文本“ios_pay.txt”有20027行記錄;大小約2M。

2.2 gpfdist加載數據

  在看下gpfdist工具,gpfdist工具可以實驗並行加載,需要先啟動gpfdist進程及監聽端口,這個命令在Master和Segment節點的GPHOME/bin目錄下,如果配置了GP的環境變量,可以直接使用,如果在沒有安裝GP的服務器上使用gpfdist工具,只需要將gpfdist命令的文件拷貝到相應的服務器上即可使用。

本實驗文件在Master節點上;只需在Master啟動。

命令: nohup gpfdist -d /home/gpadmin -p 1234 -l /home/gpadmin/gpfdist.log &

[gpadmin@mdw ~]$ nohup gpfdist -d /home/gpadmin -p 1234 -l /home/gpadmin/gpfdist.log &
[1] 28777

  如上命令,啟動gpfdist進程,掃描路徑為/home/gpadmin,監聽端口為1234,下面創建一張基於gpfdist工具的外部表。

create external table med_pay_log_gpfdist
(id int,order_num varchar(100),accountid varchar(30),qn varchar(20),appid int,amount numeric(10,2),pay_time timestamp)
location(gpfdist://mdw:1234/ios_pay.txt)
format TEXT (DELIMITER as , null as ‘‘ESCAPE as OFF)
encoding utf8 LOG ERRORS INTO med_pay_log_gpfdist_err SEGMENT REJECT LIMIT 100;

  查看gpfdist進程

ps -ef|grep gpfdist|grep -v "grep"

  停掉gpfdist進程

kill xxx
pg_cancel_backend(xxx)

  加載數據

lottu=# insert into tbl_pay_log_gpfdist select * from med_pay_log_gpfdist;
NOTICE:  Found 1 data formatting errors (1 or more input rows). Rejected related input data.
INSERT 0 20026
Time: 780.017 ms

  ANALYZE

lottu=# analyze tbl_pay_log_gpfdist;
ANALYZE

  加載完成之後需要停到gpfdist進程

[gpadmin@mdw ~]$ ps -ef|grep gpfdist|grep -v "grep"
gpadmin  28777 20448  0 00:32 pts/1    00:00:00 gpfdist -d /home/gpadmin -p 1234 -l /home/gpadmin/gpfdist.log
[gpadmin@mdw ~]$ kill 28777

  刪除外部表

lottu=# drop external table med_pay_log_gpfdist;
DROP EXTERNAL TABLE

  GP數據庫查詢數據,先掃描到的數據會直接返回,也就是多次查詢的結果可能是不一樣的,使用gpfdist工具加載,而gpfdist工具加載數據是並行加載的,最先插入到數據庫的數據並不一定是從第一條數據開始的。

  查看數據是否傾斜

lottu=# select gp_segment_id,count(*) from tbl_pay_log_gpfdist group by 1;
 gp_segment_id | count 
---------------+-------
             1 | 10013
             0 | 10013

2.3 卸載數據

  使用可寫外部表卸載數據時,如果使用gpfdist工具,就可以實現並行卸載,而且數據不需要經過Master節點,直接由Segment節點寫入到外部文件中,效率比較高,卸載大量數據時,使用這種方式會節省大量的時間。

  下面測試通過可寫外部表並且使用gpfdist工具來卸載數據到sdw1主機上

  在sdw1主機啟動gpfdist進程

nohup gpfdist -d /home/gpadmin -p 1234 -l /home/gpadmin/gpfdist.log &

  創建可寫外部表

lottu=# create writable external table med_pay_log_gpfdist_unload (like tbl_pay_log_gpfdist) location (gpfdist://192.168.1.202:1234/unload.txt) Format text;
NOTICE:  Table doesnt have distributed by clause, defaulting to distribution columns from LIKE table
CREATE EXTERNAL TABLE
Time: 46.912 ms

  卸載數據

lottu=# insert into med_pay_log_gpfdist_unload select * from tbl_pay_log_gpfdist;
INSERT 0 20026

  卸載完成之後需要停到gpfdist進程

[gpadmin@sdw1 ~]$ ps -ef|grep gpfdist|grep -v "grep"
gpadmin   4650  1163  0 00:57 pts/0    00:00:00 gpfdist -d /home/gpadmin -p 1234 -l /home/gpadmin/gpfdist.log
[gpadmin@sdw1 ~]$ kill 4650

  刪除外部表

lottu=# drop external table  med_pay_log_gpfdist_unload;
DROP EXTERNAL TABLE

3. GreenPlum數據加載工具gpload

  gpload是一種數據裝載工具,它扮演著Greenplum外部表並行裝載特性的接口的角色。gpload使用定義在一個YAML格式的控制文件中的規範來執行一次裝載。

  它會執行下列操作:

  • 調用gpfdist進程
  • 基於定義的源數據創建一個臨時的外部表定義
  • 執行INSERT、UPDATE或者MERGE操作將源數據載入數據庫中的目標表
  • 刪除臨時外部表
  • 清除gpfdist進程

3.1 創建實驗環境

create table tbl_pay_log_gpload (like tbl_pay_log_gpfdist);

3.2 創建YAML格式控制文件

  使用gpload工具,需要編寫gpload工具的控制文件,這個控制文件是使用yuml語言編寫,如下是gpload工具的演示

---
VERSION: 1.0.0.1
DATABASE: lottu
USER: lottu
HOST: mdw
PORT: 5432
GPLOAD:
  INPUT:
    - SOURCE:
        LOCAL_HOSTNAME:
          - sdw1  
        PORT: 1234
        FILE:
          - /home/gpadmin/unload.txt
    - COLUMNS:
          - id: int
          - order_num: varchar
          - accountid: varchar
          - qn: varchar
          - appid: int
          - amount: numeric
          - pay_time: timestamp
    - FORMAT: text
    - ERROR_LIMIT: 25
    - error_table: public.tbl_pay_log_gpload_err
  OUTPUT:
    - TABLE: public.tbl_pay_log_gpload
    - MODE: INSERT
  SQL:
    - BEFORE: "truncate table public.tbl_pay_log_gpload"
    - AFTER: "ANALYZE tbl_pay_log_gpload"

  特別提醒:“-”後一定要有空格;“:”後也一定要有空格。

參數說明:

VERSION     自定義版本號(可選項)
DATABASE    需要連接的數據庫,如果沒有指定,根據$PGDATABASE變量確定
USER        執行操作的用戶。如果沒指定,根據$PGUSER變量確定
HOST        可選項。指定master節點的主機名(IP)。如果沒指定,根據變量$PGHOST確定。
PORT        可選項。指定master的端口,默認是5432或者$GPORT。
GPLOAD      必須項。load部分的開始。一個GPLOAD部分必須包含一個INPUT和一個OUTPUT。
INPUT       必須項。定義加載數據的格式和位置。gpload在當前主機上啟動一個或者多個gpfdist文件分布式實例 。註意,gpload命令所在主機可網絡訪問Greenplum中的每個節點(master&segment)。
SOURCE      必須項。INPUT部分的SOURCE塊其定義了source文件所在位置。一個INPUT部分中可以有1個或者多個SOURCE塊定義。每個SOURCE塊定義對應了一個本機的gpfdist實例。每個SOURCE塊定義必須制定一個source文件。
LOCAL_HOSTNAME    可選項。gpload工具運行所在的主機名或者IP地址。如果這臺主機有多個網卡,能同時使用每個網卡(每個網卡都有一個IP地址),通過設定LOCAL_HOSTNAME和PORT 實現多個gpfdist實例,可提升數據加載速度。默認情況,只使用主主機名或者IP地址。
PORT        可選項。gpfdist實例需要的端口。                    
FILE        必須項。文件位置。可同時制定多個相同格式的文件,入/home/gpadmin/script/*.txt。如果是gzip或bzip2文件,會自動解壓(在環境變量中設定好gunzip、bunzip2的路徑)。
CLOUMNS     可選項。說明source文件的格式,列名:數據類型。DELIMITER參數,指明source文件中兩個數據之間的分隔符。如果沒有指定COLUMNS選項,意味著source文件中的列的順序、列的數量、數據類型都和目標表一致。COLUMN的作用:SOURCE_TO_TARGET的mapping關系。
FORMAT      可選項。source文件的類型,比如text、csv。默認text格式不說指定。
DELIMITER   可選項。一行數據中,各列的分隔符號。TEXT格式中默認tab作為分隔符;CSV中以都好","作為分隔符。
ERROR_LIMIT 可選項。允許的錯誤行數。加載數據時,錯誤數據將被忽略。如果沒有到達錯誤限制數量,所有正常行會加載到GP中,問題行會存放到err_table中。如果超過錯誤值,正常數據也不會加載。
ERROR_TABLE 可選項。前提是開啟了ERROR_LIMIT 。錯誤表將記錄錯誤行。如果錯誤表不存在,會自動創建。若存在,直接插入數據。
EXTERNAL    可選項。定義外部表。
OUTPUT      必須項。定義最終source文件加載到的目標表。
TABLE       必須項。目標表。
MODE        可選項。有三種模式:insert,插入數據; update,當MATCH_COLUMNS參數值(相當於關聯列)等於加載數據時,更新UPDATE_COLUMS參數設置的列(相當於update的列)。 並且,必須設置UPDATE_CONDITION參數(相當於where過濾條件)。merge,  加載數據時,插入目標表中不存在的數據,更新目標中存在的數據。
MATCH_COLUMNS       在UPDATE或者MERGE模式下使用。相當於關聯列。這裏寫目標表的列名。
UPDATE_COLUMNS      在UPDATE或者MERGE模式下使用。更新的目標表列名。
UPDATE_CONDITION    可選項。目標表的列名,相當於where條件。用在update或者merge模式。
MAPPING      可選項。如果設置了MAPPING參數,那麽前面設置的COLUMNS參數會失效,因為MAPPING級別高於COLUMNS。關聯格式:target_column_name: source_column_name。where過濾格式:target_column_name: expression
RELOAD       可選項。導入時,是truncate之前目標表的數據,還是保留目標表數據。兩種模式,TRUNCATE 和REUSE_TABLES。
SQL          可選項。定義開始運行gpload和gpload結束執行的SQL語句。BEFORE,開始運行gpload執行的SQL,SQL需引號括起來;AFTER,gpload結束後執行的SQL,SQL需引號括起來。

3.3 加載數據

  然後使用gpload工具,將數據加載到數據庫。

[gpadmin@sdw1 ~]$ gpload -f gpload.yml
2018-04-19 18:28:37|INFO|gpload session started 2018-04-19 18:28:37
Password: 
2018-04-19 18:28:40|INFO|started gpfdist -p 1234 -P 1235 -f "/home/gpadmin/unload.txt" -t 30
2018-04-19 18:28:42|INFO|running time: 5.38 seconds
2018-04-19 18:28:43|INFO|rows Inserted          = 22052
2018-04-19 18:28:43|INFO|rows Updated           = 0
2018-04-19 18:28:43|INFO|data formatting errors = 0
2018-04-19 18:28:43|INFO|gpload succeeded

4. 數據裝載性能技巧

  • 在裝載前刪除索引 – 若裝載一張新創建的表,最快的方式是先創建表,再裝載數據,然後再創建任何需要的索引。在已存在的數據上創建索引比不斷的遞增索引要快。若向一個已有的表添加大量數據,更快的方式可能是,先刪除索引,然後裝載數據,然後再重新創建索引。臨時的增加maintenance_work_mem服務器參數可以提升CREATE INDEX名的速度,不過,這可能對於裝載數據本身沒有性能提升。應該考慮在沒有系統用戶在用時進行刪除並重新建立索引操作。

  • 在裝載之後運行ANALYZE -- 在修改了表中的大部分數據之後,強烈建議執行ANALYZE操作。執行ANALYZE(或者VACUUM ANALYZE)以確保查詢規劃器擁有最新的統計信息。如果沒有統計信息或者統計信息過時了,規劃器可能會根據過期的統計信息或不存在的統計信息選擇一個較差的查詢計劃,以至導致較差的性能。

  • 在裝載出錯後執行VACUUM – 如果運行的不是單條記錄錯誤隔離模式,裝載操作將在首次發生錯誤時終止。而目標表已經收到了錯誤發生前的記錄。這些記錄是無法被訪問的,但它們仍占據磁盤空間。若這種情況發生在大的裝載操作上,會導致大量的磁盤空間浪費。執行VACUUM命令可以回收這些浪費的空間。

  • 在裝載期間通過將gp_autostats_mode配置參數設置為NONE禁用自動統計信息收集。set gp_autostats_mode = none;

使用gpfdist和gpload裝載數據的詳細指導請見《Greenplum數據庫參考指南》。

GreenPlum數據加載