1.gp数据库的性能由一组segment服务中最慢的segment决定
2.gp数据库暂时不支持触发器
3.Greenplum数据库能够很好的运行在传统的UNIX文件系统上,比如BSD/UFS/FFS文件系统上,很多操作系统支持,在linux操作系统上,XFS是被推荐的,在solaris操作系统上,ZFS是被推荐的。
4.gp数据库概述:
(1)灵活的可扩展性:在线扩展容量和性能;(2)快速接收来自不同来源的大量数据;(3)为数据库内分析提供高性能并行处理能力;(4)支持高的用户并发率;(5)极高的性能:针对快速查询执行和无可比拟的数据加载速度而优化;(6)降低的总体拥有成本:整合数据集市以降低成本;(7)高度可用:自我修复并且完全冗余;(8)高级备份和灾难恢复:利用业界领先的 Data Domain 备份和恢复;(9)可快速部署:专门构建的数据仓库应用装置。
5.硬件考虑因素:
(1)Segment服务器具有相同的硬件配置;推荐:双核,32GB Mem,高速磁盘阵列,4个以上千兆网口。
(2)Master服务器具有较高的cpu和内存资源;
(3)基准性能:3.2GB/s(综合的系统磁盘读写速度)
6.比较常用的有以下几个模块:
dblink: 类似与oracle中的dblink,但是功能要弱上一些,并且只能连接Postgresql或基于postgresql的数据库
oid2name: 获取数据库对象的oid或者根据oid得到数据库对象信息,是一个独立的可执行命令
pg_buffercache: 实时查询shared_buffer的缓存信息
pg_freespacemap: 显示FSM内容
pgrowlocks: 显示行锁信息
pgstattuple: 统计指定表中的”死行”和空闲空间
7.设置Master参数
Master参数只能在GP的master节点中设置。
多个级别中都有设置相同的参数,则以最小登记为准,session覆盖role,role覆盖database,database覆盖system
[system级参数]
步骤如下:
(1)编辑 $MASTER_DATA_DIRECTORY/postgresql.conf 文件
(2)找到你要修改的参数,去掉注释(删掉前面的#),并且设置你想要的值
(3)保存并关闭文件
(4)对于session参数不需要重启服务,执行如下:
$ gpstop -u
(5)对于需要重启服务的参数修改,执行如下:
$ gpstop -r
[database级参数]
当session参数设置在database级别,每个session连接到数据库时都要使用这个参数。
设置的database参数会覆盖system级的参数。
设置database级参数,使用ALTER DATABASE命令
如:
=# ALTER DATABASE mydatabase SET search_path TO myschema;
[role级参数]
当session参数设置在role级别,每个session通过role初始化时将使用此参数。
设置的role参数会覆盖database级的参数。
如:
=# ALTER ROLE bob SET search_path TO bobschema;
[session级参数]
任何session参数都能在活跃的session中设置,使用 SET 命令。
设置的session参数会覆盖role级的参数。
如:
=# SET work_mem TO '200MB';
=# RESET work_mem;
8.启动master进入维护模式
维护模式(maintenance mode) 指的是 仅仅启动master。
用途 => 在不影响segment用户数据的情况下,仅用utility mode连接到master,并且在system catalog中编辑设定。
步骤 =>(1)进入维护模式:$ gpstart -m;(2)连接到master,做cata_log维护,例如:$ PGOPTIONS='-c gp_session_role=utility' psql template1;(3)完成管理任务后,在进入生产模式production mode前,必须停止工具模式utility mode
9.更新数据
GP中UPDATE的限制条件:
1.distribution key 不能被更新
2.mirror启动时,在update语句中不能使用STABLE 或 VOLATILE
3.不支持RETURNING
UPDATE SQL示例:
UPDATE products SET price = 10 WHERE price = 5; --更新单行或多行数据
10.删除数据
GP中使用DETELE的限制条件:
1.mirror启动时,在delete语句中不能使用STABLE 或 VOLATILE
2.不支持RETURNING
3.Truncate是不扫描table。
DETELE SQL示例:
DELETE FROM products WHERE price = 10; --根据where条件删除
DELETE FROM products; --删除表中所有数据
TRUNCATE mytable; --清空表
11.【事务】
BEGIN 或START TRANSACTION --开启事务
END 或 COMMIT --结束事务
ROLLBACK --回滚
SAVEPOINT -- 分段提交或回滚事务
12.【索引】
在OLTP环境中,为了追求最快的响应时间而大量的使用索引。一般都是单条命中或少量数据集。
但是GP一般都是用来做OLAP,基本都是全表扫描,故应该尽量少的使用索引。
GP推荐在没有加任何索引的情况下,查看下你的查询的消耗情况。(注:有主键的表,系统会自动创建主键索引。)
12.1建索引需考虑:
(1)查询负载:BI一般都访问大数据集,因此不能利用上索引。针对OLAP型数据库,序列读取大批量数据比用索引随机扫描的性能要好。
(2)已压缩的表:索引能提高压缩append-only表的性能
(3)不要频繁更新的字段上建索引
(4)选择性的创建B-tree索引:索引选择度 = 同列的distinct个数 / 全部行数,例如:一个表有1000行,某列有800个唯一值,索引的选择度是0.8。唯一索引的选择度是1.0,这是最好情况
(5)在低选择性的列使用Bitmap索引:GP新增Bitmap索引,在postgresql是没有的
(6)索引列通常用来做join:常常被用来join的字段,建索引可以提高join的性能。(如: 外键)
(7)索引列经常被频繁使用在where语句中
(8)避免重复列创建索引
(9)批量导入数据需删除索引:导入大量数据时,先删除索引,等数据导完后再重建。这样速度会更快。
(10)考虑一个cluster索引:clustering an index意味着物理上数据在硬盘上是被排序过的。由于数据之间物理上更近了,读取的时候更有序。
12.2索引类型:
(1)B-tree;(2)GiST --用于GIS;(3)Bitmap (psotgres中无此索引类型)
注:gp中hash和GIN索引都被停用了。
12.3创建索引
CREATE INDEX title_idx ON films (title); --默认创建B-tree索引
CREATE INDEX gender_bmp_idx ON employee USING bitmap (gender);--创建bitmap索引
12.4检查索引使用
尽管在gp中索引不用维护和优化,但是检查索引使用时的负载情况还是很重要的。
查看EXPLAIN中出现的提示:
(1)Index Scan
(2)Bitmap Heap Scan
(3)Bitmap Index Scan
(4)BitmapAnd or BitmapOr
12.5管理索引
在某些情况下,一个低性能的索引可能需要进行REBUILD。update和delete是不更新bitmap 索引的,因此如果你要update或delete一个有bitmap索引的表的话,将需要rebuild。
REINDEX my_table; --重建my_table上的所有index
REINDEX my_index; --重建my_index索引
DROP INDEX title_idx; --删除索引title_idx
13.GP支持分区表,主要用来存放大表,如fact table
目的:(1)把大数据切片,便于查询;(2)便于数据库维护;(3)分区创建时,每个分区会自带一个Check约束,来限定数据的范围。Check约束也用于执行查询时定位分区。
支持分区类型:(1)范围分区 range partition;(2)列表分区 list partition;(3)组合分区
(1)partition 和 distribution的区别
distribution -- 物理上拆分表数据、能并行执行查询
partition -- 逻辑上拆分大表数据提高查询性能、利于数据仓库维护工作
(2)查看表分区
pg_partitions --查看创建分区信息
pg_partition_templates --查看是用subpartition模板创建的子分区
pg_partition_column --查看分区字段
14.选择列的数据类型
(1)字符类型,gp中CHAR、VARCHAR、TEXT在性能上没有什么差异。但其它数据库系统中char有性能优势。在大多数情况下,可以用CHAR来替代TEXT 或 VARCHAR。
(2)数字类型,最好使用最小的数据类型。 用INT or SMALLINT 代替 BIGINT。
(3)当需要跨表做join的时候,需要保证数据类型是一致。 不然的话,gp将做数据类型转换,造成性能消耗。
(4)GP中还包含一些集合数据类型。
15.约束:兼容postgresql,包含:check、not null、unique、primary key,暂不支持Foreign Key
16.选择分布策略:DISTRIBUTED BY (哈希分布)和DISTRIBUTED RANDOMLY(随机分布 Round-Robin)
考虑条件(重要性依次排序)
(1)Even Data Distribution:为了得到最好的性能,所有segment的数据量应该是相等的。如果出现不平衡的话,在查询的时候,数据量多的segment的负载就会很大。
(2)Local and Distributed Operations:要做join、sort或aggregation的操作的话,segment-level(segment内部)比system-level(segment之间)要快。
(3)Even Query Processing:每个Segment都获得相等的查询请求负载。
17.表存储方式
(1)Heap 或 Append-Only存储:GP默认使用堆表。堆表最好用在小表,如:维表(初始化后经常更新)。Append-Only表不能update和delete。一般用来做批量数据导入。 不建议单行插入。
CREATE TABLE bar (a int, b text)
WITH (appendonly=true)
DISTRIBUTED BY (a);
(2)Row 或 Column-Oriented 存储:行存储、列存储、混合存储
a.数据需要更新
行存储 => 表数据被导入后,如果需要更新的话
列存储 => 只适合append-only表。
b.经常插入数据
行存储 => 如果频繁插入数据
列存储 => 对于写操作没有做优化 (同一行的列值必须写到磁盘的不同位置)
c.多列查询请求
行存储 => 在select或where子句中,查询所有列或大部分列
列存储 => 在where或having子句中,查询单列的值汇总或单行过滤
SELECT AVG(salary)... WHERE salary > 10000
SELECT salary, dept ... WHERE state='CA'
d.表中许多列
行存储 => 同一次请求很多列 或 行数据大小相对较小
列存储 => 使用宽表,查询时候仅仅查少数列
e.压缩
行存储 => 不可用
列存储 => 可用
如:(注:使用列存储必须是append-only表)
CREATE TABLE bar (a int, b text)
WITH (appendonly=true, orientation=column)
DISTRIBUTED BY (a);
(3)使用压缩 (Append-Only表才适用):可以数据库内置的压缩(zlib 或 QuickLZ)。如果使用了已压缩的文件系统,建append-only表将不能使用压缩功能。
在选择append-only表的压缩类型和级别的时候需考虑一下因素:a.CPU的使用率;b.压缩率/磁盘大小;c.压缩速率;d.解压速率/扫描速率。
尽管我们为了减少数据容量大小而使用压缩功能,但是我们必须考虑到数据在压缩与解压的过程中的时间和cpu的消耗。
压缩的性能取决于硬件、查询调优设置、其它因素。
QuickLZ - 低压缩率、低cpu消耗、压缩数据块
zlib - 高压缩率、低速
CREATE TABLE foo (a int, b text)
WITH (appendonly=true, compresstype=zlib,
compresslevel=5);
(注: QuickLZ的压缩级别只有level1,zlib能够设置从1-9)
18.Schema是Database中逻辑组织object和data。
在同一Database中,不同schema的对象可以使用相同的名称。例如:A schema 中表叫tab1,B schema中表也可以叫tab1。但是在同一个schema中就会报错。
SELECT * FROM myschema.mytable;
注意:如果sql中指定了schema名字的话,就查询指定schema,否则查询search path中配置参数。
(1)用户级schema
public => GP默认安装,default schema
(2)系统级schema
pg_catalog => 包含系统数据字典表,内建的数据类型、函数和操作符。
information_schema => 包含标准视图的集合,视图都是从系统数据字典表中提出的信息。
pg_toast => 存放大对象 (GP内部使用)
pg_bitmapindex => 存放bitmap索引对象 (GP内部使用)
pg_aoseg => 存放append-only表 (GP内部使用)
pg_toolkit => 管理schema,查询系统日志文件和其它系统度量单位。包含一些外部表、视图和函数。
19.Database
GP能够创建1个或多个数据库,但是client程序每次只能访问1个数据库(不能跨库查询)。建库的时候不指定模板的话,默认使用template1(template1是在GP初始化就已经生成的)。
除这个模板以外,还有2个其它模板: template0 和 Postgres (供系统内部使用,不应该被删除和修改)。template0能创建一个完整干净的数据库,里面只有GP预定义的一些标准对象。
(1)3种建库方式
=> CREATE DATABASE new_dbname; (客户端连接,必须是superuser或有建库权限)
$ createdb -h masterhost -p 5432 mydatabase (命令行建库)
=> CREATE DATABASE new_dbname TEMPLATE old_dbname; (克隆数据库)
(2)2种删库方式
(注:删库是不能回滚,慎用!)
=> \c template1;
=> DROP DATABASE mydatabase; (客户端连接,先连接template1,然后再drop)
$ dropdb -h masterhost -p 5432 mydatabase(命令行)
(3)管理
SELECT datname FROM pg_datbase;(列出数据库清单)
=> ALTER DATABASE mydatabase SET search_path TO myschema, public, pg_catalog; (修改数据库参数)
20.Tablespace & Filespace
Tablespaces 允许每台机器使用多种文件系统,并决定如何才能使用最佳的物理存储方式。
表空间被使用的多种原因:a.针对数据使用频率来选择不同的存储类型;b.控制某些数据库对象的 I/O Performance。
filespace指的是所有组件的文件系统位置的集合。1个filespace可以被1个或多个tablespace使用。以下2个表空间使用的filespace是pg_system(GP初始化的时候指定的):
pg_global --(存放系统元数据)
gp_default --(template0和template1库的缺省表空间)
21.【限制并发】postgresql.conf文件参数
(1)max_connection --最大连接数
要变更的话,master和segment都要修改。 segment的值必须是master的5-10倍。
(2)和max_connection相关参数,max_prepared_transactions --最大预备事务数
master的max_prepared_transactions必须设置为大于或等于max_connection, segment的max_prepared_transactions应该设置和master一样。
例如:
在$MASTER_DATA_DIRECTORY/postgresql.conf(含standby master)中:
max_connection = 100
max_prepared_transactions = 100
在$SEGMENT_DATA_DIRECTORY/postgresql.conf中:
max_connection = 500
max_prepared_transactions = 100
修改步骤如下:
a.停库 $ gpstop
b.修改master参数
c.修改每个segment参数
d.重启 $ gpstart
22.【加密的C/S连接】GP支持SSL连接。
条件如下:
1.client和master server需要安装openSSL
2.设置master中postgresql.conf参数:ssl=on。当ssl模式开启时候,将会搜索master的数据目录包含的2个文件: server.key(server private key)和server.crt (server certificate)
23.GP是通过roles来管理数据的访问控制。Roles包含2个概念:Users和Groups。
一个role可以是一个数据库的user或group,也可以是两者兼备。Role能拥有数据库的对象(例如:tables),并且能够把访问数据库对象权限开放给其它的role。一个Role也可是另一个角色的成员,子role可以继承父role的权限。
(1)每个GP数据库系统可以说是数据库roles(users和groups)的集合。一般登入时默认使用操作系统当前用户登入。Roles被定义成系统级别,意味着在系统中他们能访问所有的数据库。
(2)【gpadmin用户】:在初始化数据库的时候,一般都使用gpadmin (既是操作系统用户,又是数据库的超级用户),它拥有数据库的最高权限。gpadmin的权限太大了,一定要控制好权限,只用来做一个数据库维护工作(如:数据库升级或扩展)。
(3)Role和User的区别:ROLE + LOGIN权限 = USER
(4)【创建Groups】
Role也是一个Group,使用GRANT和REVOKE来增加和删除role。
例如:
=# CREATE ROLE admin CREATEROLE CREATEDB;
=# GRANT admin TO john, sally;
=# REVOKE admin FROM bob;
可以针对独立对象权限进行授权:
=# GRANT ALL ON TABLE mytable TO admin;
=# GRANT ALL ON SCHEMA myschema TO admin;
=# GRANT ALL ON DATABASE mydb TO admin;
24.【查询计划】:查看Query Plan的时是从底至上的。
Motion --主要是涉及到多个节点之间完成任务的话,节点之间会发生数据移动。
Slice --GP在执行查询时为了获得最优性能,把任务进行了切片。一个查询计划是根据motion来进行切分的,每个slice以motion作为边界。
Redistribute Motion --Segment之间移动数据。这个是非常之消耗性能的。在前期表设计的时候就要避免这样的操作。
Gather Motion --Segment将数据传给Master。不是所有的查询计划都调用gather motion。例如:CREATE TABLE AS SELECT ...这个就没有gather motion,结果被存储到新表里面是不需要经过master的。
25.【并行查询】
Query Dispather(QD) --Master节点查询任务处理,负责创建和分配查询计划、收集传送最终结果
Query Executor(QE) --Segment节点查询处理,负责完成数据的计算、多个QE之间的中间结果通讯。为查询计划的每个slice会被分配到至少一个worker process
Gangs --工作于相同slice的查询计划的相关process。当一个slice任务完成后,这个gang会把数据向上级gang传递。内部通信是通过内部进程来控制的。
26.GP测试加载效率达到 每小时2TB。
27.【收费方式】
1. 按容量收费,1T起步,买的越多的话价格越便宜
2. 买一体机Data Computing Appliance (DCA),EMC的硬件和GP绑在一起卖的
28.关于interconnect冗余
为了保证网络高可用,需要部署2个千兆交换机。如果是线下测试环境的话,只要部署1个千兆交换机就行了。
Interconnect网络连接层作用:负责各segment节点进程通信,使用标准的千兆交换机。
数据传输缺省使用UDP协议。使用UPD时,GP会做额外数据包校验和对未执行的也会做检查。故在可靠性上,基本和TCP上是等价的,在性能和扩展性上,却优于TCP。
使用TCP的话,GP有1000个segment的限制,UDP则没有。
29.Greenplum数据库是在postgreSQL开发出来的,基于MPP(massively parallel processing)和shared-Nothing架构(Oracle RAC是shared everything架构)。
主要用在数据仓库中,做大规模数据和复杂的查询功能所涉及。
与现有的数据仓库解决方案(Oracle、IBM、Microsoft、Sybase和Teradata)相比有他自己的优势:1.速度更快 2.支持数据量更大,扩展性较好 3.价格更低
缺点:1.对局域网带宽要求很高,一般都是千兆交换机。2、不支持在线扩容,扩容的话至少要增加2台以上的机器。后若不是成2倍扩展,需要重新平均分布所有数据。