WhatsNew84
从 PostgreSQL wiki 中获取
跳转至导航跳转至搜索此页面被设计为供撰写文章、专题、宣传册或其他主张相关资料的人员使用的资源,旨在为他们概括介绍 PostgreSQL 8.4 中的一些新特性。分录格式如下:
- 特性
- 有什么作用和/或已做出哪些更改。
此外,这些项目已分为多个部分
- SQL,针对新 SQL 标准和查询功能
- 内建函数,针对新内建函数
- 过程,针对新函数、PL/pgSQL、触发器和其他类似功能
- 性能,针对与性能相关的功能。
- 管理,帮助你保持数据库的启用和运行的功能
- 监控,帮助你了解数据库中发生情况的工具
- 工具,用于改进 psql 和其他工具
- 第三方工具,未包含在核心服务器中,但在 8.4 周期中是新工具。
更多详情,请参见 8.4 发行说明
SQL
- 窗口函数
- 这些函数又被称为“窗口聚合”,允许你在数据子集中执行聚合操作,诸如计算数量、总和和等级。这意味着,多层次报表(曾经需要 3 或 4 个查询,甚至过程代码)现在可以使用单个查询生成。它也扩大了 PostgreSQL 可以支持的商业智能应用程序的数量。
- 公用表表达式及递归查询
- CTE 允许用户创建“已命名子查询”,然后可在所附加查询的其他子句中引用这些子查询。除了不必针对某些操作创建临时表外,CTE 最令人感兴趣的用法是对递归查询的用法,其中你可以使用单个查询高效地遍历树或图形结构。这对许多拥有树结构数据(诸如论坛、文件管理器和组织结构图)的应用程序而言非常有用。
- ALTER SEQUENCE RESTART 和 TRUNCATE TABLE RESTART IDENTITY
- 在更改数据库中的其他对象或清空表格时,更轻松、更安全地将自动编号序列重新开始于 1。
- ALTER VIEW 添加列
- 允许您将列添加到现有视图(在末尾),而无需重建视图依赖项。对列进行修改或删除仍需要重建依赖项。
- LIMIT(表达式或子查询)
- 现在,您可以使用计算表达式甚至子查询来限制查询返回的行数,而无需使用常量。这使得一个 VIEW 或存储过程更轻松地支持您的数据的多个动态页面显示。
- “AS”关键字可选
- 根据 SQL 规范,现在使用 “AS”关键字作为列别名是可选的。这将帮助从 MySQL 迁移的用户。
- SQL 标准间隔处理
- 支持 SQL 标准间隔年-月间隔(如 '1-2')和日期时间间隔(如 “select interval '1' day”)。
- TABLE 命令
- 根据 SQL 标准,“TABLE tablename”命令等同于 “SELECT * FROM tablename”。
- 不区分大小写的文本模块
- 这允许匹配查询匹配文本,无论其是大写还是小写,例如在管理电子邮件时非常方便。请注意,您必须安装该组件,然后使用新的数据类型 “citext”而不是 “text”或 “varchar”,但之后您无需编辑您的 SQL 查询。
- 全文搜索的部分匹配支持
- 允许搜索包含单词开头的文档
新的内置函数
- generate_subscripts() 函数
- 生成下标以支持更简单的数组遍历。您过去可以与 generate_series 及 array_upper 和 array_lower 一同完成此操作,但此新版本应该更容易使用,且速度也更快。
- 基于时间的 generate_series() 函数
- generate_series() 是万用 SQL 循环技巧,现在它可以在两个日期间循环,而不仅仅是在两个整数间循环。
- quote_nullable()
- 在函数中构建 SQL 字符串以在 EXECUTE 中使用时,添加 NULL 文本表示很不方便。现在,您可以仅调用 quote_nullable(),PostgreSQL 将为您负责
- suppress_redundant_updates_trigger()
- 此经过仔细编码的 C 触发器将检测何时要 UPDATEd 元组没有任何变化,如果是这种情况,它将阻止 PostgreSQL 执行任何其他触发器。这将允许您的应用在您有昂贵的触发器(或基于触发器的复制)时停止优化 UPDATE,系统将为您执行此操作。
- array_agg() 函数
- 此自定义聚合函数位于文档中,其更快的版本现在包含在内。它支持很多技巧,基本上此函数通过累积一组中的所有值创建一个数组,类似于 sum() 和 count()。
- unnest() 函数
- 你现在已经将行累积到一个单一数组中,而你想做相反的事情,即看待数组的每个元素作为一行。Unnest() 是执行此操作的标准函数名称。
过程
- 变参参数
- 允许编写具有可变数量参数的存储过程。这使得在解释型语言(Perl、Python、Ruby 和 Tcl)中编写存储过程变得更简单、更自然。它还有助于基于存储过程的应用程序的变更管理。
- 默认参数
- 允许定义用户未提供的存储过程参数的默认值。这使得存储过程变更管理以及将数据库应用程序从 SQL Server 和 Sybase 移植变得非常容易。
- PL/pgSQL 中的 CASE 控制结构
- PL/pgSQL 中不再有 IF .. ELSIF .. ELSIF .. ELSIF;我们现在有合适的转换 CASE 语句,它允许你根据将值与条件列表进行比较来执行代码。
- 用于 PL/pgSQL 函数的 RETURNS TABLE
- RETURNS SETOF tabletype 或复杂 OUT 参数的 SQL 标准快捷方式。让编写像表一样运行的存储过程变得更快,返回行集。
- PL/pgSQL 中 RAISE 命令中的 HINT、DETAIL 和 SQLSTATE
- 输出其他错误信息,以便更容易调试 PL/pgSQL 存储过程,或增强应用程序中的错误控制。
- PL/pgSQL 中的 RETURN QUERY EXECUTE 支持
- 想要返回动态创建查询的所有结果?那么,你无需再手动遍历结果集了。
- 用于 PL/pgSQL 的 EXECUTE USING
- 现在动态执行查询比以往任何时候都更容易,支持参数。不需要手动将值连接起来,而是将查询字符串中的参数命名为 $1 等,并在 USING 子句中告知它们的值。
- 允许在 SELECT 子句中调用返回集合的 PL/pgSQL 函数
- 当你希望针对另一个函数的结果调用函数 g 时,这非常方便:SELECT g(y) FROM (SELECT f(x) FROM t) as sub(y);
- 对 TRUNCATE 命令的支持语句级触发器
- 主要用途肯定是为了支持传播你的 TRUNCATE 的附加复制解决方案,但是你还可以使用这个触发器在删除分区时触发一些特殊处理,例如:
性能
- 用于 DISTINCT/UNION/INTERSECT/EXCEPTION 查询的哈希方法
- 以前,distinct 这样的操作需要 Postgres 分类然后清除数据来达到独特的目标。现在 PostgreSQL 可以使用基于哈希的方法(类似于按组进行分类)来实现这些目标。这应该让很多查询更快,而不需要任何改动。
- Cursor_tuple_fraction GUC
- 告诉计划人员对于给定的光标查询,你希望光标结果的哪一部分返回。这允许计划人员根据你期望返回的行百分比估算值使用更优化的计划。
- default_statistics_target 和列统计更改
- 经过广泛测试,我们已将计划器统计信息的默认统计样本大小提高到 100,这在简单查询和复杂查询所需统计信息之间取得了更好的平衡。为了支持大型数据仓库,我们还将统计信息的上限提高到了 10,000。
管理
- 数据库级排序规则
- 字符排序规则(事物排序的顺序)现在是一个数据库,而不是一个安装属性。这允许用户在一个 PostgreSQL 安装中轻松地充分支持多种语言,同时也为 PostgreSQL 后续版本中的逐列排序规则铺平了道路。
- 可见性映射
- 一个内存寄存器,可以跟踪多个事务弄脏的数据页。最重要的是,这允许 VACUUM 仅读取真正需要清理的数据页,而不是整个表,导致对大表的所需清理大幅减少。此外,还为将来对不经常更新的表进行仅限索引的访问铺平了道路。
- 自动调整自由空间映射
- 难道你不想保留那个 max_fsm_pages 设置吗?好吧,现在没了。自由空间映射现在存储在磁盘上,而不是共享内存中,这意味着它始终会显示表中的所有可用空间。
- 使用 ALTER TABLE / SET 自动清理表配置
- 您不再需要插入到 pg_autovacuum 目录中来更改自动清理的每个表设置。这让它更易于使用。作为一种奖励,您设置的值将由 pg_dump 保存。
- 定时执行 PgBench
- 您现在可以询问 pgbench 在已知时间内可以做多少事情,而不是需要多长时间才能完成这么多事情。不同之处主要在于组织测试和分析结果:在此时间内运行了多少个查询更容易进行比较。
- pg_conf_load_time() 函数
- 您不必猜测 postgresql.conf 文件是否比 PostgreSQL 运行的版本更新:将它的修改时间与 pg_conf_load_time() 的结果进行比较。
- EXPLAIN VERBOSE 列级输出
- 以前这会公开只有少数人能受益于读取的内部数据。现在它会告诉您一些有用的信息,例如每个节点将哪些列输出到它的父级,这会显示出 SELECT * 不好的程度。
- 报告参与死锁错误的所有查询
- 这样您不必从日志中猜测:信息就在那里
- pg_settings 目前显示具有已定义设置的 guc 的可用选项
- 许多设置都接受值枚举,pg_setting 向您显示了这一点。
- pg_stat_statements 帮助模块
- 此模块将用有关 SQL 语句的定时信息填写一个视图,可以跟踪从过程中内部运行的查询。这是一个集成的分析工具!
- 改进的 SSL 证书处理
- SSL 连接现在可以通过验证证书防止中间人攻击。
- 多列 GIN 索引
- pgstat 临时文件
- 在使用率很高的安装中,此文件本身即可负责大量的 IO。在 8.4 版中,其使用已减少,而且还可轻松将其搁置在 RAM 文件系统或类似文件系统中。
- pg_hba.conf 名称=值语法
- pg_hba.conf 用户映射
安全 & 连接
- 列权限
- DBA 现在可以授予对特定列和整个表的权限(SELECT、UPDATE)。这使保护数据库中的敏感数据变得更加容易。
- SSL 认证
- 用户现在可以使用 SSL 证书进行认证,DBA 可以定义对特定 SSL 证书的访问控制。
监控
- pg_stat_statements(contrib 模块)
- 允许对汇总查询统计信息进行实时监控,让你一目了然地看到哪个经过规范化的查询执行频率最高、使用系统时间最长。pg_stat_statement 将“错误查询”故障排除流程的速度提高一个数量级。
- auto_explain(contrib 模块)
- 让你自动将选定的 EXPLAIN 计划记录到 PostgreSQL 日志中,以便稍后分析。这将在故障排除速度慢的存储过程以及生产环境和测试环境中执行不同的查询时提供很大帮助。还允许记录嵌套语句的 EXPLAIN 计划,即在函数内执行的语句。
- pg_stat_user_functions
- 此系统视图跟踪访问每个函数的次数,以及在函数内和嵌套函数调用中花费的总体执行时间。存储过程应用程序的管理员现在将能够明确识别其最慢的存储过程。
工具
- 并行恢复
- pg_restore 现在可以在并行处理模式下运行,并在几个并行流中加载数据和创建数据库对象。根据你的硬件和数据库设计,这能让数据库备份文件的恢复速度比单进程恢复提高两到八倍。8.4 版的并行恢复还可用于恢复 8.3 或 8.2 版数据库。
psql 改进
- 改进了 psql 中换行符和制表符的长行处理
- 当你在提示符下输入查询时,非常讨厌查询超出单行的情况,因为交互式 shell 不适用于这种情况。不过,psql 不存在此问题,而且功能越来越强大。
- psql 中的列存储类型显示
- 改进了 psql 中的序列显示
- 序列是指“自动递增”数字列(整数或大整数)下的关系,现在的显示方式会让你更加满意。
- 对 psql 中的 \timing 更好地控制
- 想知道你的查询处理和结果检索需要多长时间吗?很简单,在提示符中输入 \timing。等等,你现在在处于脚本中,不想关闭它?在 8.4 中,只需 \timing on 然后不用理会。
- 现在更容易知道一个枚举类型中有哪些值。
- 在 psql 中添加表大小显示
- 使用 \dt+ 可以告诉你表占用了多少磁盘空间,让你不用调用 pg_relation_size()。这还没有包括辅助表和索引。
- 在 psql 中添加 \d 输出的对引用表显示
- 了解有哪些外键指向你正在查看的表非常有用!
- 为 psql 中的 \l 添加表空间和数据库大小信息
- 改进了对多个模式中表的选项卡补全支持
- 从 psql 中的 \dX 命令中删除系统对象
- 还记得上次你想列出你的函数然后输入了 \df 吗?屏幕满是 pg_catalog 函数。现在这种情况不复存在了,8.4 将只会显示你自己的函数,添加 X 可以让系统函数返回列表!
- 为 psql 中的函数编辑添加 \ef
- \ef <functionname> 将在你的编辑器中显示一个函数定义,以便你可以在服务器上编辑函数。
第三方工具
- pg_migrator
- 此测试版工具允许就地将数据库从 8.3 升级到 8.4,无需转储和重新加载的停机时间。目前对全文索引和某些 Contrib 模块存在一些限制。