GreenPlum学习笔记:基础知识
一、介紹
GreenPlum分布式數據倉庫,大規模并行計算技術。?
- 無共享/MPP核心架構
Greenplum數據庫軟件將數據平均分布到系統的所有節點服務器上,所以節點存儲每張表或表分區的部分行,所有數據加載和查詢都是自動在各個節點服務器上并行運行,并且該架構支持擴展到上萬個節點。
- 混合的存儲和執行(按列或按行)
Greenplum發明支持混合按列或按行存儲數據,每張表或表分區可以由管理員根據應用需要,分別指定存儲和壓縮方式。基于這個功能,用戶可以對任何表或表分區選擇按行或按列存儲數據和處理方式。這些是在建表或表分區的DDL語句中配置的,只需在建表或表分區時指定。這個功能基于Greenplum的多態維數據存儲技術。
Master和Segment都是一個單獨的PostgreSQL數據庫。每一個都有自己單獨的一套元數據字典。
Master節點一般也叫主節點,Segment叫做數據節點。
為了實現高可用,每個Segment都有對應的備節點 Mirror Segment分別存在與不同的機器上。
Client一般只能與Master節點進行交互,Client將SQL發給Master,然后Master對SQL進行分析后再將其分配給所有的Segment進行操作。
Greenplum沒有Windows版本,只能安裝在類UNIX的操作系統上。
Greenplumn極度消耗I/O資源,所以對存儲的要求比較高。
?
?
- Master節點:是整個系統的控制中心和對外的服務接入點,它負責接收用戶SQL請求,將SQL生成查詢計劃并進行并行處理優化,然后將查詢計劃分配(dispatch)到所有的Segment節點進行并行處理,協調組織各個Segment節點按照查詢計劃一步一步地進行并行處理,最后獲取到Segment的計算結果,再返回給客戶端;從用戶的角度看Greenplum集群,看到的只是Master節點,無需關心集群內部的機制,所有的并行處理都是在Master控制下自動完成的。Master節點一般只有一個或兩個(互為備份);
- Segment節點:是Greenplum執行并行任務的并行運算節點,它接收Master的指令進行MPP并行計算,因此所有Segment節點的計算性能總和就是整個集群的性能,通過增加Segment節點,可以線性化得增加集群的處理性能和存儲容量,Segment節點可以是1~10000個節點;
- Interconnect:是Master節點與Segment節點、Segment節點與Segment節點之間的數據傳輸組件,它基于千兆交換機或萬兆交換機實現數據在節點間的高速傳輸;
- 外部數據加載到Greenplum時,采用并行數據流進行加載,直接加載到Segment節點,這項獨特的技術是Greenplum的專有技術,以此保證外部數據在最短時間內加載到數據庫中。
二、基本語法
?1.create table
- 在Greenplum中建表時需要指定表的分布鍵
- 如果表需要用某個字段分區,可以通過partition by將表建成分區表
- 可以使用like操作創建與like的表一樣結構的表,功能類似 create table t1 as select * from t2 limit 0
- 可以使用inherits實現表的繼承
Greenplum是一個分布式數據庫,有兩種數據分布策略:
- Hash分布:指定一個或多個分布鍵,計算hash值,并且通過hash值路由到特定的Segment節點上,語法為Distributed by(...)。如果不指定分布鍵,默認將第一個字段作為分布鍵。
- 隨機分布:也叫平均分布,數據隨機分散在每一個節點中,這樣無論數據是什么內容,都可以平均分布在每個節點上,但是在執行SQL的過程中,關聯等操作都需要將數據重分布,性能較差。語法為在表字段定義的后面加上Distributed randomly。
2.select
- 分頁采用offset加limit操作
- select可以不用加from子句
- 不加order by的話,查詢結果順序是隨機的
3.create table as與select into
- 可以使表根據直接執行select的結果創建出一個新的表,這個在臨時分析數據的時候十分方便。
- select into的語法比create table as更簡單,雖然功能一樣,但是執行select into不能指定分布鍵,只能使用默認的分布鍵。
4.explain
- 查詢表的執行計劃
5.insert/update/delete
- insert的時候分布鍵不要為空,否則分布鍵默認會變成null,數據都被保存在一個節點上,造成數據分布不均。
- 不能批量對分布鍵執行update,因為對分布鍵執行update需要將數據重分布,Greenplum暫時不支持這個功能。
- Greenplum 3.x版本中,如果delete操作涉及子查詢,并且子查詢的結果還會涉及數據重分布,這樣的刪除語句會報錯。對整張表執行Delete較慢,有此需求時建議使用truncate。
6.truncate
- 與oracle一樣,執行truncate直接刪除表的物理文件,然后創建新的數據文件。truncate操作比delete操作在性能上有非常大的提升,當前如果有sql正在操作這張表,那么truncate操作會被鎖住,直到表上面的所有鎖被釋放。
三、常用數據類型
?1.數值類型
- smallint
- integer
- bigint
- decimal
- numeric
- real
- double
- serial
- bigserial
2.字符類型
- character varying(n)
- varchar(n)
- character(n)
- char(n)
- text
3.時間類型
- timestamp
- interval
- date
- time
?四、常用函數
1.字符串函數
- string || string 字符串連接
select 'abc'||'def'; - length(string) 字符串長度
select length('abcd'); - position(substring in string) 指定子字符串的位置
select position('ab' in 'foanegabdafeab'); - substring(string from 2 for 5) 抽取子字符串,從第2位開始,取5位
select substring('abcdefghij' from 2 for 5); - trim(leading/trailing/both 'x' from string)從字符串string的開頭/結尾/兩邊刪除只包含characters中字符(默認是空白)的最長的字符串
select trim(both 'x' from 'xTomxxx'); - lower(string) 小寫
- upper(string) 大寫
select lower('ADENG'), upper('dfsen'); - overlay(string placing string from 2 for 4) 替換子字符串
select overlay('Txxxxas' placing 'hom' from 2 for 4); - replace(string,from,to) 把字符串string中出現的所有子字符串from替換成子字符串to
select replace('abdadfabadfab','ab','XX'); - split_part(string,delimiter,field) 根據delimiter分隔string返回生成的第field個子字符串(1開始)
select split_part('abc***def***fff','***',2); ?2.時間函數
- age(timestamp, timestamp) 減去參數后的”符號化”結果
select age(timestamp '2001-04-10', timestamp '1957-06-13');-- 43 years 9 mons 27 days - age(timestamp) 從current_date減去參數中的日期
select age(timestamp '2001-04-10'); -- 17 years 3 mons 27 days - current_date 當前的日期
select current_date; -- 2018-08-07 - current_time 當前時間
select current_time; -- 10:14:27.558098+08 - current_timestamp 當前事務開始時的時間戳
select current_timestamp; -- 2018-08-07 10:29:22.029703+08 - date_part(text, timestamp) 獲取子域,等同于extract
select date_part('hour', timestamp '2001-02-16 20:34:13') - date_trunc(text, timestamp) 截斷成指定的精度
select date_trunc('hour', timestamp '2001-02-16 20:34:13') - extract(field from timestamp) 獲取子域 同date_part
select extract('hour' from timestamp '2001-02-16 20:34:13') - now() 當前事務開始的時間戳
select now() -- 2018-08-07 10:35:13.367511+08 使用interval類型可以直接對事件類型進行計算,用來計算時間的加減
?3.數值計算函數
- abs 絕對值
- ceil、ceiling 最小整數
- exp 自然指數
- ln 自然對數
- log 以10為底的對數
- log(b,x) 以b為底的對數
- mod(y,x) y/x的余數
- pi() 派
- power(a,b) a的b次冪
- random() 0-1之間的隨機數
- floor() 最大整數
- round(x,s) s位小數
- sign(x) 符號化
- sqrt(x) 平方根
- cbrt(x) 立方根
- trunc(x,s) 截斷為s位小數
?4.其他常用函數
- generate_series(x,y,t)
序列號生成函數,生成多行數據從x到y,步長為t,默認是1。
select generate_series(2,20,2); - md5、hashbpchar
hash函數
md5的hash算法精度為128位,返回一個字符串
hashbpchar的精度是32位,返回一個integer類型
select hashbpchar('100');
select hashbpchar('helloworld'); - 分析函數
- 聚合函數返回各個分組的結果
- 開窗函數則為每一行返回結果
rank()、row_number() over(partition by a order by b)
三、注意點
1.縮進風格:必須使用空格,不允許使用【Tab】鍵。以免在用不同的編輯器閱讀程序時,因【Tab】鍵 所設置的空格數目不同而造成程序布局不整齊;
2.適量換行:避免將復雜的SQL 語句寫到同一行,建議要在關鍵字和謂詞處換行。
3.*號規則:避免使用SELECT * 語句;不要用*來代替所有字段,應給出字段列表,以避免在表結構發生變化時應用程序出現無法識別的情況。
4.長度匹配規則:確保變量和參數在類型和長度上與表數據列相匹配。如果與表數據列寬度不匹配,則當較寬或較大的數據傳進來時會產生運行異常。
?END?2018-08-02?09:59:53
?
轉載于:https://www.cnblogs.com/hider/p/9405415.html
總結
以上是生活随笔為你收集整理的GreenPlum学习笔记:基础知识的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JSP和Servlet学习笔记1 - 访
- 下一篇: 个性签名短语几个字