digoal
2017-03-23
PostgreSQL , MySQL , Oracle
去O从互联网逐渐蔓延到传统企业,但是MySQL适合传统企业吗?来听听某些传统用户的心声。
某些传统企业也想学互联网去O的思路,复制互联网的去O神话,但是他们自己调研了一下MySQL之后,发现这种想法并不科学。
这些弊端在PostgreSQL中并不存在,还增加了许多特性可以帮助企业降低开发量。这几年PG在国内的应用越来越多,大到BAT、银行、运营商等,小到各个行业的ISV,人才需求旺盛。
PostgreSQL 优化器对子查询的支持很好,支持固定子查询,提升子查询,条件上推和下推等等。
PostgreSQL 对复杂查询处理能力与Oracle类似。
PostgreSQL 查询优化器很成熟,支持query rewrite, hash join, merge join, nestloop join, HINT, 遗传优化, 固化JOIN顺序, seqscan, indexscan, bitmapscan, indexonlyscan, ctidscan, bitmapand, bitmapor, subqueryscan, material, hashagg, groupingagg, sortagg, union, expect, intersect, mergesort, parallel等手段。
PostgreSQL 支持DDL,DML审计,支持按用户,按数据库配置审计级别,支持通过HSTORE实行记录级审计。
PostgreSQL 支持plpgsql存储过程语言,与PL/SQL功能高度相似。
PostgreSQL 支持DML+TRUNCATE行、表级触发器,支持before, after触发器,支持延迟触发器。
PostgreSQL 支持DDL事件触发器。
PostgreSQL 支持规则。
PostgreSQL 支持将DDL封装在事务中,支持DDL的回滚操作。
PostgreSQL 支持timestamptz,timetz,精确到十万分之一秒。
PostgreSQL 支持interval类型表示时间间隔。
PostgreSQL plpgsql功能与PL/SQL类似,可以用来编写存储过程,函数,触发器,等。
PostgreSQL 通过HSTORE可以实现重点表的flashback,粒度精确到事务级别。
PostgreSQL 支持前滚的时间点恢复。
PostgreSQL 对约束的支持很好,是根据SQL标准来实现的,与Oracle一致。包括外键,CHECK约束,主键,排他约束,等。
PostgreSQL 执行计划的输出粒度分为多个级别
analyze -- 执行并输出实际的COST,时间信息
verbose -- 输出详细信息
costs -- 输出执行树中每个NODE的评估成本
buffers -- 输出包括shared buffer, local buffer, temp buffer在内的命中块数,未命中块数
timing -- 输出IO时间,CPU时间等
PostgreSQL 还支持DEBUG输出更详细的信息。
PostgreSQL 支持SQL标准的所有连接方式,包括nestloop, hashjoin , merge join在内。
PostgreSQL 支持多个索引联合使用,使用bitmapAnd, bitmapOr,自动合并索引。
PostgreSQL 支持8种索引,包括Btree, hash, gin, gist, sp-gist, brin, rum, bloom。
其中
gin用于多值类型(包括数组、全文检索类型等)。
gin还可用于倒排,多列聚集,一个GIN索引可以支持任意列的组合查询。
hash用于超长字段的索引。
gist, spgist用于异构数据的索引(例如地理位置、图像、基因、化学分子等)。
brin用于线性相关的数据索引,块级索引,非常小,类似Oracle一体机的块级索引。
rum, 相似度索引,用于全文检索类型,支持相似度的查询。
bloom索引,用于多列的布隆过滤。
PostgreSQL 支持外键。
PostgreSQL 支持绑定变量,执行计划缓存。执行计划是会话级别,好处是同一个SQL被高并发调用时,没有Oracle shared_pin的问题。
PostgreSQL 是进程级模型,与Oracle dedicate模式一样。
可以控制会话的work_mem, 临时文件大小,临时文件数量等。
通过cgroup也可以控制单个用户进程的cpu, iops, network, memory等开销。
PostgreSQL 支持函数索引。
PostgreSQL 支持物化视图,支持物化视图增量更新。
PostgreSQL 支持序列。支持字段自动填充序列值。
PostgreSQL 支持DDL封装在事务中,执行DDL不会导致事务自动提交。
PostgreSQL 多表连接,会根据连接字段和条件等,自动优化JOIN顺序,自动选择JOIN方法(nestloop,mergejoin or hash join).
PostgreSQL alter table add column只需要修改元数据,不需要导表,不管多大的表都可以瞬间完成。
您的愿望将传达给PG kernel hacker、数据库厂商等, 帮助提高数据库产品质量和功能, 说不定下一个PG版本就有您提出的功能点. 针对非常好的提议,奖励限量版PG文化衫、纪念品、贴纸、PG热门书籍等,奖品丰富,快来许愿。开不开森.