兩種類型:并行(可寫外部表)和非并行(COPY)
兩種方式的可寫外部表:基于檔案和基于WEB
定義基于檔案的可寫外部表
使用CREATE WRITABLE EXTERNAL TABLE 指令地定義外部表并指出輸出檔案的位置和格式
使用gpfdist協定的可寫外部表
GP segment将資料發送給gpfdist程序,該程序将資料寫到指定名稱的檔案;
若希望輸出的資料分割到多個檔案,可以在外部表的定義中指定多個gpfdist的URL選項
例如:
CREATE WRITABLE EXTERNAL TABLE tb_wext_gf01(LIKE tb_cp_02)
LOCATION ('gpfdist://mdw:8081/tb_wext_gf01.out',
'gpfdist://mdw:8082/tb_wext_gf02.out',
)
FROMAT 'TEXT' (DELIMITER ',')
DISTRIBUTED RANDOMLY;
insert into tb_wext_gf01 select * from tb_cp_02
一定要指定分布鍵,有一個小技巧,分布鍵的選擇建議與将要導出的堆表的分布鍵保持一緻,這樣就不會進行資料重分步。
定義基于指令的可寫外部表
使用CREATE WRITABLE EXTERNAL WEB TABLE 指令定義外部表并指定可執行指令或程式
對于可寫WEB表,EXECUTE 子句指定的指令或腳本準備着接受資料輸入流;
可寫外部表有分步政策選項,預設為随機分布;
若使用HASH分布政策,在可寫外部表中定義相同的分布鍵可以改善解除安裝的性能。
在外部表定義的EXECUTE子句中,可根據需要設定環境變量。例如
CREATE WRITABLE EXTERNAL WEB TABLE tb_wext_wb01(output text)
EXECUTE 'export PATH=$PATH:/home/gpadmin;myprogram.sh'
FROMAT 'TEXT'
DISTRIBUTED RANDOMLY;
WEB外部表和可寫表的可執行性
外部表執行OS指令或者腳本有一定的風險,根據需要,可以禁止在WEB表定義中使用EXECUTE。在Mater的postgresql.conf檔案設定gp_external_enable_exec=off
使用COPY解除安裝資料
在GP Master上使用COPY TO語句從資料庫表串行拷貝資料到檔案
例如:
COPY (SELECT * FROM tb_cp_02 WHERE date LIKE ‘2013%’ ) TO ‘/data/unload/tb_cp_02_2013.out’;
/COPY (SELECT * FROM tb_cp_02 WHERE date LIKE ‘2013%’ ) TO ‘/data/unload/tb_cp_02_2013.out’;–這個指令是在本地系統運作的 一般使用pgadminIII的插件。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TPR9UMVRUT5VkeNBDOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL0ADNzAzNxcTMyIDNwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
可讀外部表的統計資訊
無法通過ANALYZE擷取,可以通過手工修改資料字典pg_class來設定粗略統計值
指定行數和資料庫頁面數(資料尺寸/32K)
預設行數為1000000,頁面數為1000
手工修改:
update pg_class set reltuples=500000,repages=150 where relname=‘tb_wext_gf01’;