Bitmap位图索引:适合只有几个固定值的列;如性别,婚姻状况,它会通过对该列的几个固定值构建出向量,之后在where条件中通过固定值对应的向量返回值

greenplum 的openssl版本 greenplum 使用_执行计划


第二章 greenplum快速入门

greenplum 的openssl版本 greenplum 使用_数据_02


Master主机与segment主机对比

 Master主机

1) 建立与客户端会话连接和管理

2) Sql解析并形成分布式执行计划

3) 将生成好的执行计划分发到每个segment上执行

4) 收集segment执行结果

5) Master不存储业务数据,只存储数据字典

6) Master主机可一主一备,分布在两台机器上

7) 为提高性能,master最好单独占用一台机器

 Segment主机

1) 业务数据存储和存取

2) 执行由master分发的sql语句

3) 对master而言,每个segment都是对等的,负责对应数据的存储和计算

4) 每台机器可配置一到多个segment

5) 由于每个segment都是对等的,建议采用相同的机器配置

6) Segment分primary和mirror两种,一般交错的存放在子节点上

Master和segment都是一个单独的postgreSQL数据库;每一个都有自己单独的一套元数据字典;master节点一般也叫主节点,segment也叫数据节点。

Pg_class每个节点都有,故如果在master上查询pg_class,不用连接segment,所以当segment没有连上master时,不会报错;但是生成分布式执行计划,master需要与segment进行交互,所以此时若一个segment无法连接master时,会报错。

Greenplum数据分布
Greenplum将postegreSQL改成一个分布式数据库,其中,segment节点都是一个单独的postgreSQL数据库,master本身也是一个postegreSQL数据库;
 Master本身不存储数据,所有数据都被拆分保存到每个节点。
 在指定分布键时,数据按分布键的hash值来分布数据,称为哈希分布。
 还有一种分布不指定分布键,数据随机分布到每个节点,称作随机分布(也叫平均分布)

Hash分布:指定一个或多个分布键,计算hash值;如不指定分布键,会默认将第一个字段作为分布键
随机分布:也叫平均分布,数据随机分散在每个节点,无论数据时什么内容,都会平均分布在每个节点上,但在执行sql过程中,关联等操作都要将数据重分布,性能较差。

Greenplum的数据切分放在所有segment上,当从一个表查询数据时,master数据展现顺序是以master先接收到的数据的殊勋,每个segment数据到达master顺序是随机的,不是固定的。

Create table as和select into
Create table as与select into有一样的功能,即都使表直接执行select结果创建出一个新的表;
区别:
Create table as在创建一个表时若默认不指定分布键,则greenplum根据执行select得到的结果集来选择不用再次重分布数据的字段作为表的分布键,另外,它也能指定分布键
 Select into更简单,虽然功能一样,但执行select into不能指定分布键,只能使用默认的分布键

Explain:用来查询一个表的执行计划,在sql优化时会经常用到;执行计划的查看方法是从最右边开始查看。

Ex:

greenplum 的openssl版本 greenplum 使用_外部表_03


greenplum 的openssl版本 greenplum 使用_执行计划_04

Insert, update和delete

  1. Insert:执行insert语句时,要留意分布键不要为空,否则分布键默认会变成null,数据都被保存在一个节点上,造成数据分布不均

    2)update:不能批量对分布键执行update,因为对分布键执行update要将数据重分布,而greenplum暂时不支持;换句话说,update不能在分布键上执行

    3)delete:若delete操作涉及子查询,且子查询结果还涉及重分布,这样删除语句会报错

    若对整张表执行delete比较慢,建议使用truncate;另外,用delete删除数据在master的数据字典上并没有删除,只是被标记删除;故可用vacuum对master里的数据字典进行释放。

Truncate: 执行truncate直接删除表的物理文件,然后创建新的数据文件;truncate比delete操作在性能上有非常大提升,但若有sql正在操作这张表,则truncate会被锁住,直到表上资源释放。

常用数据类型

  1. 数值类型
  2. 字符类型
  3. 时间类型

greenplum 的openssl版本 greenplum 使用_数据_05


常用函数

  1. 字符串函数
  2. greenplum 的openssl版本 greenplum 使用_数据_06

  3. 时间函数
  4. greenplum 的openssl版本 greenplum 使用_数据_07

    greenplum 的openssl版本 greenplum 使用_数据_08

  5. Interval表示时间间隔的一种数据类型,利用这种数据类型可实现时间的加减,两个时间的时间差就是interval类型
  6. 数值计算函数
  7. greenplum 的openssl版本 greenplum 使用_执行计划_09


  8. greenplum 的openssl版本 greenplum 使用_数据_10

  9. 其他常用函数
    1) 序列号生成函数——generate_series
    生成多行数据,从一个数字(start)到另外一个数字(end)按照一定间隔,默认是1,生成一个结果集。
  10. greenplum 的openssl版本 greenplum 使用_数据_11

  11. 2)字符串列转行函数——string_agg
  12. greenplum 的openssl版本 greenplum 使用_执行计划_12

  13. 3)字符串行转列——regexp_split_to_table
  14. greenplum 的openssl版本 greenplum 使用_数据_13

2.3.6 分析函数

执行sum,count和avg这类聚集函数时,加不加order by是不同的;不加order by所有结果都一样,都是根据partition by进行聚合而加了order by,则是根据排序的字段递增的。

greenplum 的openssl版本 greenplum 使用_执行计划_14


greenplum 的openssl版本 greenplum 使用_执行计划_15

Grouping sets

greenplum 的openssl版本 greenplum 使用_外部表_16


greenplum 的openssl版本 greenplum 使用_执行计划_17


greenplum 的openssl版本 greenplum 使用_执行计划_18

2.3.8 外部表

greenplum 的openssl版本 greenplum 使用_外部表_19

Gpfdist:greenplum并发加载的工具

外部表:一张表数据指向数据库外的数据文件的;

Greenplum中,我们可对一个外部表执行正常的dml操作,外部表支持在segment上并发地高速从gpfdist导入数据。

注:这里感觉类似sql server里的bulk insert

greenplum 的openssl版本 greenplum 使用_执行计划_20


greenplum 的openssl版本 greenplum 使用_外部表_21

外部表要指定gpfdist的IP和端口,还有详细目录地址。

在创建外部表时可指定分隔符,err表,指定允许出错的数据条数,及源文件的字符编码等

Copy命令(有点类似sql server里的bulk copy
使用copy命令可实现文件导出和导入,不过要通过master,效率没有外部表高,但在数据量比较小时,copy命令比外部表要方便。

如需将数据远程导出到其他机器,可用copy to stdout,远程执行psql连接到数据库上,然后通过管道将数据重定向成文件。