E.226. 版本 6.5

发布日期: 1999-06-09

这个版本标志着开发队伍对从伯克利继承过来的代码的掌握和理解达到了一个新的阶段。 你将看到现在我们更容易增加新的特性,这些得益于我们全世界开发队伍的不断壮大和经验的不断丰富。

下面是一些最引人注意的改变的简介:

多版本并行控制(MVCC)

这个东西废止了我们老式的表级别的锁,取而代之的是一个比大多数商用数据库系统都先进的锁系统。 在传统的系统里,每行的修改是先锁住,直到提交,以此避免被其他用户读取。 MVCC 利用 PostgreSQL 天生的多版本特性允许读者在写活动中继续读取一致的数据。 写入者继续使用紧凑的 pg_log 事务系统。所有这些都是在不需要为每行分配一个锁 (像传统的数据库系统那样)的情况下进行的。 因此,基本上我们不再受制于简单的表级别锁; 我们有比行级别锁更好的技术。

pg_dump 的热备份

pg_dump 利用了新的 MVCC 特性, 可以在数据库保持在线和可以执行查询的情况下,进行一致的数据转储/备份。

数值数据类型

我们现在有了真正的数值数据类型,可以由用户定义精度。

临时表

我们保证临时表在一次数据库会话过程中唯一,并且在会话结束时删除。

新的 SQL 特性

我们现在有了 CASE,INTERSECT 和 EXCEPT 语句支持。我们有了新的 LIMIT/OFFSET, SET TRANSACTION ISOLATION LEVEL,SELECT ... FOR UPDATE 和一个改进了的 LOCK TABLE 命令。

提速

感谢我们队伍里的许多聪明的头脑,我们继续给 PostgreSQL 提速。 我们加速了存储器分配,优化,表联合以及行传输过程。

端口

我们继续扩展我们的端口列表,这回包括了 Windows NT/ix86 and NetBSD/arm32

界面

大多数界面有了新的版本,现有的功能也被改进了。

文档

在这个文档里所有地方都有新的和更新了的内容。 新的 FAQ 已经分配到了 SGIAIX 平台。 教程里包含了来自 Stefan Simkovics 的关于 SQL 的介绍性信息。对于用户手册,我们包括了关于 postmaster 和更多工具程序的参考内容, 还有一个描述日期时间详细特性的附件。管理员手册 包含了一个 Tom Lane 的新的关于错误分析的章节。程序员手册 包括了 Stefan 写的查询处理的描述,以及通过匿名 CVSCVSup获取 PostgreSQL 源码树的详细内容。

E.226.1. 迁移到版本 6.5

要想从以前的 PostgreSQL 版本迁移到新的版本, 我们需要用 pg_dump 进行转储/恢复的工作。 不能pg_upgrade 升级到这个版本, 因为和以前版本相比,表在磁盘上的(存储)结构已经经过修改了。

新的多版本并发控制(MVCC)特性在多用户环境里可能有一些不同的表现。 阅读并理解下面段落,确保你现有的应用将表现出你所希望的特性。

E.226.1.1. 多版本并发控制

因为不管事务的隔离级别是什么,6.5 里的读动作不锁定数据, 一个事务读的数据可能被其他事务覆盖。换句话说,如果 SELECT 返回了一行并不意味着该行在被返回的时候(也就是说在语句或者事务开始后的某个时间)真正存在, 也不意味着在当前事务做提交或者回滚之前该行被保护免于被并行事务删除或者修改。

要保证一行的确实存在并且保护它免于被并行更新,我们必须使用 SELECT FOR UPDATE 或一个合适的 LOCK TABLE 语句。我们在从以前的 PostgreSQL 和其他环境移植应用时必须考虑这一点。

如果你正用 contrib/refint.* 触发器保证参考完整性, 你就必须记住上面几条。现在还需要额外的技巧。一个方法是: 如果一个事务准备更新/删除一个主键时,使用 LOCK parent_table IN SHARE ROW EXCLUSIVE MODE 命令, 如果一个事务准备更新/插入一个外键时使用 LOCK parent_table IN SHARE MODE 命令。

注意: 要注意如果你运行一个处于 SERIALIZABLE 模式下的事务,在该事务里, 你必须在执行任何 DML 语句 (SELECT/INSERT/DELETE/UPDATE/FETCH/COPY_TO) 之前执行上面提到的 LOCK 命令。

这些不便将在今后我们实现了读脏(未提交)数据的能力(不管什么隔离级别)和真正的参考完整性后消失。

E.226.2. 修改列表

Bug 修复
---------
修复 text<->float8 和 text<->float4 转换函数(Thomas)
修复带有混合约束的情况创建表 (Billy)
改变 exp()/pow() 的行为以在下溢/溢出时产生错误 (Jan)
修复 pg_dump -z 中的 bug
内存溢出清理 (Tatsuo)
修复 lo_import 崩溃 (Tatsuo)
调整数据类型名的处理以抑制双引号 (Thomas)
使用类型转换匹配字段和 DEFAULT (Thomas)
修复死锁,这样它只在一秒钟的休眠之后检查一次 (Bruce)
修复聚合和 PL/pgsql (Hiroshi) 
修复子查询崩溃 (Vadim)
修复 libpq 函数 PQfnumber 和大小写敏感的名字 (Bahman Rafatjoo)
修复大对象的 write-in-middle,没有额外的阻塞、内存消耗 (Tatsuo)
修复 pg_dump -d 或 -D 和在 INSERT 中引用特殊字符
修复 dynahash 的严重的问题 (Tom)
修复 INET/CIDR 可移植性问题
修复 ALTER TABLE ADD COLUMN 中的可选择性错误问题 (Bruce)
修复执行器使不同字段类型的合并连接能够工作 (Tom)
修复 Alpha OR 选择性 bug
修复 OR 索引选择性问题 (Bruce) 
修复 so \d 显示 char()/varchar() 的固有长度 (Ryan)
修复教程代码 (Clark)
提高 destroyuser 检查 (Oliver)
修复 Kerberos (Rodney McDuff)
修复当缓冲区脏了时删除数据库 (Bruce)
修复 nextval() 序列可以大小写敏感 (Bruce)
修复 !!= 运算符
在破坏数据库文件之前删除缓冲区 (Bruce)
修复执行器估算函数两次的情况 (Tatsuo)
允许序列的下一行动作大小写敏感 (Bruce) 
修复优化器索引不为负数工作 (Bruce)
修复 fjIsNull 执行器内的内存泄露
修复聚合的内存泄露 (Erik Riedel)
允许用户名包含一个破折号来授予权限
清理 inet 类型中的 NULL
清理系统表 bug (Tom)
修复 PAGER 和 \? 命令的问题 (Masaaki Sakaida)
降低缺省多段文件大小限制为 1GB (Peter)
修复 CREATE OPERATOR 的转储 (Tom)
修复游标的向后扫描 (Hiroshi Inoue) 
修复使用 \i 时的 COPY FROM STDIN (Tom)
修复在一个表达式之内比较的 subselect (Jan)
修复返回行时错误报告的处理 (Tom)
修复参考数组类型的问题 (Tom,Jan)
阻止 UPDATE SET oid (Jan)
修复 pg_dump 使 -t 选项可以处理大小写敏感的表名
修复特殊情况下的 GROUP BY (Tom, Jan)
修复失败查询中的内存泄露 (Tom)
DEFAULT 现在支持混合情况的标识符 (Tom)
修复 DROP/RENAME 表、索引的多节的使用 (Ole Gjerde) 
使用 -o 和 -d 选项禁用 pg_dump 的使用 (Bruce)
允许 pg_dump 适当的转储组权限 (Bruce)
修复 INSERT INTO table SELECT * FROM table2 中的 GROUP BY (Jan)
修复视图中的计算 (Jan)
修复数组索引上的聚合 (Tom)
修复在需要太多引号的值内 DEFAULT 处理单引号
修复非超级用户导入/导出大对象的安全问题 (Tom)
回滚创建表被适当的清理的事务 (Tom)
修复允许大表和字段名产生适当的序列名 (Tom) 

增强
------------
添加 "vacuumdb" 工具
通过更好的分配存储器加速 libpq (Tom)
EXPLAIN 所有使用的索引 (Tom)
实现 CASE, COALESCE, NULLIF 表达式 (Thomas)
新增 pg_dump 表输出格式 (Constantin)
添加字符串 min()/max() 函数 (Thomas)
扩展新的类型强制转换技术到聚合中 (Thomas)
新增 moddatetime 贡献包 (Terry)
升级到 pgaccess 0.96 (Constantin)
为单字节 "char" 类型添加例程 (Thomas) 
改善 substr() 函数 (Thomas)
改善多字节处理 (Tatsuo)
多版本并发控制/MVCC (Vadim)
新增序列化模式 (Vadim)
修复超过 2gigs 的表 (Peter)
新增 SET TRANSACTION ISOLATION LEVEL (Vadim)
新增 LOCK TABLE IN ... MODE(Vadim)
升级 ODBC 驱动程序 (Byron)
新增 NUMERIC 数据类型 (Jan)
新增 SELECT FOR UPDATE(Vadim) 
处理输入值的 "NaN" 和 "Infinity" (Jan)
改善日期/年的处理 (Thomas)
改善后端连接的处理 (Magnus)
为大文件新增 ELOG_TIMESTAMPS 和 USE_SYSLOG 选项 (Massimo)
新增 TCL_ARRAYS 选项 (Massimo)
新增 INTERSECT 和 EXCEPT (Stefan)
为主键跟踪新增 pg_index.indisprimary (D'Arcy)
新增 pg_dump 选项以允许在创建之前删除表 (Brook)
加速行输出例程 (Tom)
新增 READ COMMITTED 隔离级别 (Vadim) 
新增 TEMP 表/索引 (Bruce)
如果结果已经排序那么阻止排序 (Jan)
新增内存分配优化 (Jan)
允许 psql 做 \p\g (Bruce)
允许多重的规则动作 (Jan)
添加了 LIMIT/OFFSET 功能 (Jan)
改善了连接大量的表时的优化器 (Bruce)
新增简介到 SQL,来自 S. Simkovics 的硕士论文 (Stefan, Thomas)
新增简介到后端处理,来自 S. Simkovics 的硕士论文 (Stefan)
改进了 int8 支持 (Ryan Bradetich, Thomas, Tom) 
新增转换 int8 和 text/varchar 类型的例程 (Thomas)
在连接了 meta-tables 的地方新增了严密的规划 (Bruce)
缺省启用右边的查询 (Bruce)
允许在配置时设置后端可靠的最大数目(--with-maxbackends and postmaster switch (-N backends)) (Tom)
GEQO 因为优化器加速现在缺省为 10 个表 (Tom)
为了 MS-SQL 可移植性允许 NULL=Var (Michael, Bruce)
修改贡献包 check_primary_key(),因此都 "自动的" 或 "依赖的" (Anand)
允许 psql 在一个视图上 \d 显示查询 (Ryan)
为 LIKE 加速 (Bruce) 
Ecpg 修复/特性,查阅 src/interfaces/ecpg/ChangeLog 文件 (Michael)
JDBC 修复/特性,查阅 src/interfaces/jdbc/CHANGELOG (Peter)
使 % 运算符和 / 一样有优先级 (Bruce)
添加新的 postgres -O 选项,允许改变系统表结构 (Bruce)
更新 contrib/pginterface/findoidjoins 脚本 (Tom)
主要的加速在于 vacuum 的删除带有索引的行 (Vadim)
允许非 SQL 函数运行基于参数的不同版本 (Tom)
添加 -E 选项显示由 \dt 和朋友们发送的实际查询 (Masaaki Sakaida)
为 psql 在启动标题中添加版本号 (Masaaki Sakaida)
新增 contrib/vacuumlo 删除没有引用的大对象 (Peter)
新增初始化表的大小,这样非真空的表执行的更好 (Tom)
改善拒绝连接时的错误消息 (Tom)
支持数组的 char() 和 varchar() 字段(Massimo)
彻底检修哈希码以增强可靠性和性能 (Tom)
升级到 PyGreSQL 2.4 (D'Arcy)
改变调试选项 so -d4 和 -d5 产生不同的节点显示 (Jan)
新增 pg_options: pretty_plan, pretty_parse, pretty_rewritten(Jan)
系统表访问的更好的优化统计 (Tom)
非缺省块大小的更好的处理 (Massimo)
改进 GEQO 优化器内存消耗 (Tom)
UNION 现在支持不在目标列表中的字段的 ORDER BY (Jan)
改进了主要的 libpq++ (Vince Vielhaber)
pg_dump 现在使用 -z(ACL's) 作为缺省 (Bruce)
后端缓存、内存加速 (Tom)
让 pg_dump 在一个快照事务中做任何事情 (Vadim)
修复大对象内存泄露,修复 pg_dumping (Tom)
INET 类型现在关心网络掩码的比较
使 VACUUM ANALYZE 只使用一个读锁 (Vadim)
允许 UNIONS 上的 VIEW (Jan)
pg_dump 现在可以在活动的数据库上生成一致的快照 (Vadim)

 源代码树的变化
-------------------
改进端口匹配 (Tom)
SunOS 的可靠性修复
添加 Windows NT 后端端口和启用动态加载 (Magnus 和 Daniel Horak)
新增端口到 Cobalt Qube(Mips) 运行 Linux (Tatsuo)
到 NetBSD/m68k 的端口 (Mr. Mutsuki Nakajima)
到 NetBSD/sun3 的端口 (Mr. Mutsuki Nakajima)
到 NetBSD/macppc 的端口 (Toshimi Aoki)
修复 tcl/tk 配置 (Vince)
为规则查询删除 CURRENT 关键字 (Jan)
NT 动态加载现在可以运行了 (Daniel Horak)
添加 ARM32 支持 (Andrew McMurry)
对 HP-UX 11 和 UnixWare 的更好的支持
改进文件处理使其更统一,阻止文件描述符泄露 (Tom)
新增 plpgsql 的安装命令 (Jan)