Bitmap位图索引:适合只有几个固定值的列;如性别,婚姻状况,它会通过对该列的几个固定值构建出向量,之后在where条件中通过固定值对应的向量返回值
第二章 greenplum快速入门
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:
Insert, update和delete
- Insert:执行insert语句时,要留意分布键不要为空,否则分布键默认会变成null,数据都被保存在一个节点上,造成数据分布不均
2)update:不能批量对分布键执行update,因为对分布键执行update要将数据重分布,而greenplum暂时不支持;换句话说,update不能在分布键上执行
3)delete:若delete操作涉及子查询,且子查询结果还涉及重分布,这样删除语句会报错
若对整张表执行delete比较慢,建议使用truncate;另外,用delete删除数据在master的数据字典上并没有删除,只是被标记删除;故可用vacuum对master里的数据字典进行释放。
Truncate: 执行truncate直接删除表的物理文件,然后创建新的数据文件;truncate比delete操作在性能上有非常大提升,但若有sql正在操作这张表,则truncate会被锁住,直到表上资源释放。
常用数据类型
- 数值类型
- 字符类型
- 时间类型
常用函数
- 字符串函数
- 时间函数
- Interval表示时间间隔的一种数据类型,利用这种数据类型可实现时间的加减,两个时间的时间差就是interval类型
- 数值计算函数
- 其他常用函数
1) 序列号生成函数——generate_series
生成多行数据,从一个数字(start)到另外一个数字(end)按照一定间隔,默认是1,生成一个结果集。 - 2)字符串列转行函数——string_agg
- 3)字符串行转列——regexp_split_to_table
2.3.6 分析函数
执行sum,count和avg这类聚集函数时,加不加order by是不同的;不加order by所有结果都一样,都是根据partition by进行聚合,而加了order by,则是根据排序的字段递增的。
Grouping sets
2.3.8 外部表
Gpfdist:greenplum并发加载的工具
外部表:一张表数据指向数据库外的数据文件的;
Greenplum中,我们可对一个外部表执行正常的dml操作,外部表支持在segment上并发地高速从gpfdist导入数据。
注:这里感觉类似sql server里的bulk insert
外部表要指定gpfdist的IP和端口,还有详细目录地址。
在创建外部表时可指定分隔符,err表,指定允许出错的数据条数,及源文件的字符编码等
Copy命令(有点类似sql server里的bulk copy)
使用copy命令可实现文件导出和导入,不过要通过master,效率没有外部表高,但在数据量比较小时,copy命令比外部表要方便。
如需将数据远程导出到其他机器,可用copy to stdout,远程执行psql连接到数据库上,然后通过管道将数据重定向成文件。