Greeplum 系列(三) 基本用法
Greeplum 系列(三) 基本用法
《PostgreSQL 教程》:https://www.yiibai.com/postgresql
一、Greeplum 登陸與創建
1.1 登陸
psql -d test -h 127.0.0.1 -p 5432 -U gpadmin
註意:默認登陸的表名為 gpadmin
1.2 創建數據庫
create database test; # 需要登陸 psql
createdb test; # 命令行模式
二、創建與管理模式
訪問模式的對象:schema.table,缺省 Public 模式
1. 創建和刪除模式
create schema sc01; # 創建 schema create schema sc02 authorization dylan; # 將 schema 權限賦予用戶 dylan drop schema sc01; # 刪除 schema(空模式) drop schema sc01 cascade; # 刪除模式及相關的所有對象
2. 查看模式
查看所有的模式為 \dn
List of schemas Name | Owner --------------------+--------- gp_toolkit | gpadmin information_schema | gpadmin pg_aoseg | gpadmin pg_bitmapindex | gpadmin pg_catalog | gpadmin pg_toast | gpadmin public | gpadmin
3. 設置模式搜索路徑
若不想通過指定模式名稱的方式來搜索需要的對象,可以通過設置 search_path 的方式來實現,第一個模式為缺省。
# 查看當前的搜索路徑 select current_schema(); show search_path; # 設置搜索路徑 # 通過ALTER DATABASE修改DB的模式搜索路徑 alter database test set search_path to sc01,public,pg_catalog; # 通過 alter role 修改 ROLE(User) 的模式搜索路徑 alter role dylan set search_path to sc01,public,pg_catalog;
註意: 修改表的搜索路徑後需要重新登陸才會生效,即不會在當前會話生效。
4. 系統模式
- pg_catalog 模式:存儲系統日誌表、內置類型、函數和運算符。
- Information_schema 模式:由一個標準化視圖構成。其中包含DB中對象的信息。
- pg_toast 模式:是存儲大對象(系統內部使用)
- pg_bitmapindex 模式:存儲bitmap index對象(系統內部使用)
- pg_aoseg 模式:存儲append-only表(系統內部使用)
- gp_toolkit 模式:是管理用的模式,可以查看和檢索系統日誌文件和其他系統信息。
三、創建與管理表
通過 CREATE TABLE 命令實現,在創建表時,通過需要定義以下幾點:
- 哪些列及數據類型
- 約束限定可以存儲什麽樣的數據
- 表的分布策略
- 存儲方式。比如壓縮、列存儲等
- 大表的分區策略
3.1 數據類型
- 對於字符類型,多數選擇 TEXT 或者 VARCHAR
- 對於數值類型,盡量選擇更小的數據類型
- 對於打算用作連接的列,選擇相同的數據類型
create table tb_products(
-- 1. 主鍵約束,唯一約束和非空約束的綜合體。默認成為 DK(Distributed Key)
id integer integer PRIMARY KEY,
-- 2. 唯一約束,確保字段的數據在表中唯一
product_no integer UNIQUE,
-- 3. 非空約束,不可以存在空值
name text NOT NULL,
-- 4. 檢查約束,過制定數據必須滿足一個布爾表達式來約束
price numeric CHECK(price>0)
-- 5. 外鍵約束,GPDB 目前不支持。
);
註意: 主鍵約束與唯一約束只有出現一個。
3.2 分布策略
在 create table 和 alter table 的時候使用 DISTRIBUTED BY(HASH 分布)或 DISTRIBUTED RANDOMLY(隨機分布)來決定數據如何分布。考慮要點:
- 均勻的數據分布:盡量確保每個 segment 實例存儲了等量的數據;盡可能使用具有唯一性的 DK,比如主鍵、唯一鍵等。
- 本地操作與分布式操作:確保查詢的處理(關聯、排序、聚合等)盡可能在每個實例的本地完成,避免數據重分布;不同表盡量使用相同DK,避免使用隨機分布。
- 均衡的查詢處理:盡可能確保每個 segment 實例能處理等量的工作負載。
聲明分布鍵:
- 在創建或者修改表定義的時候指定;
- 如果沒有指定,系統會依次考慮使用主鍵或第一個字段作為HASH分布的DK;
- 幾何類型或自定義類型的列不適合作為GP的DK。
- 如果沒有合適類型的列可以保證數據平均分布,則使用隨機分布。
create table tb_dk_01(a int, b int) distributed by(b);
create table tb_dk_02(a int, b int);
create table tb_dk_03(a int primary key, b int);
create table tb_dk_04(a int, b int) distributed randomly;
# 查看表分布鍵
\d tb_dk_01
3.3 存儲模式
選擇堆存儲(Heap)或只追加(Append-Only)存儲
- 堆存儲適合數據經常變化的小表,比如維度表;
- 只追加存儲適合倉庫中事實大表,通常是批量裝載數據並只進行只讀查詢操作,不支持 UPADTE 和 DELETE 操作。
# 創建堆表,缺省的存儲模式
CREATE TABLE tb_heap_01(id int) DISTRIBUTED BY (id)
# 創建只追加表
CREATE TABLE tb_ao_01(id int) WITH(appendonly=true)
3.4 行存儲與列存儲
選擇行存儲(Row-Orientation)或列存儲(Column-Orientation),考慮因素:
- 表數據的更新:只能選擇行存儲。
- 如果經常有數據被 INSERT:考慮選擇行存儲。
查詢設計的列數量:
如果在 SELECT 或 WHERE 中涉及表的全部或大部分列時,考慮行存儲。列存儲適用於在 WHERE 或 HAVING 中隊單列作聚合操作:
SELECT SUM(salary)
SELECT AVG(salary)…WHERE salary>10000或在 WHERE 條件中使用單個列條件且返回少量的行使用壓縮存儲
SELECT salary, dept…WHERE state=‘CA’
- 表的列數量:行存儲對於列多或行尺寸相對小的表更高效;列存儲在只訪問寬表的少量列的查詢中性能更高。
壓縮:列存儲表具有壓縮優勢。
-- 創建列存儲時,只能為追加(Append-Only)存儲
create table tb_col_01(a int, b text) with (appendonly=true, orientation=column) distributed by (a);
3.5 壓縮存儲(只支持Append-only表)
兩種壓縮方式:表級壓縮和列級壓縮。
(1) 選擇壓縮方式和級別的考慮因素:
- CPU性能
- 壓縮比
- 壓縮速度
- 解壓速度或查詢效率
應保證不會顯著提高壓縮時間和查詢效率的前提下最有效的壓縮減少數據尺寸。ZLIB 壓縮率高於 QUICKLZ,但速度較低。
-- 註意:QUICKLZ 只有一種壓縮級別,即沒有 compresslevel 參數,而 ZLIB 有 1-9 可選。
create table tb_zlib_01(a int, b text) with (appendonly=true, compresstype=zlib, compresslevel=5);
(2) 檢查 AO 表的壓縮和分布情況:
# 查看表的分布情況,只能用於Append-Only表
select get_ao_distribution(‘表名‘);
# 查看表的壓縮率,只能用於Append-Only表
select get_ao_compression_ratio(‘表名‘);
select gp_segment_id, count(1) from 表名 group by 1;
(3) 參數
- COMPRESSTYPE:ZLIB(更高壓縮率)、QUICKLZ(更快壓縮)、RLE_TYPE(運行長度編碼)、none(無壓縮、缺省)
- COMPRESSLEVEL:ZLIB為1-9級可選,1級最低,9級最高;QUICKLZ僅1級壓縮可選;RLE_TYPE為1-4級可選,1級快但壓縮率低,4級較慢但壓縮率高
- BLOCKSIZE:8K~2M
(4) 壓縮設置的優先級
在越低級別的設置具有越高的優先級:
- 子分區的列壓縮設置將覆蓋分區、列和表級的設置
- 分區的列壓縮設置將覆蓋列和表級的設置
- 列的壓縮設置將覆蓋整個表級的設置
註意: 存儲設置不可以被繼承
create table tb_t3 (
c1 int encoding(compresstype=zlib),
c2 text,
c3 text encoding(compresstype=rle_type),
c4 smallint encoding(compresstype=none),
defalut column encoding(compresstype=quicklz, blocksize=65536)
)
with(appendonly=true, orientation=column)
partition by range(c3)
(
start(‘2010-01-01‘::date) end(‘2010-12-31‘::date),
column c3 encoding(compresstype=zlib)
);
3.6 變更表
alter table 命令用於改變現有表的定義。例如:
alter table tb_01 alter column a set not null;
(1) 修改分布策略
-- 數據會重分布,並遞歸地應用於所有子分區
alter table tb_01 set distributed by(b);
-- 註意:將分布策略改為隨機分布時不會重新分布數據
alter table tb_01 set distributed randomly;
(2) 重分布表數據
# 隨機分布策略或者不改變分布策略的表,強行重分布
alter table tb_01 set with(reorganize=true);
(3) 修改表的存儲模式
存儲模式只能在CREATE TABLE時被指定。如果要修改,必須使用正確的存儲選項重建該表。
CREATE TABLE tb_zlib_02 (like tb_zlip_01) WITH (appendonly=true, compresstype=quicklz, compresslevel=1, orientation=column);
INSERT INTO tb_zlib_02 SELECT * FROM tb_zlip_01;
DROP TABLE tb_zlip_01;
ALTER TABLE tb_zlib_02 RENAME TO tb_zlib_01;
GRANT ALL PRIVILEGES ON tb_zlib_01 TO admin;
GRANT SELECT ON tb_zlib_01 TO dylan;
(4) 添加壓縮列
ALTER TABLE tb_zlib_01 ADD COLUMN c int DEFAULT 0 ENCODING (COMPRESSTYPE=zlib);
(5) 刪除表
-- 刪除與表相關的視圖,必須使用CASCADE
DROP TABLE tb01;
DROP TABLE tb03 CASCADE;
-- 使用 DELETE 或 TRUNCATE 清空表記錄
DELETE FROM tb02;
TRUNCATE tb02;
四、分區表
一張大表邏輯性地分成多個部分,如按照分區條件進行查詢,將減少數據的掃描範圍,提高系統性能。提高對於特定類型數據的查詢速度和性能,更方便數據庫的維護和更新。
決定表的分區策略:
- 表是否足夠大?大的事實表適合做表分區。
- 對目前的性能不滿意?查詢性能低於預期時再考慮分區。
- 查詢條件是否能匹配分區條件?查詢語句的WHERE條件是否與考慮分區的列一致
- 數據倉庫是否需要滾動歷史數據?歷史數據的滾動需求也是分區設計的考慮因素
- 按照某個規則數據是否可以被均勻的分拆?盡量把數據均勻分拆的規則
4.1 分區表類型
- Range分區: (日期範圍或數字範圍)/如日期、價格等
- List 分區: 例如地區、產品等
4.2 創建分區
TABLE 只能在 CREATE TABLE 時被分區。第一步要選擇分區類型(範圍分區、列表分區)和分區字段
(1) 定義日期範圍分區表(range分區)
使用單個 date 或者 timestamp 字段作為分區鍵。如果需要,還可以使用同樣的字段做子分區。通過使用 START、END 和 EVERY 子句定義分區增量讓 GP 自動產生分區。
CREATE TABLE tb_cp_01 (id int, date date, amt decimal(10, 2))
DISTRIBUTED BY (id)
PARTITION BY RANGE (date)
(
-- (默認行為)INCLUSIVE:包含 2013-01-01;EXCLUSIVE:不包含 2014-01-01
START (date ‘2013-01-01‘) INCLUSIVE
END (date ‘2014-01-01‘) EXCLUSIVE
EVERY (INTERVAL ‘1 month‘)
);
也可以為每個分區單獨制定名稱
CREATE TABLE tb_cp_02 (id int, date date, amt decimal(10, 2))
DISTRIBUTED BY (id)
PARTITION BY RANGE (date)
(
PARTITION Jan13 START (date ‘2013-01-01‘) INCLUSIVE,
PARTITION Feb13 START (date ‘2013-02-01‘) INCLUSIVE,
PARTITION Mar13 START (date ‘2013-03-01‘) INCLUSIVE,
PARTITION Apr13 START (date ‘2013-04-01‘) INCLUSIVE,
PARTITION May13 START (date ‘2013-05-01‘) INCLUSIVE,
PARTITION Jun13 START (date ‘2013-06-01‘) INCLUSIVE,
PARTITION Jul13 START (date ‘2013-07-01‘) INCLUSIVE,
PARTITION Aug13 START (date ‘2013-08-01‘) INCLUSIVE,
PARTITION Sep13 START (date ‘2013-09-01‘) INCLUSIVE,
PARTITION Oct13 START (date ‘2013-10-01‘) INCLUSIVE,
PARTITION Nov13 START (date ‘2013-11-01‘) INCLUSIVE,
PARTITION Dec13 START (date ‘2013-12-01‘) INCLUSIVE
END (date ‘2014-01-01‘) EXCLUSIVE
);
(2) 定義數字範圍分區表
CREATE TABLE tb_cp_03 (id int, rank int, year int, gender char(1), count int)
DISTRIBUTED BY (id)
PARTITION BY RANGE (year)
(
START (2010) END (2014) EVERY (1),
DEFAULT PARTITION extra
);
(3) 創建列表分區表(list分區)
可以使用任何數據類型的列作為分區鍵;可以使用多個列組合作為分區鍵。
CREATE TABLE tb_cp_04 (id int, rank int, year int, gender char(1), count int )
DISTRIBUTED BY (id)
PARTITION BY LIST (gender)
(
PARTITION girls VALUES (‘F‘),
PARTITION boys VALUES (‘M‘),
DEFAULT PARTITION other
);
(4) 定義多級分區表
當需要子分區時,可以使用多級分區的設計。
CREATE TABLE tb_cp_05 (trans_id int, date date, amount decimal(9, 2), region text)
DISTRIBUTED BY (trans_id)
PARTITION BY RANGE (date)
SUBPARTITION BY LIST (region)
SUBPARTITION TEMPLATE
(
-- 子分區
SUBPARTITION usa VALUES (‘usa‘),
SUBPARTITION europe VALUES (‘europe‘),
DEFAULT SUBPARTITION other_regions
)
(
-- 主分區
START (date ‘2013-09-01‘) INCLUSIVE
END (date ‘2014-01-01‘) EXCLUSIVE
EVERY (INTERVAL ‘1 month‘),
DEFAULT PARTITION outlying_dates
);
創建3級子分區表,被分區為年、月、區域三層。
CREATE TABLE tb_cp_06 (id int, year int, month int, day int, region text)
DISTRIBUTED BY (id)
PARTITION BY RANGE (year)
SUBPARTITION BY RANGE (month)
SUBPARTITION TEMPLATE (
-- 定義二級分區(2個 + default)
START (1) END (3) EVERY (1),
DEFAULT SUBPARTITION other_months)
SUBPARTITION BY LIST (region)
SUBPARTITION TEMPLATE (
-- 定義三級分區(2個 + default)
SUBPARTITION usa VALUES (‘usa‘),
SUBPARTITION europe VALUES (‘europe‘),
DEFAULT SUBPARTITION other_regions)
(
-- 定義一級分區(2個 + default)
START (2012) END (2014) EVERY (1),
DEFAULT PARTITION outlying_years
);
4.3 查看分區設計
通過 pg_partitions 視圖查看分區表設計情況。
SELECT partitionboundary, partitiontablename, partitionname, partitionlevel, partitionrank
FROM pg_partitions WHERE tablename=‘tb_cp_05‘;
如下視圖也可以查看分區表的信息:
- 查看創建 SUBPARTITION 的 pg_partition_templates
- 查看分區表的分區鍵 pg_partition_columns
4.4 維護分區表
必須使用 ALTER TABLE 命令從頂級表來維護分區。
(1) 添加新分區
原分區表包含 subpartition template 設計:
ALTER TABLE tb_cp_05 DROP DEFAULT PARTITION;
ALTER TABLE tb_cp_05 ADD PARTITION START (date ‘2014-01-01‘) INCLUSIVE END (date ‘2014-02-01‘) EXCLUSIVE;
原分區不包含 subpartition template 設計:
ALTER TABLE tb_cp_05 ADD PARTITION START (date ‘2014-02-01‘) INCLUSIVE END (date ‘2014-03-01‘) EXCLUSIVE
(
SUBPARTITION usa VALUES (‘usa‘),
SUBPARTITION asia VALUES (‘asia‘),
SUBPARTITION europe VALUES (‘europe‘)
);
註意:如果存在默認分區,只能從默認分區中拆分新的分區
(2) 重命名分區
GP 中的對象長度限制為 63 個字符,並且受唯一性約束。子表的名稱格式:
<父表名稱>_<分區層級>_prt_<分區名稱>
修改父表名稱,將會影響所有分區表
# 對應分區表將會改為:tbcp05_1_prt_5
ALTER TABLE tb_cp_05 rename to tbcp05;
只修改分區名稱:
# 對應分區表將會改為:tbcp05_1_prt_jun13
ALTER TABLE tbcp05 RENAME PARTITION FOR(‘2013-06-01‘) TO Jun13;
(3) 刪除分區
# 刪除指定的分區
ALTER TABLE tb_cp_04 DROP PARTITION other;
# 刪除默認分區:
ALTER TABLE tb_cp_04 DROP DEFAULT PARTITION;
# 對於多級分區表,為同一層每一個分區刪除默認分區:
ALTER TABLE tb_cp_06 ALTER PARTITION FOR (RANK(1)) DROP DEFAULT PARTITION;
ALTER TABLE tb_cp_06 ALTER PARTITION FOR (RANK(2)) DROP DEFAULT PARTITION;
(4) 添加默認分區
# 使用ALTER TABLE命令添加默認分區:
ALTER TABLE tbcp05 ADD DEFAULT PARTITION other;
# 如果是多級分區表,同一層每個分區都需要默認分區:
ALTER TABLE tb_cp_06 ALTER PARTITION FOR (RANK(1)) ADD DEFAULT PARTITION other;
ALTER TABLE tb_cp_06 ALTER PARTITION FOR (RANK(2)) ADD DEFAULT PARTITION other;
(5) 清空分區數據
# 使用ALTER TABLE命令來清空分區。
ALTER TABLE tbcp05 TRUNCATE PARTITION FOR (RANK(1));
(6) 交換分區
交換分區是用一個普通的 TABLE 與現有的分區交換身份。使用 ALTER TABLE 命令來交換分區。只能交換最低層次的分區表。
CREATE TABLE jan13(LIKE tb_cp_02) WITH(appendonly=true);
INSERT INTO jan13 VALUES(1,‘2013-01-15‘,123.45);
ALTER TABLE tb_cp_02 EXCHANGE PARTITION for(date ‘2013-01-01‘) WITH TABLE jan13;
(7) 拆分分區
使用 ALTER TABLE 命令將現有的一個分區拆分成兩個。例如:將一個月分區數據拆分到一個1-15日的分區和另一個16-31日的分區
ALTER TABLE tb_cp_02 SPLIT PARTITION FOR(‘2013-01-01‘) AT (‘2013-01-16‘)
INTO (PARTITION jan131to15, PARTITION jan0816to31);
如果分區表有默認分區,要添加新分區只能從默認分區拆分:
ALTER TABLE tb_cp_03 SPLIT DEFAULT PARTITION
START (2014) INCLUSIVE END (2015) EXCLUSIVE
INTO (PARTITION y2014, DEFAULT PARTITION);
(8) 修改子分區模板
使用 ALTER TABLE SET SUBPARTITION TEMPLATE 命令來修改現在分區表的子分區模板。例如:
ALTER TABLE tb_cp_05 SET SUBPARTITION TEMPLATE
(
SUBPARTITION usa VALUES(‘usa‘),
SUBPARTITION africa VALUES(‘africa‘),
DEFAULT SUBPARTITION other
);
使用新模板後為表 tb_cp_05 添加一個分區,
ALTER TABLE tb_cp_05 ADD PARTITION Feb14 START (‘2014-02-01‘) INCLUSIVE END(‘2014-03-01‘) EXCLUSIVE;
4.5 其它
(1) 裝載分區表
- 分區表中頂級表是空的,數據存儲在最底層的表中。
- 為避免數據裝載失敗,可選擇定義默認分區。
- 查詢分區表時,默認分區總是會被掃描,如果默認分區包含數據,會影響查詢效率。
- 在使用 COPY 或者 INSERT 向父級表裝載數據時,數據會自動路由到正確的分區。
- 可考慮交換分區的方法直接轉載數據到子表,提高性能。
(2) 驗證分區策略
# EXPLAIN查看查詢計劃是否掃描了相關分區
EXPLAIN SELECT * FROM tb_cp_05 WHERE date=‘2013-12-01’ AND region=‘usa’;
(3) 分區選擇性掃描的限制
如果查詢計劃顯示分區表沒有被選擇性的掃描,可能和以下的限制有關:
- 查詢計劃僅可以對穩定的比較運算符,如:
=, <, <=, >, >=, <>
- 查詢計劃不識別非穩定函數來執行選擇性掃描。比如,WHERE 子句中使用如 date>CURRENT_DATE 會使查詢計劃執行分區掃描,而 time>TIMEOFDAY 不會。
五、序列
CREATE SEQUENCE myserial START 101; -- 創建索引
SELECT * FROM myserial; -- 查詢索引
SELECT setval(‘myserial’,201); -- 設置索引
INSERT INTO tb02 VALUES(nextval(‘myserial’), ‘abc’); -- 使用索引
ALTER SEQUENCE myserial RESTART WITH 105; -- 修改索引
DROP SEQUENCE myserial; -- 刪除索引
註意:如果啟用了鏡像功能,nextval 不允許在 UPDATE 和 DELETE 語句中被使用
六、索引
在分布式數據庫如 GP 中,應保守使用索引。GP會自動為主鍵建立主鍵索引,並確保索引在查詢工作負載(如表關聯、查詢)中真正被使用到。
GP中常用的兩種:B-tree 和 Bitmap 索引。
CREATE INDEX idx_01 ON tb_cp_02(id); -- 創建 B-tree 索引
CREATE INDEX bmidx_01 ON tb_cp_02 USING BITMAP(date); -- 創建位圖索引
REINDEX TABLE tb_cp_02; -- 重建全部索引
REINDEX INDEX bmidx_01; -- 重建特定索引
DROP INDEX bmidx_01; -- 刪除索引,在裝載數據時,通常先刪除索引,再裝載數據
七、視圖
CREATE VIEW vw_01 AS SELECT * FROM tb_cp_03 WHERE gender=‘F’; -- 創建視圖
DROP VIEW vw_01; -- 刪除視圖
八、數據管理
8.1 GP 事務管理
- GP 使用多版本控制模型(Mutltiversion Concurrency Control/MVCC)保持數據一致性
- MVCC 以避免給數據庫事務顯式鎖定的方式,最大化減少鎖爭用以確保多用戶環境下的性能
- GP 提供了各種鎖機制來控制對表數據的並發訪問
- GP 為每個事務提供事務隔離
(1) 表 1: GP 的並發控制-鎖模式
鎖模式 | 相關SQL命令 | 沖突的鎖 |
---|---|---|
ACCESS SHARE | SELECT | ACCESS EXCLUSIVE |
ROW SHARE | SELECT FOR UPDATE, SELECT FOR SHARE | EXCLUSIVE, ACCESS EXCLUSIVE |
ROW EXCLUSIVE | INSERT, COPY | SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ACCESS EXCLUSIVE |
SHARE UPDATE EXCLUSIVE | VACUUM (without FULL), ANALYZE | SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ACCESS EXCLUSIVE |
SHARE | CREATE INDEX | ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ACCESS EXCLUSIVE |
SHARE ROW EXCLUSIVE | ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ACCESS EXCLUSIVE | |
EXCLUSIVE | DELETE, UPDATE | ROW SHARE, ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ACCESS EXCLUSIVE |
(2) 事務使用
事務允許將多個 SQL 語句放在一起作為一個整體操作,所有 SQL 一起成功或失敗
在 GP 中執行事務的 SQL 命令:
- 使用 BEGIN 或 START TRANSACTION 開始一個事務塊
- 使用 END 或 COMMIT 提交事務塊
- 使用 ROLLBACK 回滾事務而不提交任何修改
- 使用 SAVEPOINT 選擇性的保存事務點,之後可以使用 ROLLBACK TO SAVEPOINT 回滾到之前保存的事務。
begin
insert into tb_cp_01 values();
savepoint p1;
insert into tb_cp_01 values();
roleback to p1;
end
(3) 事務隔離級別
SQL 標準定義了 4 個事務隔離級別:
- 未提交讀:在GP中與已提交讀等同
- 已提交讀(缺省):當事務使用該隔離級別,SELECT查詢只能看到查詢開始前的數據,其永遠讀不到SELECT查詢期間其他並發事務未提交或已提交的修改。
- 可重復讀:在GP中與穿行化等同
- 可串行化:這是嚴格的事務隔離級別。該級別要求事務被串行執行,也就是事務必須一個接一個的執行而不是並行執行。
8.2 回收空間和分析
事務 ID 管理,在每個數據庫每 2 百萬個事務的時候,對每張表執行 VACUUM 是很有必要的。
- 系統目錄維護:大量的 CREATE 和 DROP 命令會導致系統表的迅速膨脹,以至於影響系統性能。
- 由於 MVCC 事務並發模型的原因,已經刪除或者更新的記錄仍然占據著磁盤空間。
- 如果數據庫有大量的更新和刪除操作,將會產生大量的過期記錄
- 定期的運行 VACUUM 命令可以刪除過期記錄,回收空間。
- 自由映射空間的設置參數:max_fsm_pages、max_fsm_relations
VACUUM tb_cp_02; -- 回收空間
ANALYZE tb_cp_02; -- 收集查詢優化器需要的統計信息
8.3 日常重建索引
- 對於 B-tree 索引,新重建的索引比存在較多更新的索引更快
- 重建索引可以回收過期的空間
- 在 GP 中,刪除索引然後創建通常比 REINDEX 更快
- 當更新索引列時,Bitmap 索引不會被更新
8.4 GPDB 日誌文件
服務器日誌文件存放在每個實例數據目錄的 pg_log 目錄下,格式:gpdb-YYYY-MM-DD_TIME.csv
每天用心記錄一點點。內容也許不重要,但習慣很重要!
Greeplum 系列(三) 基本用法