Postgresql 9.4 文档阅读笔记-第五章
记录阅读中在意的点
###字段约束: check、notnull、unique、primary key、reference 外键必须关联primary key 或者unique字段。这两种字段都带索引。 exclude约束???
###系统列 oid、tableoid、xmin、cmin、xmax、cmax、ctid。都是32位的字段。
###schema(架构) 类似操作系统中的目录,每个目录中有独立的table,view,function等,不冲突。 show search_path; 查看查找路径。
###表继承(inheritance) 约束:继承check,not null。不继承:unique, primary key, foreign key 可以多继承。
###分区(partitioning)
把大表拆分成小的物理块,查询数据集中在某几个分区时可显著提升性能。 当查询或者更新的数据涉及到某个分区中的大部分数据的时候,用连续扫描代替索引和随机访问。 可通过添加或删除分区进行大数据量的导入和删除操作。效率更高。 不经常使用的数据可被转义至廉价的存储设备上。
一般来说,当表的大小超过物理内存的大小的时候,需要分区。
Postgresql通过子表的方式支持分区。主表为空。
Postgresql支持两种分区模式:
范围分区:通过连续不重叠的key范围定义分区。 列表分区:明确确定分区中包含哪些key。
Postgresql分区实现方式:
通过主表->继承主表->约束,触发器 实现。
constraint exclusion
有效的优化分区性能的手段。 set constraint_exclusion = on; 通过检查check来优化效率,所以建分区表要加check。索引只是用于单个分区内部。
设置分区
也可通过rule。不过rule的性能比trigger低。主要在于查询方面。插入还好。大多数情况,trigger的性能好于rule。copy命令可用于trigger但是不能用于rule。
分区注意事项:
vacuum和analyze命令不会自动作用于分区,需要手动操作。 不要素以修改分区key列。
constraint exclusion注意事项:
保持简单的分区规则。例如简单的比较和范围判断。最佳实践是,比较可用使用b-tree索引的分区列。 数据库会检查所以的分区校验,所以分区数不要过多。不要过百。上千不可。