一、常用指令:
1.取端口号:select * from gp_segment_configuration
2.select * from pg_stat_activity 该表能查看到当前数据库连接的IP 地址,用户名,提交的查询等。
3.select pg_size_pretty(pg_relation_size('schema.tablename'));查看数据库占用空间
4.select pg_size_pretty(pg_database_size('databasename));查看表占用空间
5.Vacuum analyze tablename 回收垃圾和收集统计信息
6.Select gp_segment_id,count(*) from tablename group by 1 ;查看数据分布情况
7.gp_segment_configuration实例恢复
8.8.SELECT locktype, database, c.relname, l.relation, l.transactionid, l.transaction, l.pid, l.mode, l.granted, a.current_query FROM pg_locks l, pg_class c, pg_stat_activity a WHERE l.relation=c.oid AND l.pid=a.procpid ORDER BY c.relname;
主要字段说明:
relname: 表名
locktype、mode 标识了锁的类型
二、表分布
Hash分布:create table ... Distributed by(column1,column2...);同样数值的内容被分配到同一个segmment(如没有明确定义分布键,系统会把第一个字段作为分布键)
循环分布:create table ... Distributed randomly;
三、表相关:
1.创建表:CREATA TABLE 表名 DISTRIBUTED BY(表分布键); --指定分布键
CREATA TABLE 表名 DISTRIBUTED RANDOMLY --默认表的第一列作为分布键
【注:分布键设置类型不能为几何数据类型或用户自定义数据类型】
2.表和列的约束:check 表或列的约束
NOT NULL 列约束
UNIQUE 列约束【注:每表只能一个,被UNIQUE定义列会作为表分布键,如果表设置了主键则不允许有UNIQUE约束】
PRIMATY KEY 表约束
3.外部表:创建:CREATE EXTERNAL [WEB] TABLE
删除:DROPEXTERNAL [WEB] TABLE
4.表的存储模式:
存储模式:堆存储、只追加(AO)、行存储、列存储、压缩表(只可以是AO表)
创建堆表:CREATE TABLE 表名(a int ,b text) DISTRIBUTED BY (列名);
只追加表:CREATE TABLE 表名(a int ,b text) WITH(appendonly = true);
列存表:CREAT TABLE 表名(a int,b text) WITH(appendonly=true,orientation=列名) DISTRIBUTED BY(列名);没有指定orientation的为行存表
压缩表:CREATE TABLE 表名(a int,b text)
WITH(appendonly=true,compresstype=zilb,compresslevel=5); --创建一张5级ZLIB压缩的AO表
5.删除表
DDROP TABLE 表名;
DELETE FROM 表名; --不删除表但清空表中记录
TRUNCATE 表名 --不删除表单清空表中记录
6.表的分区策略(调优):以下因素大部分答案为也是,可通过分区策略提高查询性能
决定因素:(1)表是否足够大?(百万级或以上条记录)、
(2)对目前性能不满意?
(3)查询条件是否能匹配分区条件?(检查查询语句的where条件是否与考虑分区的column一致)
(4)数据仓库是否需要滚动历史数据?(可按照记录日期分区)
(5)按照某个规则数据是否可被均匀分拆?
创建分区表:通过使用start、end值、every子句定义分区增量实现自动产生分区
【注:start值总是被包含而end值总是被排除】
Eg:CREATE TABLE 表名(列1,列2......) DISTRIBUTED BY(列名)
PARTITION BY RANGE(分区键)
(START(分区键值1)INCLUSIVE
END(分区键值2)EXCLUSIVE
EVERY(INTERVAL ‘增量值’));
每个分区单独指定名称:
【注:每个分区范围是连续的则不需为每个分区指定END值】
Eg:CREATE TABLE 表名(列1,列2......) DISTRIBUTED BY(列名)
PARTITION BY RANGE(分区键)
(PARTITION 分区1名 START(分区键值1)INCLUSIVE,
PARTITION 分区2名 START(分区键值2)INCLUSIVE,
PARTITION 分区3名 START(分区键值3)INCLUSIVE,
......
END(分区键值n)EXCLUSIVE);
分区表限制:主键或唯一约束必须包含表上所有分区键。而唯一索引可不包含分区键
查看分区设计:SELECT partitionboundary,partitionablename,partitionlevel,partitionrank FROM pg_partitions WHERE tablename=’表名’;
添加新分区:ALRER TABLE表名 ADD PARTITION
START() INCLUSIVE
END() EXCLUSIVE;
删除分区:ALTER TABLE 表名DROP PARTITION FOR(RANK(partitionrank))
RABK(partitiontank)指范围分区同意层级中的顺序
清空分区数据:ALTER TABLE 表名 TRUNCATE PARTITION FOR(RANK(partitionrank));
三、视图和索引:
CREATE VIEW CRREATE INDEX
DROP VIEW DROP INDEX
使用索引需考虑:
1.查询工作负载:对于查询工作负载需返回大量数据的情况而言索引未必有效
2.压缩表:对于压缩数据而言,索引访问方法是解压需要的记录而不是全部解压
3.避免你在频繁更新列表上使用索引:会消耗大量写磁盘和CPU计算资源
4.创建选择性B-tree索引:选择性指数=DISTINCT值数量/表记录数,即表中重复记录越多,建立B-tree索引越有用(DISTINCT值在100到100000之间最佳,超100000之后不宜使用)
5.低选择性列上使用位图索引
6.索引列用于关联:或许可以改善join(关联)性能
7.索引列经常用在查询条件中:对大表来说,查询语句where条件中常用到的列可考虑使用索引
创建索引:
1.创建B-tree索引:CREATE INDEX 索引名 ON 表名(索引键);
2.创建位图索引:CREATE INDEX 索引名ON 表名 USING bitmap(索引键);
更新记录:UPDATE 表名 SET 赋值表达式 WHERE 查询条件;
删除记录:DELETE FROM 表名 WHERE 查询条件;