第二章 greenplum 快速入門
本章將介紹如何快速安裝部署greenplum卢鹦,以及一些常用命令及工具
[TOC]
2.1 軟件安裝及數(shù)據(jù)庫(kù)初始化
2.1.1 greenplum 架構(gòu)
Master主機(jī)與Segment主機(jī)對(duì)比:
Master主機(jī)負(fù)責(zé) | Segment主機(jī)負(fù)責(zé) |
---|---|
1. 建立與客戶端的會(huì)話連接和管理 | 1. 業(yè)務(wù)數(shù)據(jù)的存儲(chǔ)和存取 |
2. sql的解析并形成分布式的執(zhí)行計(jì)劃 | 2. 執(zhí)行由master分發(fā)的sql語(yǔ)句 |
3. 將生成好的執(zhí)行計(jì)劃分發(fā)到每個(gè)Segment上執(zhí)行 | 3. 對(duì)于master來(lái)說(shuō),每個(gè)Segment都是對(duì)等的貌夕,負(fù)責(zé)對(duì)應(yīng)數(shù)據(jù)的存儲(chǔ)和計(jì)算 |
4. 收集Segment的執(zhí)行結(jié)果 | 4. 每一臺(tái)機(jī)器上可以配置一到多個(gè)Segment |
5. master不存儲(chǔ)業(yè)務(wù)數(shù)據(jù)扁誓,只存儲(chǔ)數(shù)據(jù)字典 | 5. 由于每個(gè)Segment都是對(duì)等的棋蚌,建議采用相同的機(jī)器配置 |
6. master主機(jī)可以一主一備,分布在兩臺(tái)機(jī)器上 | 6. Segment分primary 和mirror兩種袱院,一般交錯(cuò)第存放在子節(jié)點(diǎn)上 |
7. 為了提高性能平斩,master最好單獨(dú)占用一臺(tái)機(jī)器 |
Master和Segment的關(guān)系:
Master和Segment其實(shí)都是一個(gè)單獨(dú)的PostgreSQL數(shù)據(jù)庫(kù)亚享,每一個(gè)都有自己?jiǎn)为?dú)的一套元數(shù)據(jù)字典。
Client一般只能與Master界面進(jìn)行交互绘面,Client將SQL發(fā)給Master欺税,然后Master對(duì)SQL進(jìn)行分析后,再將其分配給所有的Segment進(jìn)行操作揭璃,并且將匯總結(jié)果返回給客戶端晚凿。
2.1.2 環(huán)境搭建
- greenplum集群介紹
安裝linux
數(shù)據(jù)庫(kù)存儲(chǔ):linux下建議使用XFS,Solaris下建議使用ZFS瘦馍;Raid根據(jù)需求選擇硬Raid或軟Raid歼秽,需要更大空間則Raid5,性能要求高則Raid1+0
網(wǎng)絡(luò)(hosts):所有機(jī)器的網(wǎng)絡(luò)都通情组,防火墻都是關(guān)閉的燥筷,使用ping確定所有hostname都通
-
創(chuàng)建用戶及用戶組
- 刪除原有用戶:
#groupdel gpadmin # userdel gpadmin
-
創(chuàng)建新的用戶和用戶組:
#groupadd -g 530 gpadmin #useradd -g 530 -m -d /home/gpadmin -s /bin/bash gpadmin
-
對(duì)文件夾進(jìn)行賦權(quán),為新用戶創(chuàng)建密碼:
#chown -R gpadmin:gpadmin /home/bash gpadmin #passwd gpadmin Changing password for user gpadmin. New UNIX password: Retype new UNIX password:
2.1.3 greenplum安裝
1. 安裝數(shù)據(jù)庫(kù)軟件
下載地址:https://network.gopivotal.com/products/pivotal-gpdb
- 準(zhǔn)備好安裝文件:
greenplum-db-4.1.1.1-build-1-RHEL5-x86_64.zip
- 執(zhí)行unzip命令解壓安裝文件:
unzip greenplum-db-4.1.1.1-build-1-RHEL5-x86_64.zip
-
解壓后生成兩個(gè)文件:
README_INSTALL; greenplum-db-4.1.1.1-build-1-RHEL5-x86_64.bin.
-
為gp軟件創(chuàng)建安裝目錄院崇,并且賦給gp用戶權(quán)限:
mkdir /opt/greenplum chown -R gpadmin:gpadmin /opt/greenplum
-
執(zhí)行以下命令開(kāi)始安裝軟件:
./greenplum-db-4.1.1.1-build-1-RHEL5-x86_64.bin
-
屏幕上回出現(xiàn)License的一些信息肆氓,按“空格”鍵使信息完全,如下圖:
-
確認(rèn)License之后底瓣,接著出現(xiàn)如下圖:
-
輸入“yes”之后會(huì)提示安裝目錄做院,選擇安裝在/opt/greenplum/greenplum-db-4.1.1.1下,如下圖
-
完成以上步驟后濒持,軟件開(kāi)始自動(dòng)安裝键耕,最好顯示安裝成功,安裝目錄如下圖:
gp的環(huán)境變量已經(jīng)在greenplum_path.sh中設(shè)置了柑营,這里需要應(yīng)用一下這個(gè)環(huán)境變量配置
source /opt/greenplum/greenplum-db/greenplum_path.sh
2. 配置 hostlist
配置hostlist文件屈雄,將所有的服務(wù)器名記錄在里面
[gpadmin@dw-greenplum-l conf]$ cat hostlist
mdw
sdw1
sdw2
sdw3
seg_hosts 只保存Segment節(jié)點(diǎn)的hostname。
[gpadmin@dw-greenplum-l conf]$ cat seg_hosts
sdw1
sdw2
sdw3
3. 使用gpssh-exkeys打通所有服務(wù)器
使用gpssh-exkeys將所有機(jī)器的通道打開(kāi)官套,這樣就不用輸入密碼使登錄在每臺(tái)機(jī)器之間跳轉(zhuǎn)了酒奶,代碼如下:
[gpadmin@dw-greenplum-l conf]$ grssh-exkeys -f hostlist
[STEP 1 of 5] create local ID and authorize on local host
[STEP 2 of 5] keyscan all hosts and update known_hosts file
[STEP 3 of authorize current user on remote hosts]
... send to sdwl
***
*** Enter password for sdwl;
... send to sdw2
... send to sdw3
[STEP 4 of 5] determine common authentication file content
[STEP 5 of 5] copy authentication files to all remote hosts
... finished key exchange with sdw1
... finished key exchange with sdw2
... finished key exchange with sdw3
[INFO] completed successfully
在打通所有機(jī)器通道后,我們就可以使用grssh命令對(duì)所有機(jī)器進(jìn)行批量操作了
[gpadmin@dw-greenplum-l conf]$ grssh -f hostlist
=> pwd
[sdw3] /home/gradmin
[ mdw] /home/gradmin
[sdw1] /home/gpadmin
[sdw2] /home/gpadmin
4. 將軟件分發(fā)到每一臺(tái)機(jī)器上
接下來(lái)將安裝后的文件打包:
tar -cf gp4.1.tar greenplum-db-4.1.1.1/
然后利用gpscp命令將這個(gè)文件復(fù)制到每一臺(tái)機(jī)器上:
gpscp -f /home/gpadmin/conf/hostlist gp4.1.tar =:/opt.greenplum
使用gpssh命令批量解壓文件包:
=> cd /opt/greenplum
[sdw3]
[ mdw]
[sdw1]
[sdw2]
=> tar -xf gp4.1.tar
[sdw3]
[ mdw]
[sdw1]
[sdw2]
建立軟連接奶赔,如圖:
下面創(chuàng)建數(shù)據(jù)庫(kù)數(shù)據(jù)目錄
MASTER目錄:
=> mkdir -p /home/gpadmin/gpdata/gpmaster
Primary節(jié)點(diǎn)目錄:
=> mkdir -p /home/gpadmin/gpdata/gpdatap1
=> mkdir -p /home/gpadmin/gpdata/gpdatap2
Mirror節(jié)點(diǎn)目錄:
=> mkdir -p /home/gpadmin/gpdata/gpdatam1
=> mkdir -p /home/gpadmin/gpdata/gpdatam2
Gpmaster目錄保存Master的數(shù)據(jù)惋嚎,每個(gè)機(jī)器上的gpdatap1、gpdatap2否下對(duì)應(yīng)這個(gè)機(jī)器的兩個(gè)主數(shù)據(jù)節(jié)點(diǎn)目錄站刑,同樣的另伍,gpdatam1、gpdatam2對(duì)應(yīng)備數(shù)據(jù)節(jié)點(diǎn)目錄
5. 配置 ~/.bash_profile
要對(duì)系統(tǒng)的環(huán)境變量進(jìn)行配置,需要修改~./bash.profile摆尝,添加以下內(nèi)容:
source /opt.greenplum/greenplum-db/greenplum_path.sh
export MASTER_DATA_DIRECTORY=/home/gpadmin/gpdata/gpmaster/gpseg-l
export PGPORT=2345
export PGDATABASE=testDB
其中g(shù)reenplum_path.sh保存了運(yùn)行g(shù)p的以下環(huán)境變量設(shè)置温艇,包括GPHOME、PYTHONHOME等設(shè)置
6. 初始化greenplum的配置文件
配置文件的模板可以在$GPHOME/docs/cli_help/gpconfigs堕汞、目錄下找到勺爱。gpinitsystem_config文件是初始化greenplum的模板,在這個(gè)模板中讯检,Mirror Segment的配置都被注釋掉了琐鲁,下面是初始化的配置文件initgp_config:
# 數(shù)據(jù)庫(kù)的代號(hào)
ARRAY_NAME="Greenplum"
MACHINE_LIST_FILE=/home/gpadmin/conf/se_hosts
#Segment的名稱前綴
SEG_PREFIX=gpseg
#Primary Segment起始的端口號(hào)
PROT_BASE=33000
# 指定 Primary Segment的數(shù)據(jù)目錄
declare -a DATA_DIRECTORY=(/home/gpadmin/gpdatap1 /home/gpadmin/gpdata/gpdatap2)
#Master所在的機(jī)器的Hostname
MASTER_HOSTNAME=mdw
# 指定Master的數(shù)據(jù)目錄
MASTER_DIRECTORY=/home/gpadmin/gpdata/gpmaster
#Master的端口
MASTER_PORT=2345
# 指定 Bash 的版本
TRUSRED_SHELL=/usr/bin/ssh
# 字符集 ENCODING=UNICODE
#MIRROR_PORT_BASE=43000
#Primary Segment 主備同步的起始端口號(hào)
REPLICATION_PORT_BASE=34000
#Mirror Segment 主備同步的起始端口號(hào)
MIRROR_REPLICATION_PORT_BASE=44000
#Mirror Segment 的數(shù)據(jù)目錄
declare -a MIRROR_DATA_DIRECTORY=(/home/gpadmin/gpdata/gpdatam1 /home/gpadmin/gpdata/gpdatam2)
7.初始化數(shù)據(jù)庫(kù)
使用gpinitsystem腳本來(lái)初始化數(shù)據(jù)庫(kù),命令如下:
gpinitsystem -c initgp_config -s sdw3
根據(jù)腳本出現(xiàn)的額提示操作即可人灼,如下:
這樣數(shù)據(jù)庫(kù)就初始化成功了围段,嘗試登陸greenplum默認(rèn)的數(shù)據(jù)庫(kù)postgres:
[gpadmin@dw-greenplum-l ~]$ psql -d postgres
psql (8.2.15)
Type "help" for help.
postgres=#
2.1.4 創(chuàng)建數(shù)據(jù)庫(kù)
創(chuàng)建測(cè)試數(shù)據(jù)庫(kù)
createdb testDB -E utf-8
沒(méi)有設(shè)置PGDATABASE這個(gè)環(huán)境變量時(shí),使用psql進(jìn)行登陸挡毅,默認(rèn)的數(shù)據(jù)庫(kù)是與操作系統(tǒng)用戶名一致的漠吻,這時(shí)候會(huì)報(bào)錯(cuò):
[gpadmin@dw-greenplum-l ~]$ psql
psql: FATAL: databasse "gpadmin" does not exist
然后撤職(export)環(huán)境變量PGDATABASE=testDB桶略,這樣就默認(rèn)testDB數(shù)據(jù)庫(kù):
[gpadmin@dw-greenplum-l ~]$ export PGDATABASE=testDB
[gpadmin@dw-greenplum-l ~]$ psql
psql (8,2,15)
Type "help" for help
testDB=#
查詢數(shù)據(jù)庫(kù)版本并創(chuàng)建一張表:
testDB=# select version();
testDB=# create table test01(id int primary key,name varchar(128));
2.1.5 數(shù)據(jù)庫(kù)啟動(dòng)與關(guān)閉
1. 啟動(dòng)數(shù)據(jù)庫(kù)
可以用gpstart-help來(lái)查看幫助:
[gpadmin@inc-dw-hadoop-151-7 ~]$ gpstart --help
啟動(dòng)數(shù)據(jù)庫(kù),不用輸入“yes”镇饮,輸入后如下圖:
gpstart -a
2.關(guān)閉數(shù)據(jù)庫(kù)
關(guān)閉數(shù)據(jù)庫(kù)的腳本是gpstop:
一般使用gpstop -a取逾,不用輸入“yes”:
gpstop -s
2.2 安裝Greenplum的常見(jiàn)問(wèn)題
安裝gp最常見(jiàn)的錯(cuò)誤就是環(huán)境變量設(shè)置錯(cuò)誤耗绿,網(wǎng)卡配置錯(cuò)誤,或者是每個(gè)Segment的通道或網(wǎng)絡(luò)沒(méi)有打通
2.2.1 /etc/hosts 配置錯(cuò)誤
查詢一張普通表時(shí)報(bào)如下錯(cuò)誤砾隅,但是查詢數(shù)據(jù)字典又不報(bào)錯(cuò):
報(bào)這個(gè)錯(cuò)誤時(shí)因?yàn)镸aster連接不到Segment误阻。如果原先是一個(gè)正常的系統(tǒng),突然報(bào)錯(cuò)了晴埂,就要想想是否修改了什么導(dǎo)致的究反。
也可以利用這個(gè)方法來(lái)判斷一個(gè)操作是否需要與Master交互,比如生成執(zhí)行計(jì)劃是否只在Master上執(zhí)行儒洛,與Segment有沒(méi)有交互:
這樣就可以看出生成分布式執(zhí)行計(jì)劃也是需要與Segment進(jìn)行交互的
2.2.2 MASTER_DATA_DIRECTORY設(shè)置錯(cuò)誤
沒(méi)有設(shè)置MASTER_DATA_DIRECTORY精耐,會(huì)報(bào)這樣的錯(cuò)誤:
這樣會(huì)導(dǎo)致MASTER_DATA_DIRECTORY參數(shù)的目錄設(shè)置錯(cuò)誤:
在初始化數(shù)據(jù)庫(kù)的時(shí)候要多注意環(huán)境變量的設(shè)置,如果環(huán)境變量設(shè)置不當(dāng)琅锻,很容易造成數(shù)據(jù)庫(kù)初始化錯(cuò)誤
2.3 暢游Greenplum
2.3.1 如何訪問(wèn)Greenplum
1.psql
psql是greenplum/PostgreSQL默認(rèn)的客戶端卦停。
可以在其他機(jī)器上使用psql連接到數(shù)據(jù)庫(kù)中:
之所以報(bào)錯(cuò),是因?yàn)镚reenplum有權(quán)限控制恼蓬,并不是所有的機(jī)器都可以連接到數(shù)據(jù)庫(kù)上惊完。
如果有其他計(jì)算機(jī)要登錄Greenplum,先為數(shù)據(jù)庫(kù)用戶gpadmin創(chuàng)建一個(gè)密碼处硬,然后再pg_hba.conf文件中增加客戶端機(jī)器的權(quán)限配置小槐,這樣就可以成功登錄
testDB=# alter role gpadmin with password 'gpadmin';
ALTER ROLE
接著在$MASTER_DATA_DIRECTORY//pg_hba.conf文件中增加:
host testDB gpadmin 10.20.151.1/32 md5
之后通過(guò)gpstop -u命令使配置生效,如下圖:
這樣我們就可以在其他機(jī)器上登錄數(shù)據(jù)庫(kù):
2.pgAdmin
下載地址:http://www.pgadmin.org/download/
2.3.2 數(shù)據(jù)庫(kù)整體概況
1. greenplum基于PostgreSQL開(kāi)發(fā)
gp是基于開(kāi)源數(shù)據(jù)庫(kù)軟件PostgreSQL 8.3 開(kāi)發(fā)的荷辕,其大部分語(yǔ)法和數(shù)據(jù)字典都與PostgreSQL一樣本股,很多工具使用的規(guī)范也基本一樣
2.gp的數(shù)據(jù)分布
可以說(shuō)gp將PostgreSQL改造成一個(gè)分布式數(shù)據(jù)庫(kù)攀痊。其中Segment節(jié)點(diǎn)都是一個(gè)單獨(dú)的PostgreSQL數(shù)據(jù)庫(kù),Master本身也是一個(gè)PostgreSQL數(shù)據(jù)庫(kù)
Master本身不儲(chǔ)存數(shù)據(jù)拄显,所有數(shù)據(jù)拆分保存到每一個(gè)節(jié)點(diǎn)上苟径,在指定分布鍵的時(shí)候,數(shù)據(jù)按照分布鍵的Hash值來(lái)分布數(shù)據(jù)躬审,稱為哈希分布棘街。
還以一種分布不用指定分部件,數(shù)據(jù)隨機(jī)分布到每一個(gè)節(jié)點(diǎn)承边,稱作隨機(jī)分布(也叫平均分布)
2.3.3 基本語(yǔ)法介紹
1. 獲取語(yǔ)法介紹
可以使用\h查看gp支持的所有語(yǔ)法
在psql中使用 \h command 可以獲取具體命令的語(yǔ)法:
testDB=# \h create view
Command: CREATE VIEW
Description: define a new view
Syntax:
CREATE [ OR REPLACE ] [TEMP | TEMPORARY ] VIEW name [ ( column_name [, ...] ) ] AS query
2.CREATE TABLE
gp建表語(yǔ)句與其他數(shù)據(jù)庫(kù)不同的地方:
- 在gp中建表時(shí)需要制定表的分布鍵
- 如果表需要用某個(gè)字段分區(qū)遭殉,可以通過(guò)partition by將表建成分區(qū)表
- 可以使用like操作創(chuàng)建與like的表一樣結(jié)構(gòu)的表,功能類似create table t1 as select * from t2 limit 0
- 可以使用inherits實(shí)現(xiàn)表的繼承博助,棘突參考postgreSQL文檔
由于gp是一個(gè)分布式數(shù)據(jù)庫(kù)险污,數(shù)據(jù)是分布在每一個(gè)節(jié)點(diǎn)上的。在gp中有兩種數(shù)據(jù)分布策略:
- hash分布富岳。指定一個(gè)或多個(gè)分布鍵蛔糯,計(jì)算hash值,并且通過(guò)hash值路由到特定的Segment節(jié)點(diǎn)上窖式,語(yǔ)法為Distributed by(..)蚁飒。如果不指定分布鍵,默認(rèn)將第一個(gè)字段作為分布鍵萝喘。
- 隨機(jī)分布淮逻,也叫平均分布。數(shù)據(jù)隨機(jī)分散在每一個(gè) 節(jié)點(diǎn)中阁簸,這樣無(wú)論數(shù)據(jù)是什么內(nèi)容爬早,都可以平均分布在每個(gè)節(jié)點(diǎn)上,但是在執(zhí)行SQL的過(guò)程中启妹,關(guān)聯(lián)等操作都需要將數(shù)據(jù)重分布筛严,性能較差。語(yǔ)法為在表字段定義的后面加上Distributed randomly翅溺。
下面兩個(gè)建表語(yǔ)句的執(zhí)行結(jié)果一樣脑漫,都是以id作為分布鍵:
在下面的建表語(yǔ)句中指定了多個(gè)分布鍵:
在下面的建表語(yǔ)法中采用了隨機(jī)分布:
采用隨機(jī)分布策略的表默認(rèn)將主鍵或唯一鍵作為分布鍵,因?yàn)槊恳粋€(gè)Segment都是一個(gè)單一的數(shù)據(jù)庫(kù)咙崎,單個(gè)的數(shù)據(jù)庫(kù)可以保證唯一性优幸,多個(gè)數(shù)據(jù)庫(kù)節(jié)點(diǎn)就無(wú)法保證全局的跨庫(kù)唯一性。故只能按照唯一鍵分布褪猛,同一個(gè)值得數(shù)據(jù)都在一個(gè)節(jié)點(diǎn)上网杆,以此來(lái)保證唯一性
如果指定的分布鍵與主鍵不一樣,那么分布鍵會(huì)被更改為主鍵:
在創(chuàng)建表的時(shí)候,如果要建一張表結(jié)構(gòu)一模一樣的表碳却,可以利用create table like 命令:
使用like創(chuàng)建的表队秩,只是表結(jié)構(gòu)會(huì)與原表一模一樣,表的一些特殊屬性并不會(huì)一樣昼浦,例如壓縮馍资、只增(appendonly)等屬性。如果不指定分布鍵关噪,則默認(rèn)分布鍵與原表一樣
3.select
需要注意的是鸟蟹,gp的數(shù)據(jù)切分放在所有的Segment上。當(dāng)從一個(gè)表查詢數(shù)據(jù)的時(shí)候使兔,Master的數(shù)據(jù)展現(xiàn)順序是以Master先接收到的數(shù)據(jù)的順序建钥,每個(gè)Segment的數(shù)據(jù)到達(dá)Master的順序是隨機(jī)的,不是固定的虐沥,所以執(zhí)行SELECT的結(jié)果的順序是隨機(jī)的熊经,即使表中數(shù)據(jù)一點(diǎn)變化都沒(méi)有。這一點(diǎn)跟其他數(shù)據(jù)庫(kù)是不一樣的
4. create table as 與select into
create table as 可以加入distributed指定分布鍵欲险,select into 只能使用默認(rèn)的分布鍵
5. explain
explain用于查詢一個(gè)表的執(zhí)行計(jì)劃镐依,它在SQL優(yōu)化的時(shí)候經(jīng)常要用到(詳細(xì)的執(zhí)行計(jì)劃解釋參考第五章執(zhí)行計(jì)劃詳解)
下面代碼演示了簡(jiǎn)單的執(zhí)行計(jì)劃的查看方法:
上面的執(zhí)行計(jì)劃是一個(gè)層次關(guān)系,先從最右邊開(kāi)始查看:
- 數(shù)據(jù)庫(kù)先順序掃描test2表盯荤,掃描大概有118單位的消耗馋吗,有1667行數(shù)據(jù)焕盟,平均長(zhǎng)度為15字節(jié)秋秤。其中,1667行數(shù)據(jù)是一個(gè)估計(jì)值脚翘,是一個(gè)Segment的數(shù)據(jù)量灼卢,如果數(shù)據(jù)分布均勻,大概是總數(shù)據(jù)量除以Segment的個(gè)數(shù)来农。由于這個(gè)gp集群有6個(gè)Segment節(jié)點(diǎn)鞋真,因此可以推斷test2表大概有1萬(wàn)行數(shù)據(jù)
- 掃描出test2表,并且計(jì)算hash值沃于,將其保存在內(nèi)存中
- 順序掃描test1表
- 在掃描test1表的過(guò)程中涩咖,與test2表進(jìn)行hash后的結(jié)果關(guān)聯(lián)(hash join),關(guān)聯(lián)的條件是兩表的id字段相同
- 將數(shù)據(jù)匯總到Master上。Master將數(shù)據(jù)結(jié)果進(jìn)行匯總并展現(xiàn)
6.insert繁莹、update和delete
幾點(diǎn)數(shù)據(jù)切片帶來(lái)的問(wèn)題
-
insert:在執(zhí)行insert語(yǔ)句的時(shí)候檩互,要留意分布鍵不要為空,否則分布鍵默認(rèn)會(huì)編程null咨演,數(shù)據(jù)都被保存在一個(gè)節(jié)點(diǎn)上闸昨,造成數(shù)據(jù)分布不均
insert可以批量操作,語(yǔ)法如下:
insert into test001 values(100,'tom'),(101,'lily'),(102,'jack); INSERT 0 3
-
update:不能批量對(duì)分布鍵執(zhí)行update,因?yàn)閷?duì)分布鍵執(zhí)行update需要將數(shù)據(jù)重分布饵较,而gp暫時(shí)不支持這個(gè)功能
-
delete:在gp 3.x的版本中拍嵌,如果delete操作涉及子查詢,并且子查詢的結(jié)果還會(huì)涉及數(shù)據(jù)重分布循诉,這樣的刪除語(yǔ)句會(huì)報(bào)錯(cuò)横辆,如下(gp 4.x中支持該操作):
如果對(duì)整張表執(zhí)行Delete會(huì)比較慢,建議使用TRUNCATE
7.TRUNCATE
執(zhí)行TRUNCATE直接刪除表的物理文件茄猫,然后創(chuàng)建新的數(shù)據(jù)文件龄糊,TRUNCATE操作比delete在;x;ng上有非常大的提升,當(dāng)前如果有sql正在操作這張表募疮,那么TRUNCATE操作會(huì)被鎖住炫惩,知道表上面的所有鎖被釋放
testDB=# truncate test001;
TRUNCATE TABLE
2.3.4 常用數(shù)據(jù)類型
1. 數(shù)值類型
2.字符類型
3.時(shí)間類型
2.3.5 常用函數(shù)
1.字符串函數(shù)
2.時(shí)間函數(shù)
3.數(shù)值計(jì)算函數(shù)
4.其他常用函數(shù)
(1)序列號(hào)生成函數(shù):generate_series(start,end,step)
(2)字符串列轉(zhuǎn)行函數(shù):string_agg
(3)字符串行轉(zhuǎn)列-regexp_split_to_table
(4)hash函數(shù):md5,hashbpchar
2.3.6 分析函數(shù)
1.開(kāi)窗函數(shù)
聚合函數(shù)返回各個(gè)分組的結(jié)果阿浓,開(kāi)窗函數(shù)則為每一行返回結(jié)果:
{ rank() | row_number() | sum(...) | count(...) | ...} over ( [ partition by ...] [ order by ... ] )
2.grouping sets
如果需要對(duì)幾個(gè)字段的組合進(jìn)行g(shù)roup by他嚷,就需要用到Grouping Sets的功能:
2.3.7 分區(qū)表
在創(chuàng)建表時(shí),關(guān)于partition的語(yǔ)法如下:
alter table 對(duì)分區(qū)表特有的一些操作的語(yǔ)法:
對(duì)分區(qū)表的一些常用操作:
(1)新增分區(qū):
testDB=# alter table public. test_partirion_every add partition p20120105_6 START ('2012-01-05'::date) END ('2012-01-07'::date);
NOTICE: CREATE TABLE will create partition "test_partition_l_l_prt_p20120105_6" for table "test_partition_l"
ALTER TABLE
(2)drop/truncate 分區(qū)
alter table public. test_partition_every drop partition p20120105_6;
(3)拆分分區(qū):
alter table public. test_partition_every split partition p20120105_6 at(('2012-01-06'::date)) into (PARTITION p20120105,PARTITION p20120106;)
(4)交換分區(qū)
alter table public. test_partition_every exchange partition p20120102 with table public.test_one_partition;
2.3.8 外部表
gp在數(shù)據(jù)加載上有一個(gè)明顯的優(yōu)勢(shì)芭毙,就是支持?jǐn)?shù)據(jù)并發(fā)加載筋蓖,gpfdist就是并發(fā)加載的工具,在數(shù)據(jù)庫(kù)中對(duì)應(yīng)的就是外部表
外部表退敦,就是一張表的數(shù)據(jù)是指向數(shù)據(jù)庫(kù)之外的數(shù)據(jù)文件的粘咖。在gp中,我們可以對(duì)一個(gè)外部表執(zhí)行正常的DML操作侈百,當(dāng)讀取數(shù)據(jù)時(shí)瓮下,數(shù)據(jù)庫(kù)就從數(shù)據(jù)文件中加載數(shù)據(jù)。外部表支持在Segment上并發(fā)地告訴從gpfdist導(dǎo)入數(shù)據(jù)钝域,由于是直接從Segment上導(dǎo)入數(shù)據(jù)讽坏,所以效率非常高
創(chuàng)建外部表的語(yǔ)法:
外部表需要制定 gpfdist 的 IP 和端口,還要有詳細(xì)的目錄地址例证,其中文件名支持通配符匹配路呜。可以編寫多個(gè) gpfdist 的地址织咧,但是不能超過(guò)總的 Segment 數(shù)胀葱,否則會(huì)報(bào)錯(cuò)。在創(chuàng)建外部表的時(shí)候可以制定分隔符笙蒙、 err 表抵屿、制定允許出錯(cuò)的數(shù)據(jù)條數(shù),以及原文件的字符編碼等信息手趣。
外部表還支持本地文本文件的導(dǎo)入晌该,不過(guò)效率較低肥荔,不建議使用。外部表還支持 HDFS 的文件操作
啟動(dòng) gpfdist 及創(chuàng)建外部表的實(shí)際步驟如下:
1)首先在文件服務(wù)器(假設(shè)是 10.20.151.11 )上啟動(dòng) gpfdist 的服務(wù)朝群,指定文件目錄及端口燕耿。
nohup $GPHOME/bin/gpdfist -d /home/admin -p 8888 > /tmp/gpfdist.log 2>&1 &
啟動(dòng) gpfdist 后,在 log 中可以看到:
Serving HTTP on plrt 8888, directory /home/admin
說(shuō)明程序已經(jīng)成功啟動(dòng)了姜胖,端口是8888誉帅,這個(gè)服務(wù)只需要啟動(dòng)一次以后就不用啟動(dòng)了 nohup 保證程序在 Server 端執(zhí)行,當(dāng)前會(huì)話關(guān)閉后右莱,程序仍然正常運(yùn)行
2)準(zhǔn)備好需要加載的數(shù)據(jù)文件蚜锨,將其放在 10.20.151.11 機(jī)器上 /home/admin/ 目錄或該目錄的子目錄下,在 gp 中創(chuàng)建對(duì)應(yīng)的外部表:
3)外部表查詢及數(shù)據(jù)加載:
4)如果加載報(bào)錯(cuò)慢蜓,報(bào)錯(cuò)的數(shù)據(jù)會(huì)被插入到err表中亚再,并顯示報(bào)錯(cuò)詳細(xì)信息:
2.3.9 COPY命令
使用COPY命令可以實(shí)現(xiàn)將文件導(dǎo)出和導(dǎo)入,只不過(guò)要通過(guò)Master晨抡,效率沒(méi)有外部表高氛悬,但是在數(shù)據(jù)量比較小的情況下,COPY命令比外部表要方便很多
使用COPY命令的語(yǔ)法如下:
gp 4.x 中引入了可寫外部表耘柱,在導(dǎo)出數(shù)據(jù)的時(shí)候可以用可寫外部表并發(fā)導(dǎo)出如捅,性能很好,但是在 gp 3.x 版本中调煎,導(dǎo)出數(shù)據(jù)只能通過(guò) COPY 命令實(shí)現(xiàn)镜遣,數(shù)據(jù)在 Master 上匯總導(dǎo)出。
如果需要將數(shù)據(jù)遠(yuǎn)程導(dǎo)出到其他機(jī)器上士袄,可以使用 copy to stdout 悲关,遠(yuǎn)程執(zhí)行 psql 連接到數(shù)據(jù)庫(kù)上,然后通過(guò)管道將數(shù)據(jù)重定向成文件窖剑。