Commit 969320c8 authored by Bruce Momjian's avatar Bruce Momjian

Chinese FAQ update

Daojing.Zhou
parent a867c5aa
PostgreSQL 常见问题(FAQ) PostgreSQL 常FAQ
最近更新:2005 年 06 月 02 日 星期五 22:27:35 CST 2007 年 1 5 15:40:20 EST
2007 年 1 29 22:48:04 CST
目前维护人员:Bruce Momjian (pgman@candle.pha.pa.us) 维人Bruce Momjian (pgman@candle.pha.pa.us)
中文版维护人员:doudou586 (doudou586_2005@yahoo.com.cn) 维人Daojing.Zhoudoudou586@gmail.com
本文档的最新版本可以在 档以
http://www.postgresql.org/files/documentation/faqs/FAQ.html查看。 http://www.postgresql.org/files/documentation/faqs/FAQ.html
与操作系统平台相关的问题在http://www.postgresql.org/docs/faq/里回答。 系平http://www.postgresql.org/docs/faq/
_________________________________________________________________ _________________________________________________________________
常见问题
1.1)PostgreSQL 是什么?该怎么发音? 1.1)PostgreSQL 该
1.2)PostgreSQL 的版权是什么? 1.2)管PostgreSQL
1.3)PostgreSQL 可以运行在哪些操作系统平台上? 1.3)PostgreSQL
1.4)我从哪里能得到 PostgreSQL? 1.4)PostgreSQL以系平
1.5)我从哪里能得到对 PostgreSQL 的支持? 1.5)PostgreSQL
1.6)我如何提交一个BUG报告? 1.6)PostgreSQL
1.7)最新版的PostgreSQL 是什么? 1.7)对PostgreSQL
1.8)能够获取的最新文档有哪些? 1.8)交个BUG
1.9)我如何了解已知的 BUG 或暂缺的功能? 1.9)解已 BUG 缺
1.10)我应该怎样学习 SQL ? 1.10)档
1.11)我应该怎样加入开发队伍? 1.11)该 SQL
1.12)PostgreSQL 和其他数据库系统比起来如何? 1.12)交补
1.13)丝刂坪凸芾鞵ostgreSQL ? 1.13)PostgreSQL 系起
用户客户端问题 客端
2.1)我们可以用什么语言和 PostgreSQL 打交道? 2.1)们以PostgreSQL 交
2.2)有什么工具可以把 PostgreSQL 用于 Web 页面? 2.2)工以PostgreSQL Web 页
2.3)PostgreSQL 拥有图形用户界面吗? 2.3)PostgreSQL 形
系统管理问题 系管
3.1)我怎样才能把 PostgreSQL 装在 /usr/local/pgsql 以外的地方? 3.1) PostgreSQL /usr/local/pgsql 以
3.2)我如何控制来自其他主机的连接? 3.2)
3.3)我怎样调整数据库引擎以获得更好的性能? 3.3) 以好
3.4)PostgreSQL 里可以获得什么样的调试特性? 3.4)PostgreSQL 以
3.5)为什么在试图连接登录时收到“Sorry, too many clients” 消息? 3.5)为Sorry, too many clients
3.6)为什么要在升级 PostgreSQL 主要发布版本时做 dump 和 restore ? 3.6)PostgreSQL级容
3.7)(使用PostgreSQL)我需要使用什么计算机硬件 ? 3.7)(使PostgreSQL)使计硬件
操作问题
4.1)如何只选择一个查询结果的头几行?或是随机的一行? 4.1) 个询头
4.2)如何查看表、索引、数据库以及用户的定义?如何查看psql里用到的查询指 4.2)
令并显示它们? 表索以psql询令并
4.3)如何更改一个字段的数据类型?
4.4)一行记录,一个表,一个库的最大尺寸是多少? 4.3) 个段类
4.5)存储一个典型的文本文件里的数据需要多少磁盘空间? 4.4) 记个表个大
4.6)为什么我的查询很慢?为什么这些查询没有利用索引? 4.5) 个件空
4.7)我如何才能看到查询优化器是怎样评估处理我的查询的? 4.6) 为询为询没索
4.8)我怎样做正则表达式搜索和大小写无关的正则表达式查找?怎样利用索引进 4.7) 询 估询
行大小写无关查找? 4.8) 表达索大
4.9)在一个查询里,我怎样检测一个字段是否为 表达 索大
NULL?我如何才能准确排序而不论某字段是否含NULL值? 4.9) 个询 个段为
4.10)各种字符类型之间有什么不同? NULL确论段NULL
4.11.1)我怎样创建一个序列号/自动递增的字段? 4.10) 符类
4.11.2)我如何获得一个插入的序列号的值? 4.11.1) 建个段
4.11.3)使用 currval() 会导致和其他用户的紊乱情况(race condition)吗? 4.11.2) 个
4.11.4)为什么不在事务异常中止后重用序列号呢?为什么在序列号字段的取值 4.11.3) 使 currval() 导
写嬖诩涠夏兀 4.11.4) 为常为段中
4.12)什么是 OID?什么是 CTID ?
4.13)为什么我收到错误信息“ERROR: Memory exhausted in 4.12) OID CTID
AllocSetAlloc()”? 4.13) 为误信ERROR: Memory exhausted in
4.14)我如何才能知道所运行的 PostgreSQL 的版本? AllocSetAlloc()
4.15)我如何创建一个缺省值是当前时间的字段? 4.14) PostgreSQL
4.16)如何进行 outer join (外连接)? 4.15) 建个缺段
4.17)如何使用涉及多个数据库的查询? 4.16) outer join询
4.18)如何让函数返回多行或多列? 4.17) 个询
4.19)为什么我在使用PL/PgSQL函数存取临时表时会收到错误信息“relation 4.18) 让
with OID ##### does not exist”? 4.19) 为使PL/PgSQL临表误信relation
4.20)目前有哪些数据复制方案可用? with OID ##### does not exist
4.20)
4.21) 为询示表询中
为大
_________________________________________________________________ _________________________________________________________________
常见问题
1.1)PostgreSQL 是什么?该怎么发音? 1.1)PostgreSQL 该
PostgreSQL 读作 Post-Gres-Q-L,有时候也简称为Postgres 。 PostgreSQL 读 Post-Gres-Q-L称为Postgres
人载声件 MP3
PostgreSQL PostgreSQL
是面向目标的关系数据库系统,它具有传统商业数据库系统的所有功能,同时又 系系 系
含有将在下一代 DBMS 系统的使用的增强特性。 PostgreSQL 代 DBMS 系使强PostgreSQL
是自由免费的,并且所有源代码都可以获得。 费并代 以
PostgreSQL PostgreSQL
的开发队伍主要为志愿者,他们遍布世界各地并通过互联网进行联系,这是一个 主为们并系个社
社区开发项目,它不被任何公司控制。 项被任
如想加入开发队伍,请参见开发人员常见问题(FAQ) 请人常FAQ
http://www.postgresql.org/files/documentation/faqs/FAQ_DEV.html http://www.postgresql.org/files/documentation/faqs/FAQ_DEV.html
1.2)PostgreSQL 的版权是什么? 1.2) PostgreSQL
PostgreSQL的发布遵从经 寻PostgreSQL人中
典的BSD版权。关于源代码的如何使用没有任何限制,我们很喜欢这种方式并且 央 --- 为个
姑挥写蛩愀谋渌 们确个
CVS管工设主为管工
对PostgreSQL PostgreSQL项任人
人社 就订件表讨论
PostgreSQL详 人常 (Developer's FAQ)
下面就是我们使用的BSD版权内容: 1.3)PostgreSQL?
部分版权(c)1996-2005,PostgreSQL PostgreSQLBSD许使PostgreSQL
全球开发小组,部分版权(c)1994-1996 加州大学妒 以PostgreSQL代 以就 软件
们追责任就软件中
须以声就们使BSD声容
(Portions copyright (c) 1996-2005, PostgreSQL Global Development PostgreSQL管系
Group Portions Copyright (c) 1994-6 Regents of the University of
California)
允许为任何目的使用,拷贝,修改和分发这个软件和它的文档而不收取任何费用 c1996-2005PostgreSQL c1994-1996
并且无须签署因此而产生的证明,前提是上面的版权声明和本段以及下面两段文
字出现在所有拷贝中。
(Permission to use, copy, modify, and distribute this software and Portions copyright (c) 1996-2005,PostgreSQL Global Development Group
Portions Copyright (c) 1994-6 Regents of the University of
California
许为任使修个软件档任费
并 须署
产声段以两段
Permission to use, copy, modify, and distribute this software and
its documentation for any purpose, without fee, and without a written its documentation for any purpose, without fee, and without a written
agreement is hereby granted, provided that the above copyright notice agreement is hereby granted, provided that the above copyright notice
and this paragraph and the following two paragraphs appear in all and this paragraph and the following two paragraphs appear in all
copies. copies.
在任何情况下,加州大学都不承担因使用此软件及其文档而导致的对任何当事人 任 大 使
的直接的, 软件档导对任人
间接的,特殊的,附加的或者相伴而生的损坏,包括利益损失的责任,即使加州 伴失责任使 大
大学已窘ㄒ榱苏庑┧鹗У目赡苄允币彩侨绱恕 已建议失
IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY
PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS
SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA
HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
加州大学明确放弃任何保证,包括但不局限于某一特定用途的商业和利益的隐含 大确任
保证。 份软件 大
这里提供的这份软件是基于“当作是”的基础的,因而加州大学没有责任提供维 没责任维强修
护,支持,更新,增强或者修改的服务。
THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE
PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF
CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT, CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT,
UPDATES, ENHANCEMENTS, OR MODIFICATIONS. UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
1.3)PostgreSQL 可以运行在哪些操作系统平台上? 1.4)PostgreSQL 以系平
一般说来,一个现代的 UNIX 兼容的平台都能运行 PostgreSQL 说任对 UNIX 容系PostgreSQL
。在安装指南里列出了发布时竟魅凡馐缘钠教ā 确平
PostgreSQl也可以直接运行在基于微软Windows-NT的操作系统,如Win2000,Win PostgreSQl以微软Windows-NT系Win2000
XP 和 Win2003,已制作完成的安装包可从 SP4WinXP Win2003已
http://pgfoundry.org/projects/pginstaller下载,基于MSDOS的Windows操作 http://pgfoundry.org/projects/pginstaller载MSDOSWindows
低 (Win95,Win98,WinMe)需要通过Cygwin模拟环境运行PostgreSQL。 Win95Win98WinMeCygwin模PostgreSQL
同时也有一个为Novell Netware 6开发的版本可从 http://forge.novell.com 个为Novell Netware 6
获取,为OS/2开发的版本可从 http://forge.novell.com为OS/2(eComStation)
http://hobbes.nmsu.edu/cgi-bin/h-search?sh=1&button=Search&key=postgre http://hobbes.nmsu.edu/cgi-bin/h-search?sh=1&button=Search&key=postgre
SQL&stype=all&sort=type&dir=%2F SQL&stype=all&sort=type&dir=%2F 载
1.4)我从哪里能得到 PostgreSQL? 1.5) PostgreSQL
通过浏览器可从http://www.postgresql.org/ftp/下载,也可通过FTP,从 http://www.postgresql.org/ftp/载FTP
ftp://ftp.PostgreSQL.org/pub/站点下载。 ftp://ftp.PostgreSQL.org/pub/载
1.5)我从哪里能得到对 PostgreSQL 的支持? 1.6) PostgreSQL
PostgreSQL社区通过邮件列表为其大多数用户提供帮助,加入邮件列表的主站点 PostgreSQL 8.2.1
http://www.postgresql.org/community/lists/,一般情况下,先加入General 们计年个主级 个个
或 Bug邮件列表是一个较好的开始。
1.7) 对PostgreSQL
主要的IRC频道是在FreeNode(irc.freenode.net)的#postgresql,为了连上此频
道,可以使用UNIX程序irc,其指令格式: irc -c '#postgresql' "$USER"
irc.freenode.net
,或者使用其他IRC客户端程序。在此网络中还存在一个PostgreSQL的西班牙频
(#postgersql-es)和法语频道
(#postgresql-fr)。同样地,在EFNET上也有一个PostgreSQL的交流频道。
商业支持公司的列表在 http://techdocs.postgresql.org/companies.php。
1.6)我如何提交一个BUG报告?
可访问
http://www.postgresql.org/support/submitbug,填写Bug上报表格即可。
同样也可访问ftp站点ftp://ftp.PostgreSQL.org/pub/
检查有无更新的PostgreSQL版本或补丁。
1.7)最新版的PostgreSQL 是什么?
PostgreSQL 最新的版本是版本 8.0.2 (译注:现最新版本为8.0.3)。
我们计划每年发布一个主要版本,每几个月发布一个小版本。
1.8)能够获取的最新文档有哪些?
PostgreSQL包含大量的文档,主要有一些手册,手册页和一些的测试例子。参见
/doc 目录(译注:应为 $PGHOME/doc)。 你还可以在线浏览 PostgreSQL
的手册,其地址是:http://www.PostgreSQL.org/docs。
有两本关于 PostgreSQL 的书在线提供,在
http://www.PostgreSQL.org/docs/awbook.html 和
http://www.commandprompt.com/ppbook/ 。
也有大量的PostgreSQL书籍可供购买,其中最为流行的一本是由Korry
Douglas编写的。在
http://techdocs.PostgreSQL.org/techdocs/bookreviews.php上
上有大量有关PostgreSQL书籍的简介。 在
http://techdocs.PostgreSQL.org/上收集了有关 PostgreSQL
的大量技术文章。
客户端的命令行程序psql有一些以 \d
开头的命令,可显示关于类型,操作符,函数,汇总等的信息,使用 \?
可以显示所有可用的命令。
我们的 web 站点包含更多的文档。
1.9)我如何了解已知的 BUG 或暂缺的功能?
PostgreSQL 支持一个扩展了的 SQL-92 的子集。参阅我们的TODO
列表,获取一个已知Bug,暂缺的功能和将来的计划。
1.10)我应该怎样学习 SQL ? PostgreSQL社件表为大帮订件表主
首先考虑上述提到的与PostgreSQL相关的书籍,另外一本是Teach Yourself SQL http://www.postgresql.org/community/lists/ General
in 21 Days, Second Edition, 我们的许多用户喜欢The Practical SQL Bug件表个好
Handbook Bowman, Judith S., et al., Addison-Wesley,其他的则喜欢 The
Complete Reference SQL, Groff et al., McGraw-Hill。 主IRCFreeNode(irc.freenode.net)#postgresql为
以使UNIXirc令 irc -c '#postgresql'
1.11)我应该怎样加入开发队伍? "$USER" irc.freenode.net 使IRC客端
个PostgreSQL西(#postgersql-es)
详见 Developer's FAQ 。 (#postgresql-fr) EFNET个PostgreSQL交
1.12)PostgreSQL 和其他数据库系统比起来如何? 表http://techdocs.postgresql.org/companies.php
评价软件有好几种方法:特性,性能,可靠性,支持和价格。
1.8) 交个BUG
特性
PostgreSQL 拥有大型商用 DBMS 里大多数特性, 访
例如:事务,子查询,触发器,视图,外键参考完整性和复杂的锁等。 http://www.postgresql.org/support/submitbug填Bug表
我们还有一些它们没有的特性,如用户定义类型,继承,规则和多版本 访ftpftp://ftp.PostgreSQL.org/pub/
⑿锌刂埔约跎偎恼玫取 PostgreSQL补
性能 使Bug交表 PostgreSQL件表Bug常以
PostgreSQL 和其他商用和开源的数据库具有类似的性能。
对某些处理它比较快,对其他一些处理它比较慢。 * 交容个BugBug
与其他数据库相比,我们的性能通常在 +/- 10%之间。 * 交容个已Bug并已 TODO任表
* 交Bug已被修
可靠性 * 交Bug已修补 软件
我们知道 DBMS 必须是可靠的,否则它就一点用都没有。 * 请交详信
我们努力做到发布经 + 系
过认真测试的,稳定的臭虫最少的代码。每个版本至少有一个月的 beta + PostgreSQL
测试时间,并且我们的发布历史显示我们可以提供稳定的,牢固的,可 + Bug
糜谏褂玫陌姹尽N颐窍嘈 + 信
在这方面我们与其他的数据库软件是相当的。 + 踪
* 交容个Bug以工
支持 + 建个补并 个主
我们的邮件列表提供一个非常大的开发人员和用户的组以帮助解决所碰 + Bug修被 TODO任表
降娜魏挝侍狻 我们不能保证肯定能解决问题,相比之下,商用 DBMS
也并不是总能够提供解决方法。 1.9) 解已 BUG 缺
直接与开发人员,用户群,手册和源程序接触令 PostgreSQL
的支持比其他 DBMS PostgreSQL 个 SQL:2003 们TODO
还要好。还有一些商业性的预包装的支持,可以给提供给那些需要的人 表解已Bug表缺计
#ú卧 FAQ 条款 1.5 小节)
请常以
价格 * 该已 TODO任表
我们对任何用途都免费,包括商用和非商用目的。 * 该须 为
你可以不加限制地向你的产品里加入我们的代码,除了那些我们在上面 + 符SQL
陌嫒ㄉ骼锷鞯 BSD 风格的版权外。 + 该大大 代 带好微足
+ 该
1.13)丝刂芇ostgreSQL ? * 该被 TODO任表
如果你在寻找PostgreSQL的掌门人,或是什么中央委员会,或是什么所属公司, PostgreSQL使Bug踪系 为们件表中
你只能放弃了---因为一个也不存在,但我们的确有一个 以TODO任表工
委员会和CVS管理组,但这些工作组的设立主要是为了进行管理工作而不是对Pos Bug们软件
tgreSQL进行控制,PostgreSQL项目是由任何人均 对影Bug快被修修
可参加的开发人员社区和所有用户控制的,你所需要做的就是加入邮件列表,参 CVS信使软件信中
与讨论即可(要参与PostgreSQL的开发详见 Developer's FAQ 获取信息)。 软件
1.10) 档
PostgreSQL大档主详页 /doc
注为 $PGHOME/doc
以线PostgreSQLhttp://www.PostgreSQL.org/d
ocs
两PostgreSQL书线
http://www.PostgreSQL.org/docs/awbook.html
http://www.commandprompt.com/ppbook/ 大PostgreSQL书购
买为Korry Douglas
http://techdocs.PostgreSQL.org/techdocs/bookreviews.php
大PostgreSQL书
http://techdocs.PostgreSQL.org/PostgreSQL大
客端令psql以 \d
头令示类符信使 \?
以示令
们 web 档
1.11) 该 SQL
述PostgreSQL书Teach Yourself SQL in
21 Days, Second Edition详
http://members.tripod.com/er4ebus/sql/index.htm
们许欢The Practical SQL Handbook Bowman, Judith S.
Addison-Wesley欢 The Complete Reference SQL,
Groff McGraw-Hill
好们
* http://www.intermedia.net/support/sql/sqltut.shtm
* http://sqlcourse.com.
* http://www.w3schools.com/sql/default.asp
* http://mysite.verizon.net/Graeme_Birchall/id1.html
1.12)交补
详 人常 (Developer's FAQ)
1.13)PostgreSQL系起
价软件好 价
PostgreSQL 大
询触
们们没类继并
PostgreSQL类似对快
对 们常
+/- 10%
们须 就没们
认缺稳代 个个 beta
并们示们以稳
产使们信们软件
们件表个常大人以帮解碰
任们解软
件并解
人群触使PostgreSQL
好以人
1.7
们对任费
以 产 们代 们
声声 BSD容
_________________________________________________________________ _________________________________________________________________
用户客户端问题 客端
2.1)我们可以用什么语言和 PostgreSQL 打交道? 2.1) 们以PostgreSQL交
PostgreSQL(缺省情况)只安装有C和内嵌式C的接口,其他的接口都是独立的项目 PostgreSQL(缺)CC项
,能够分别下载,这些接口项目独立的好处 载项好
是他们可以有各自的发布计划和各自独立的开发组。 们以计
一些编程语言如PHP都有访问 PostgreSQL
的接口,Perl,TCL,Python以及很多其他语言的接口在 PHP访PostgreSQLPerlTCLPython以
http://gborg.postgresql.org 上的Drivers/Interfaces小节可找到, http://gborg.postgresql.orgDrivers/Interfaces
并且通过Internet很容易搜索到。 并Internet容索
2.2)有什么工具可以把 PostgreSQL 用于 Web 页面? 2.2) 工以PostgreSQL Web 页
一个介绍以数据库为后台的挺不错的站点是:http://www.webreview.com。 个以为http://www.webreview.com
对于 Web 集成,PHP 是一个极好的接口。它在:http://www.php.net/。 对 Web PHP 个好http://www.php.net/
对于复杂的任务,很多人采用 Perl 接口和 CGI.pm 或 mod_perl 。 对任人 Perl 使CGI.pmDBD::Pg mod_perl
2.3)PostgreSQL 拥有图形用户界面吗? 2.3)PostgreSQL形
是的,在 人PostgreSQLGUI形工软件
http://techdocs.postgresql.org/guides/GUITools有一个详细的列表。 PostgreSQL社档个详表
_________________________________________________________________ _________________________________________________________________
系统管理问题 系管
3.1)我怎样能把 PostgreSQL 装在 /usr/local/pgsql 以外的地方? 3.1) PostgreSQL /usr/local/pgsql 以
在运行 configure 时加上 --prefix 选项。 configure --prefix 项
3.2)我如何控制来自其他主机的连接? 3.2)
缺省时,PostgreSQL 只允许通过 unix 缺PostgreSQL许 unix TCP/IP
域套接字或TCP/IP方式且来自本机的连接。 修置件postgresql.conf中
你只有在修改了配置文件postgresql.conf中的listen_addresses,且也在配置 listen_addresses置件$PGDATA/pg_hba.conf
募䅟g_hba.conf中打开了 主机为基础( host-based host-based
)的身份认证,并重新启动PostgreSQL,否则其他机器是不能与你的PostgreSQL 身份认并PostgreSQL PostgreSQL
服务器连接的。
3.3)我怎样调整数据库引擎以获得更好的性能? 3.3) 以好
有三个主要方面可以提升PostgreSQL的潜能。 个主以PostgreSQL
查询方式的变化
这主要涉及修改查询方式以获取更好的性能: 主修询以好:
+ 创建索引,包括表达式和部分索引; + 建索表达索
+ 使用COPY语句代替多个Insert语句; + 使COPY代个Insert
+ 将多个SQL语句组成一个事务以减少提交事务的开销; + 个SQL个以交
+ 从一个索引中提取多条记录时使用CLUSTER; + 个索记使CLUSTER
+ 从一个查询结果中取出部分记录时使用LIMIT; + 个询记使LIMIT
+ 使用预编译式查询(Prepared Query); + 使询Prepared Query)
+ 使用ANALYZE以保持精确的优化统计; + 使ANALYZE以精确计
+ 定期使用 VACUUM 或 pg_autovacuum + 使 VACUUM pg_autovacuum
+ 进行大量数据更改时先删除索引(然后重建索引) + 大 索建索
服务器的配置
配置文件postgres.conf中的很多设置都会影响性能,所有参数的列表可 置件postgres.conf中
见: Administration Guide/Server Run-time Environment/Run-time 设置影表
Configuration, 有关参数的解释可见: 管//置
http://www.varlena.com/varlena/GeneralBits/Tidbits/annotated_co 解http://www.varlena.com/varlena/GeneralBits/Tid
nf_e.html 和 bits/annotated_conf_e.html
http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html
硬件的选择 硬件
计算机硬件对性能的影响可浏览 计硬件对影
http://candle.pha.pa.us/main/writings/pgsql/hw_performance/inde http://candle.pha.pa.us/main/writings/pgsql/hw_performance/inde
x.html 和 http://www.powerpostgresql.com/PerfList/。 x.html http://www.powerpostgresql.com/PerfList/
3.4)PostgreSQL以
3.4)PostgreSQL 里可以获得什么样的调试特性? PostgreSQL 类似 log_*
置询计工对
PostgreSQL 有很多类似 log_* 3.5) 为Sorry, too many
的服务器配置变量可用于查询的打印和进程统计,而这些工作对调试和性能测试 clients已太
很有帮助。
3.5)为什么在试图连接时收到“Sorry, too many clients”消息? 表示 已达缺100个并 修postgres
ql.conf件max_connections
postmaster并修postmaster
这表示你已达到缺省100个并发后台进程数的限制,你需要通过修改postgresql. 3.6)PostgreSQL级容
conf文件中的max_connections值来
增加postmaster的后台并发处理数,修改后需重新启动postmaster。
3.6)为什么要在升级 PostgreSQL 主要发布版本时做 dump 和 restore ? PostgreSQL 对次级主Bug修工
7.4.8 级 7.4.9 dump restore
软件
PostgreSQL 开发组对每次小的升级仅做了较少的修改,因此从 7.4.0 升级到 PostgreSQL该 使主尽快
7.4.1 不需要 dump 和 restore。 但是主要的升级(例如从 7.3 到 尽管次级PostgreSQL设计
7.4)通常会修改系统表和数据表的内部格式。
这些变化一般比较复杂,因此我们不维数据文件的向后兼容。 dump Bug代 以PostgreSQL社认为
将数据按照通用的格式输出,随后可以被重新加载并使用新的内部格式。 级级
3.7)(使用PostgreSQL)我需要使用什么计算机硬件 ? 主级 7.3 7.4常修系表表
们维件容 中
导dump/中
导reload对主级须
由于计算机硬件大多数是兼容的,人们总是倾向于相信所有计算机硬件质量也是 3.7)(使PostgreSQL)使计硬件
相同的。事实上不是, ECC RAM(带奇偶校验的内存),SCSI
(硬盘)和优质的主板比一些便宜货要更加可靠且具有更好的性能。PostgreSQL 计硬件大容人们信计硬件
几乎可以运行在任何硬件上, ECC RAM带 SCSI
但如果可靠性和性能对你的系统很重要,你就需要全面的研究一下你的硬件配置 硬质主便货 好PostgreSQL
了。在我们的邮件列表上也有关于 硬件配置和性价比的讨论。 以任硬件
对 系 就 究 硬件
们件表 硬件置价讨论
_________________________________________________________________ _________________________________________________________________
操作问题
4.1)如何只选择一个查询结果的头几行?或是随机的一行? 4.1) 个询头
如果你只是要提取几行数据,并且你在执行查询中知道确切的行数,你可以使用 并 询中
LIMIT功能。 如果有一个索引与 ORDER BY中的条件匹配,PostgreSQL 确 以使LIMIT 个索 ORDER BY中
可能就只处理要求的头几条记录, 件PostgreSQL 就头 记
(否则将对整个查询进行处理直到生成需要的行)。如果在执行查询功能时不知 对个询询确
道确切的记录数, 可使用游标(cursor)和FETCH功能。 记 使游 (cursor)FETCH
可使用以下方法提取一行随机记录的: 使以记
SELECT cols SELECT cols
FROM tab FROM tab
ORDER BY random() ORDER BY random()
LIMIT 1 ; LIMIT 1 ;
4.2)如何查看表、索引、数据库以及用户的定义?如何查看psql里用到的查询指令并 4.2)
允舅牵 表索以psql询令并示们
在psql中使用 \dt psql使 \dt 令示表解psql中
命令来显示数据表的定义,要了解psql中的完整命令列表可使用\? 令表使\? 以读 psql 代
,另外,你也可以阅读 psql 的源代码 件pgsql/src/bin/psql/describe.c为psql 令 SQL
文件pgsql/src/bin/psql/describe.c,它包括为生成psql反斜杠命令的输出的 令 以带 -E 项 psql psql中
 SQL 命令。你还可以带 -E 选项启动 psql, 令使SQL询语
这样它将打印出执行你在psql中所给出的命令的内部实际使用的SQL查询。Postg PostgreSQL个容SQLINFORMATION SCHEMA
reSQL也提供了一个兼容SQL的INFORMATION SCHEMA接口, 以信
你可以从这里获取关于数据库的信息。
在系统中有一些以pg_ 打头的系统表也描述了表的定义。 系以pg_ 头系表述表
使用 psql -l 指令可以列出所有的数据库。 使 psql -l 令以
也可以浏览一下
pgsql/src/tutorial/syscat.source文件,它列举了很多可从数据库系统表中获 pgsql/src/tutorial/syscat.source件举系表
取信息的SELECT语法。 信SELECT
4.3)如何更改一个字段的数据类型? 4.3) 个段类
在8.0版本里更改一个字段的数据类型很容易,可使用 ALTER TABLE ALTER 8.0个段类容使 ALTER TABLE ALTER
COLUMN TYPE COLUMN TYPE
在以前的版本中,可以这样做: 以以
BEGIN; BEGIN;
ALTER TABLE tab ADD COLUMN new_col new_data_type; ALTER TABLE tab ADD COLUMN new_col new_data_type;
UPDATE tab SET new_col = CAST(old_col AS new_data_type); UPDATE tab SET new_col = CAST(old_col AS new_data_type);
ALTER TABLE tab DROP COLUMN old_col; ALTER TABLE tab DROP COLUMN old_col;
COMMIT; COMMIT;
你然后可以使用VACUUM FULL tab 指令来使系统收回无效数据所占用的空间。 以使VACUUM FULL tab 令使系 空
4.4)一行记录,一个表,一个库的最大尺寸是多少? 4.4) 记个表个大
下面是一些限制:
一个数据库最大尺寸? 无限制(已存在有 32TB 的数据库) 个大尺寸 已 32TB
一个表的最大尺寸? 32 TB 个表大尺寸 32 TB
一行记录的最大尺寸? 1.6 TB 记大尺寸 1.6 TB
一个字段的最大尺寸? 1 GB 个段大尺寸? 1 GB
一个表里最大行数? 无限制 个表大
一个表里最大列数? 250-1600 (与列类型有关) 个表大 250-1600 类
一个表里的最大索引数量? 无限制 个表大索
当然,实际上没有真正的无限制,还是要受可用磁盘空间、可用内存/交换区的 没 空/交约
圃肌 事实上,当这些数值变得异常地大时,系统性能也会受很大影响。 述常大系大影
表的最大尺寸 32 TB 不需要操作系统对大文件的支持。大表用多个 1 GB 表大大 32 TB
的文件存储,因此文件系统尺寸的限制是不重要的。 系对个件大大表个 1 GB 件
件系大
如果缺省的块大小增长到 32K ,最大的表尺寸和最大列数还可以增加到四倍。 缺大 32K 大表大大以
4.5)存储一个典型的文本文件里的数据需要多少磁盘空间? 个就对大2000
建索幸 索对
容MD5索对
并索许对索
一个 Postgres 4.5) 个件空
数据库(存储一个文本文件)所占用的空间最多可能需要相当于这个文本文件自
身大小5倍的磁盘空间。
例如,假设有一个 100,000 行的文件,每行有一个整数和一个文本描述。 个 Postgres
假设文本串的平均长度为20字节。文本文件占用 2.8 MB。存放这些数据的 个件 空个件身大5
PostgreSQL 数据库文件大约是 6.4 MB:
32 字节: 每行的头(估计值)
24 字节: 一个整数型字段和一个文本型字段
+ 4 字节: 页面内指向元组的指针
----------------------------------------
60 字节每行
PostgreSQL 数据页的大小是 8192 字节 (8 KB),则: 设个 100,000 件个个述
设串平度为20件 2.8 MB
PostgreSQL件大约 6.4 MB:
28 : 头大约
24 : 个段个段
+ 4 : 页
----------------------------------------
56
8192 字节每页 PostgreSQL 页大 8192 (8 KB)
------------------- = 136 行/数据页(向下取整)
60 字节每行
100000 数据行 8192 页
-------------------- = 735 数据页(向上取整) ------------------- = 146 /页
128 行每页 56
735 数据页 * 8192 字节/页 = 6,021,120 字节(6 MB) 100000
-------------------- = 685 页
146 /页
索引不需要这么多的额外消耗,但也确实包括被索引的数据,因此它们也可能很 685 页 * 8192 /页 = 5,611,520 5.6 MB
大。
空值NULL存放在位图中,因此占用很少的空间。 索确被索
们大
4.6)为什么我的查询很慢?为什么这些查询没有利用索引? 空NULL 空
并非每个查询都会自动使用索引。只有在表的大小超过一个最小值,并且查询只 4.6) 为询为询没索
会选中表中较小比例的记录时才会采用索引。
这是因为索引扫描引起的随即磁盘存取可能比直接地读取表(顺序扫描)更慢。
为了判断是否使用索引,PostgreSQL必须获得有关表的统计值。这些统计值可以 并个询使索表大个并
使用 VACUUM ANALYZE,或 ANALYZE 获得。 询表记索
使用统计值,优化器知道表中有多少行,就能够更好地判断是否利用索引。 为索起读表顺
统计值对确定优化的连接顺序和连接方法也很有用。在表的内容发生变化时,应
定期进行统计值的更新收集。
索引通常不用于 ORDER BY
或执行连接。对一个大表的一次顺序扫描,再做一个显式的排序通常比索引扫描 使索PostgreSQL须表计计以使
要快。 VACUUM ANALYZE ANALYZE 使计表中
就好索
计对确顺表容
但是,在 LIMIT 和 ORDER BY 结合使用时经 索常 ORDER BY
常会使用索引,因为这只会返回表的一小部分。 实际上,虽然 MAX() 和 MIN() 对个大表次顺次常索快
并不使用索引,通过对 ORDER BY 和 LLIMIT LIMIT ORDER BY
使用索引取得最大值和最小值也是可以的: 起使常使索 为表中
SELECT col
FROM tab
ORDER BY col [ DESC ]
LIMIT 1;
如果你确信PostgreSQL的优化器使用顺序扫描是不正确的,你可以使用SET 确信PostgreSQL使顺确 以使SET
enable_seqscan TO 'off'指令, enable_seqscan TO 'off'令顺
然后再次运行查询,你就可以看出使用一个索引扫描是否确实要快一些。 次询 就以使个索确快
当使用通配符操作,例如 LIKE 或 ~ 时,索引只能在特定的情况下使用: 使符 LIKE ~ 索使
* 字符串的开始部分必须是普通字符串,也就是说: * 符串须符串就说
+ LIKE 模式不能以 % 打头。 + LIKE 模以 % 头
+ ~ (正则表达式)模式必须以 ^ 打头。 + ~ 表达模须以 ^ 头
* 字符串不能以匹配多个字符的模式类打头,例如 [a-e]。 * 符串以个符模类头 [a-e]
* 大小写无关的查找,如 ILIKE 和 ~* 等不使用索引,但可以用 4.8 * 大 ILIKE ~* 使索以 4.8
节描述的函数索引。 述表达索
* 在做 initdb 时必须采用缺省的本地设置 C * initdb 须缺设置 C
locale,因为系统不可能知道在非C locale情况时下一个最大字符是什么。 locale 为系C locale个大符
在这种情况下,你可以创建一个特殊的text_pattern_ops索引来用于LIKE的 以建个text_pattern_ops索LIKE
索引。
在8.0之前的版本中,除非要查询的数据类型和索引的数据类型相匹配,否则索 8.0中
常是未被用到,特别是对int2,int8和数值型的索引。 询类索类索常被
对int2,int8索
4.7)我如何才能看到查询优化器是怎样评估处理我的查询? 4.7) 询 估询
参考 EXPLAIN 手册页。 EXPLAIN 页
4.8)我怎样做正则表达式搜索和大小写无关的正则表达式查找?怎样利用索引进行大 4.8) 表达索大
⌒次薰夭檎遥 表达 索大
操作符 ~ 处理正则表达式匹配,而 ~* 符 ~ 表达 ~* 大
处理大小写无关的正则表达式匹配。大写些无关的 LIKE 变种成为 ILIKE。 表达大 LIKE 为 ILIKE
大小写无关的等式比较通常写做: 大 常
SELECT * SELECT *
FROM tab FROM tab
WHERE lower(col) = 'abc'; WHERE lower(col) = 'abc';
这样将不会使用标准的索引。但是可以创建一个可被利用的函数索引: 使 索以建个使表达
:
CREATE INDEX tabindex ON tab (lower(col)); CREATE INDEX tabindex ON tab (lower(col));
4.9)在一个查询里,我怎样检测一个字段是否为 NULL 述索建 UNIQUE约索段身容以
?我如何才能准确排序而不论某字段是否含 NULL 值? 大容UNIQUE约容大
为以使CHECK约件触
4.9) 个询 个段为 NULL 确论
段 NULL
用 IS NULL 和 IS NOT NULL 测试这个字段,具体方法如下: IS NULL IS NOT NULL 个段
SELECT * SELECT *
FROM tab FROM tab
WHERE col IS NULL; WHERE col IS NULL;
为了能对含 NULL字段排序,可在 ORDER BY 条件中使用 IS NULL和 IS NOT 为对 NULL段 ORDER BY 件使 IS NULL IS NOT
NULL 修饰符,条件为真 true 将比条件为假false NULL 修饰符件为 true 件为false
排在前面,下面的例子就会将含 NULL 的记录排在结果的上面部分: 就 NULL 记
SELECT * SELECT *
FROM tab FROM tab
ORDER BY (col IS NOT NULL) ORDER BY (col IS NOT NULL)
4.10)各种字符类型之间有什么不同? 4.10) 符类
类型 内部名称 说明 类 称 说
VARCHAR(n) varchar VARCHAR(n) varchar 大度
指定了最大长度,变长字符串,不足定义长度的部分不补齐 符串足度补
CHAR(n) bpchar 定长字符串,实际数据不足定义长度时,以空格补齐 CHAR(n) bpchar 符串足度以空 补
TEXT text 没有特别的上限限制(仅受行的最大长度限制) TEXT text 没大度
BYTEA bytea 变长字节序列(使用NULL也是允许的) BYTEA bytea 使NULL符许
"char" char 一个字符 "char" char 个符
在系统表和在一些错误信息里你将看到内部名称。 系表误信 称
上面所列的前四种类型是"varlena"(变长)类型(也就是说,开头的四个字节 类"varlena"类就说头个
浅ざ龋竺娌攀鞘荩 于是实际占用的空间比声明的大小要多一些。 度 空声大
然而这些类型都可以被压缩存储,也可以用 TOAST 类以被缩
脱机存储,因此磁盘空间也可能比预想的要少。
VARCHAR(n) 在存储限制了最大长度的变长字符串是最好的。 TEXT VARCHAR(n) 大度符串好 TEXT
适用于存储最大可达 1G左右但未定义限制长度的字符串。 大达 1G左度符串
CHAR(n) 最适合于存储长度相同的字符串。 CHAR(n) 度符串 CHAR(n)
CHAR(n)会根据所给定的字段长度以空格补足(不足的字段内容), 而 段度以空 补足足段容 VARCHAR(n)
VARCHAR(n) 只存储所给定的数据内容。 BYTEA 容 BYTEA 尤 NULL
用于存储二进制数据,尤其是包含 NULL 类差
字节的值。这些类型具有相似的性能特性。
4.11.1)我怎样创建一个序列号/自动递增的字段? 4.11.1) 建个段
PostgreSQL 支持 SERIAL PostgreSQL SERIAL 类
数据类型。它在字段上自动创建一个序列和索引。例如: 段为SERIAL建个
CREATE TABLE person ( CREATE TABLE person (
id SERIAL, id SERIAL,
name TEXT name TEXT
); );
会自动转换为: 转为以SQL
CREATE SEQUENCE person_id_seq; CREATE SEQUENCE person_id_seq;
CREATE TABLE person ( CREATE TABLE person (
id INT4 NOT NULL DEFAULT nextval('person_id_seq'), id INT4 NOT NULL DEFAULT nextval('person_id_seq'),
name TEXT name TEXT
); );
参考 create_sequence 手册页获取关于序列的更多信息。 create_sequence 页信
4.11.2)我如何获得一个插入的序列号的值? 4.11.2) 个
一种方法是在插入之前先用函数 nextval() 从序列对象里检索出下一个 SERIAL nextval() 对象索个 SERIAL
值,然后再显式插入。使用 4.11.1 里的例表,可用伪码这样描述: 精确使 4.11.1 表伪 述
new_id = execute("SELECT nextval('person_id_seq')"); new_id = execute("SELECT nextval('person_id_seq')");
execute("INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')"); execute("INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')");
这样还能在其他查询中使用存放在 new_id 里的新值(例如,作为 person 询使 new_id 为 person
表的外键)。 注意自动创建的 SEQUENCE 对象的名称将会是 表 注建 SEQUENCE 对象称
<table>_<serialcolumn>_seq, 这里 table 和 serialcolumn <table>_<serialcolumn>_seq table serialcolumn
分别是你的表的名称和你的 SERIAL 字段的名称。 表称 SERIAL 段称
类似的,在 SERIAL 对象缺省插入后你可以用函数 currval() 检索刚赋值的 类似 SERIAL 对象缺 以 currval() 索
SERIAL 值,例如: SERIAL
execute("INSERT INTO person (name) VALUES ('Blaise Pascal')"); execute("INSERT INTO person (name) VALUES ('Blaise Pascal')");
new_id = execute("SELECT currval('person_id_seq')"); new_id = execute("SELECT currval('person_id_seq')");
4.11.3)使用 currval() 会导致和其他用户的冲突情况(race condition)吗? 4.11.3) 使 currval() 导
不会。currval() 返回的是你本次会话进程所赋的值而不是所有用户的当前值。 currval() 次
4.11.4)为什么不在事务异常中止后重用序列号呢?为什么在序列号字段的取值中存在 4.11.4) 为常为段
间断呢?
为了提高并发性,序列号在需要的时候赋予正在运行的事务,并且在事务结束之 为并
前不进行锁定, 这就会导致异常中止的事务后,序列号会出现间隔。 并 就导常中
4.12)什么是 OID ?什么是 CTID ? 4.12) OID CTID
PostgreSQL PostgreSQL
里创建的每一行记录都会获得一个唯一的OID,除非在创建表时使用WITHOUT 建记个OID建表使WITHOUT
OIDS选项。 OID创建时会自动生成一个4字节的整数,所有 OID 在整个 OIDS项 OID建个4 OID
PostgreSQL 中均是唯一的。 然而,它在超过40亿时将溢出, PostgreSQL 40亿溢 OID
OID此后会出现重复。PostgreSQL 在它的内部系统表里使用 OID PostgreSQL 系表使 OID 表建系
在表之间建立联系。
在用户的数据表中,最好是使用SERIAl来代替OID 表好使SERIAl代OID
因为SERIAL只是保证在单个表中数据是唯一的,这样它溢出的可能性就非常小了 为SERIAL个表中
, SERIAL8可用来保存8字节的序列号字段。 就以 溢就常
SERIAL88
CTID 用于标识带着数据块(地址)和(块内)偏移的特定的物理行。 CTID CTID 带移 CTID
在记录被更改或重载后发生改变。索引入口使用它们指向物理行。 记被载索使们
4.13)为什么我收到错误信息“ERROR: Memory exhausted in AllocSetAlloc()”? 4.13) 为误信ERROR: Memory exhausted in AllocSetAlloc()
这很可能是系统的虚拟内存用光了,或者内核对某些资源有较低的限制值。在启 系 对
动 postmaster 之前试试下面的命令: postmaster 令
ulimit -d 262144 ulimit -d 262144
limit datasize 256m limit datasize 256m
取决于你用的
shell,上面命令只有一条能成功,但是它将把你的进程数据段限制设得比较高 shell令 段设
许让询令以令
因而也许能让查询完成。这条命令应用于当前进程,以及所有在这条命令运行后
创建的子进程。 SQL客端 为太请
如果你是在运行SQL客户端时因为后台返回了太多的数据而出现问题,请在运行 客端述令
突Ф酥爸葱猩鲜雒睢
4.14)我如何才能知道所运行的 PostgreSQL 的版本? 4.14) PostgreSQL
从 psql 里,输入 SELECT version();指令。 psql SELECT version();令
4.15)我如何创建一个缺省值是当前时间的字段? 4.15) 建个缺段
使用 CURRENT_TIMESTAMP: 使 CURRENT_TIMESTAMP
CREATE TABLE test (x int, modtime TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE test (x int, modtime TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
4.16)我怎样进行 outer join (外连接)? 4.16) outer join
PostgreSQL 采用标准的 SQL 语法支持外连接。这里是两个例子: PostgreSQL SQL 两个
SELECT * SELECT *
FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col); FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col);
或是
SELECT * SELECT *
FROM t1 LEFT OUTER JOIN t2 USING (col); FROM t1 LEFT OUTER JOIN t2 USING (col);
这两个等价的查询在 t1.col 和 t2.col 上做连接,并且返回 t1 两个价询 t1.col t2.col 并 t1 中
中所有未连接的行(那些在 t2 中没有匹配的行)。 右[外]连接(RIGHT OUTER t2 没 []RIGHT OUTER
JOIN)将返回 t2 中未连接的行。 完全外连接(FULL OUTER JOIN)将返回 t1 JOIN t2 FULL OUTER JOIN t1 t2
和 t2 中未连接的行。 关键字 OUTER OUTER 左[][][]中
在左[外]连接、右[外]连接和完全[外]连接中是可选的,普通连接被称为内连接 被称为INNER JOIN
(INNER JOIN)。
4.17)如何使用涉及多个数据库的查询? 4.17) 使个询
没有办法查询当前数据库之外的数据库。 因为 PostgreSQL 没询
要加载与数据库相关的系统目录(系统表),因此跨数据库的查询如何执行是不 为PostgreSQL 载系系表
定的。 跨询
附加增值模块contrib/dblink允许采用函数调用实现跨库查询。当然用户也可以 模contrib/dblink许跨询以
同时连接到不同的数据库执行查询然后在客户端合并结果。 询客端并
4.18)如何让函数返回多行或多列? 4.18) 让
在函数中返回数据记录集的功能是很容易使用的,详情参见: 记容使详
http://techdocs.postgresql.org/guides/SetReturningFunctions http://techdocs.postgresql.org/guides/SetReturningFunctions
4.19)为什么我在使用PL/PgSQL函数存取临时表时会收到错误信息“relation with 4.19) 为使PL/PgSQL临表误信relation with
OID ##### does not exist”? OID ##### does not exist
PL/PgSQL容带个好个
PL/PgSQL
访个临表该表被 并建次该
失败 为容临表解 PL/PgSQL
EXECUTE
对临表访 询被解
4.20)
PL/PgSQL会缓存函数的内容,由此带来的一个不好的副作用是若一个 PL/PgSQL 个好 缺
函数访问了一个临时表,然后该表被删除并重建了,则再次调用该函数将失败,
因为缓存的函数内容仍然指向旧的临时表。解决的方法是在 PL/PgSQL
中用EXECUTE 对临时表进行访问。这样会保证查询在执行前总会被重新解析。
4.27)目前有哪些数据复制方案可用? 主/许个主读/请个
/SELECT询请 费主/PostgreSQL
Slony-I
“复制”只是一个术语,有好几种复制技术可使用,每种都有优点和缺点: 个主许读/请计
带严失Pgcluster 中
好以费载
主/从复制方式是允许一个主服务器接受读/写的申请,而多个从服务器只能接受 费硬件述模
读/SELECT查询的申请, 目前最流行且是免费的主/从 PostgreSQL复制方案是
Slony-I 。
多个主服务器的复制方式允许将读/写的申请发送给多台的计算机,这种方式由 4.21) 为询示表询为大
谛枰诙嗵ǚ衿髦渫绞荼涠
可能会带来较严重的性能损失,Pgcluster是目前这种方案
中最好的,而且还可以免费下载。
也有一些商业需付费和基于硬件的数据复制方案,支持上述各种复制模型。 常 建表对表使使
称为 符 大
询表使工软件pgAdmin
建表令个 符
为 符 该
* 建表 符使起
* 符使
* 为已 符询使 符起
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" <!DOCTYPE html
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en" dir="ltr"> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<head>
<title>
PostgreSQL: PostgreSQL 常见问题(FAQ)
</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
</head>
<body> <html>
<head>
<h1>PostgreSQL 常见问题(FAQ)</h1> <title>PostgreSQL 常见问题(FAQ)</title>
<p> </head>
最近更新:2005 年 06 月 02 日 星期五 22:27:35 CST
<body>
<h1> PostgreSQL 常见问题(FAQ) </h1>
<p> 最近更新:2007 年 1 月 5 日 星期五 15:40:20 EST <br/>
中文版最近更新:2007 年 1 月 29 日 星期一 22:48:04 CST
</p> </p>
<p> <p> 目前维护人员:Bruce Momjian (<a href="mailto:pgman@candle.pha.pa.us">pgman@candle.pha.pa.us</a>)<br/>
目前维护人员:Bruce Momjian (<a href="mailto:pgman@candle.pha.pa.us">pgman@candle.pha.pa.us</a>)<br/> 中文版维护人员:Daojing.Zhou(<a href="mailto:doudou586@gmail.com">doudou586@gmail.com</a>
中文版维护人员:doudou586 (doudou586_2005@yahoo.com.cn)
</p> </p>
<p> <p>
本文档的最新版本可以在 本文档的最新版本可以在
<a href="http://www.postgresql.org/files/documentation/faqs/FAQ.html">http://www.postgresql.org/files/documentation/faqs/FAQ.html</a>查看。 <a href="http://www.postgresql.org/files/documentation/faqs/FAQ.html">http://www.postgresql.org/files/documentation/faqs/FAQ.html</a>查看。
</p> </p>
<p> <p>
与操作系统平台相关的问题在<a href="http://www.postgresql.org/docs/faq/">http://www.postgresql.org/docs/faq/</a>里回答。<br/> 与操作系统平台相关的问题可在<a href="http://www.postgresql.org/docs/faq/">http://www.postgresql.org/docs/faq/</a>里找到答案。<br/>
</p> </p>
<hr/> <hr/>
<div><h2>常见问题</h2></div> <h2><a name="常见问题"></a> 常见问题 </h2>
<p>
<a href="#1.1">1.1</a>)PostgreSQL 是什么?该怎么发音?<br/>
<a href="#1.2">1.2</a>)PostgreSQL 的版权是什么?<br/>
<a href="#1.3">1.3</a>)PostgreSQL 可以运行在哪些操作系统平台上?<br/>
<a href="#1.4">1.4</a>)我从哪里能得到 PostgreSQL?<br/>
<a href="#1.5">1.5</a>)我从哪里能得到对 PostgreSQL 的支持?<br/>
<a href="#1.6">1.6</a>)我如何提交一个BUG报告?<br/>
<a href="#1.7">1.7</a>)最新版的PostgreSQL 是什么?<br/>
<a href="#1.8">1.8</a>)能够获取的最新文档有哪些?<br/>
<a href="#1.9">1.9</a>)我如何了解已知的 BUG 或暂缺的功能?<br/>
<a href="#1.10">1.10</a>)我应该怎样学习 SQL ?<br/>
<a href="#1.11">1.11</a>)我应该怎样加入开发队伍?<br/>
<a href="#1.12">1.12</a>)PostgreSQL 和其他数据库系统比起来如何?<br/>
<a href="#1.13">1.13</a>)谁控制和管理PostgreSQL ?
</p>
<div><h2>用户客户端问题</h2></div>
<p>
<a href="#2.1">2.1</a>)我们可以用什么语言和 PostgreSQL 打交道?<br/>
<a href="#2.2">2.2</a>)有什么工具可以把 PostgreSQL 用于 Web 页面?<br/>
<a href="#2.3">2.3</a>)PostgreSQL 拥有图形用户界面吗?<br/>
</p>
<div><h2>系统管理问题</h2></div>
<p>
<a href="#3.1">3.1</a>)我怎样才能把 PostgreSQL 装在 /usr/local/pgsql 以外的地方?<br/>
<a href="#3.2">3.2</a>)我如何控制来自其他主机的连接?<br/>
<a href="#3.3">3.3</a>)我怎样调整数据库引擎以获得更好的性能?<br/>
<a href="#3.4">3.4</a>)PostgreSQL 里可以获得什么样的调试特性?<br/>
<a href="#3.5">3.5</a>)为什么在试图连接登录时收到“Sorry, too many clients” 消息?<br/>
<a href="#3.6">3.6</a>)为什么要在升级 PostgreSQL 主要发布版本时做 dump 和 restore ?<br/>
<a href="#3.7">3.7</a>)(使用PostgreSQL)我需要使用什么计算机硬件 ?<br/>
</p>
<div><h2>操作问题</h2></div>
<p>
<a href="#4.1">4.1</a>)如何只选择一个查询结果的头几行?或是随机的一行?<br/>
<a href="#4.2">4.2</a>)如何查看表、索引、数据库以及用户的定义?如何查看<i>psql</i>里用到的查询指令并显示它们?<br/>
<a href="#4.3">4.3</a>)如何更改一个字段的数据类型?<br/>
<a href="#4.4">4.4</a>)一行记录,一个表,一个库的最大尺寸是多少?<br/>
<a href="#4.5">4.5</a>)存储一个典型的文本文件里的数据需要多少磁盘空间?<br/>
<a href="#4.6">4.6</a>)为什么我的查询很慢?为什么这些查询没有利用索引?<br/>
<a href="#4.7">4.7</a>)我如何才能看到查询优化器是怎样评估处理我的查询的?<br/>
<a href="#4.8">4.8</a>)我怎样做正则表达式搜索和大小写无关的正则表达式查找?怎样利用索引进行大小写无关查找?<br/>
<a href="#4.9">4.9</a>)在一个查询里,我怎样检测一个字段是否为 NULL?我如何才能准确排序而不论某字段是否含NULL值?<br/>
<a href="#4.10">4.10</a>)各种字符类型之间有什么不同?<br/>
<a href="#4.11.1">4.11.1</a>)我怎样创建一个序列号/自动递增的字段?<br/>
<a href="#4.11.2">4.11.2</a>)我如何获得一个插入的序列号的值?<br/>
<a href="#4.11.3">4.11.3</a>)使用 currval() 会导致和其他用户的紊乱情况(race condition)吗?<br/>
<a href="#4.11.4">4.11.4</a>)为什么不在事务异常中止后重用序列号呢?为什么在序列号字段的取值中存在间断呢?<br/>
<a href="#4.12">4.12</a>)什么是 OID?什么是 CTID ?<br/>
<a href="#4.13">4.13</a>)为什么我收到错误信息“<i>ERROR: Memory exhausted in AllocSetAlloc()</i>”?<br/>
<a href="#4.14">4.14</a>)我如何才能知道所运行的 PostgreSQL 的版本?<br/>
<a href="#4.15">4.15</a>)我如何创建一个缺省值是当前时间的字段?<br/>
<a href="#4.16">4.16</a>)如何进行 outer join (外连接)?<br/>
<a href="#4.17">4.17</a>)如何使用涉及多个数据库的查询?<br/>
<a href="#4.18">4.18</a>)如何让函数返回多行或多列?<br/>
<a href="#4.19">4.19</a>)为什么我在使用PL/PgSQL函数存取临时表时会收到错误信息“relation with OID ##### does not exist”?<br/>
<a href="#4.20">4.20</a>)目前有哪些数据复制方案可用?<br/>
</p>
<hr/>
<div><h2>常见问题</h2></div>
<h4><a name="1.1"></a>1.1)PostgreSQL 是什么?该怎么发音?</h4>
<p> <p>
PostgreSQL 读作 <i>Post-Gres-Q-L</i>,有时候也简称为<i>Postgres</i> <a href="#1.1">1.1</a>)PostgreSQL 是什么?该怎么发音?<br/>
<a href="#1.2">1.2</a>)谁控制和管理PostgreSQL ?<br/>
<a href="#1.3">1.3</a>)PostgreSQL的版权是什么?<br/>
<a href="#1.4">1.4</a>)PostgreSQL可以运行在哪些操作系统平台上?<br/>
<a href="#1.5">1.5</a>)我从哪里能得到PostgreSQL?<br/>
<a href="#1.6">1.6</a>)最新版的PostgreSQL 是什么?<br/>
<a href="#1.7">1.7</a>)我从哪里能得到对PostgreSQL 的支持?<br/>
<a href="#1.8">1.8</a>)我如何提交一个BUG报告?<br/>
<a href="#1.9">1.9</a>)我如何了解已知的 BUG 或暂缺的功能?<br/>
<a href="#1.10">1.10</a>)能够获取的最新文档有哪些?<br/>
<a href="#1.11">1.11</a>)我应该怎样学习 SQL ?<br/>
<a href="#1.12">1.12</a>)如何提交补丁或是加入开发队伍?<br/>
<a href="#1.13">1.13</a>)PostgreSQL 和其他数据库系统比起来如何?<br/>
</p> </p>
<h2><a name="用户客户端问题"></a> 用户客户端问题 </h2>
<p> <p>
PostgreSQL 是面向目标的关系数据库系统,它具有传统商业数据库系统的所有功能,同时又含有将在下一代 DBMS 系统的使用的增强特性。 <a href="#2.1">2.1</a>)我们可以用什么语言和PostgreSQL 打交道?<br/>
PostgreSQL 是自由免费的,并且所有源代码都可以获得。 <a href="#2.2">2.2</a>)有什么工具可以把PostgreSQL 用于 Web 页面?<br/>
<a href="#2.3">2.3</a>)PostgreSQL 拥有图形用户界面吗?<br/>
</p> </p>
<h2><a name="系统管理问题"></a> 系统管理问题 </h2>
<p> <p>
PostgreSQL 的开发队伍主要为志愿者,他们遍布世界各地并通过互联网进行联系,这是一个社区开发项目,它不被任何公司控制。 <a href="#3.1">3.1</a>)我怎样才能把PostgreSQL 装在 /usr/local/pgsql 以外的地方?<br/>
如想加入开发队伍,请参见开发人员常见问题(FAQ) <a href="#3.2">3.2</a>)我如何控制来自其他电脑的连接?<br/>
<a href="http://www.postgresql.org/files/documentation/faqs/FAQ_DEV.html">http://www.postgresql.org/files/documentation/faqs/FAQ_DEV.html</a> <a href="#3.3">3.3</a>)我怎样调整数据库服务器以获得更好的性能?<br/>
<a href="#3.4">3.4</a>)PostgreSQL 里可以获得什么样的调试特性?<br/>
<a href="#3.5">3.5</a>)为什么在试图连接登录时收到“Sorry, too many clients” 消息?<br/>
<a href="#3.6">3.6</a>)PostgreSQL的升级过程有哪些内容?<br/>
<a href="#3.7">3.7</a>)(使用PostgreSQL)我需要使用什么计算机硬件 ?<br/>
</p> </p>
<h2><a name="操作问题"></a> 操作问题 </h2>
<h4><a name="1.2"></a>1.2)PostgreSQL 的版权是什么?</h4>
<p> <p>
PostgreSQL的发布遵从经典的BSD版权。关于源代码的如何使用没有任何限制,我们很喜欢这种方式并且还没有打算改变它。 <a href="#4.1">4.1</a>) 如何只选择一个查询结果的头几行?或是随机的一行?<br/>
<a href="#4.2">4.2</a>) 如何查看表、索引、数据库以及用户的定义?如何查看<i>psql</i>里用到的查询指令并显示它们?<br/>
<a href="#4.3">4.3</a>) 如何更改一个字段的数据类型?<br/>
<a href="#4.4">4.4</a>) 单条记录,单个表,一个数据库的最大限制是多少?<br/>
<a href="#4.5">4.5</a>) 存储一个典型的文本文件里的数据需要多少磁盘空间?<br/>
<a href="#4.6">4.6</a>) 为什么我的查询很慢?为什么这些查询没有利用索引?<br/>
<a href="#4.7">4.7</a>) 我如何才能看到查询优化器是怎样评估处理我的查询的?<br/>
<a href="#4.8">4.8</a>) 我怎样做正则表达式搜索和大小写无关的正则表达式查找?怎样利用索引进行大小写无关查找?<br/>
<a href="#4.9">4.9</a>) 在一个查询里,我怎样检测一个字段是否为 NULL?我如何才能准确排序而不论某字段是否含NULL值?<br/>
<a href="#4.10">4.10</a>) 各种字符类型之间有什么不同?<br/>
<a href="#4.11.1">4.11.1</a>) 我怎样创建一个序列号型或是自动递增的字段?<br/>
<a href="#4.11.2">4.11.2</a>) 我如何获得一个插入的序列号的值?<br/>
<a href="#4.11.3">4.11.3</a>) 同时使用 currval() 会导致和其他用户的冲突情况吗?<br/>
<a href="#4.11.4">4.11.4</a>) 为什么不在事务异常中止后重用序列号呢?为什么在序列号字段的取值中存在间断呢?<br/>
<a href="#4.12">4.12</a>) 什么是 OID?什么是 CTID ?<br/>
<a href="#4.13">4.13</a>) 为什么我收到错误信息“<i>ERROR: Memory exhausted in AllocSetAlloc()</i>”?<br/>
<a href="#4.14">4.14</a>) 我如何才能知道所运行的 PostgreSQL 的版本?<br/>
<a href="#4.15">4.15</a>) 我如何创建一个缺省值是当前时间的字段?<br/>
<a href="#4.16">4.16</a>) 如何执行外连接(outer join)查询?<br/>
<a href="#4.17">4.17</a>) 如何执行涉及多个数据库的查询?<br/>
<a href="#4.18">4.18</a>) 如何让函数返回多行或多列数据?<br/>
<a href="#4.19">4.19</a>) 为什么我在使用PL/PgSQL函数存取临时表时会收到错误信息“relation with OID ##### does not exist”?<br/>
<a href="#4.20">4.20</a>) 目前有哪些数据复制方案可用?<br/>
<a href="#4.21">4.21</a>) 为何查询结果显示的表名或列名与我的查询语句中的不同?为何大写状态不能保留?<br/>
</p> </p>
<p>
下面就是我们使用的BSD版权内容: <hr/>
<h2><a name="常见问题"></a> 常见问题 </h2>
<h3> <a name="1.1"></a>1.1)PostgreSQL 是什么?该怎么发音? </h3>
<p>PostgreSQL 读作 <i>Post-Gres-Q-L</i>,有时候也简称为<i>Postgres</i> 。想听一下其发音的人员可从这里下载声音文件:
<a href="http://www.postgresql.org/files/postgresql.mp3">MP3 格式</a>
</p> </p>
<p> <p>PostgreSQL 是面向目标的关系数据库系统,它具有传统商业数据库系统的所有功能,同时又含有将在下一代 DBMS 系统的使用的增强特性。PostgreSQL 是自由免费的,并且所有源代码都可以获得。
部分版权(c)1996-2005,PostgreSQL 全球开发小组,部分版权(c)1994-1996 加州大学董事
</p> </p>
<p>PostgreSQL 的开发队伍主要为志愿者,他们遍布世界各地并通过互联网进行联系,这是一个社区开发项目,它不被任何公司控制。
如想加入开发队伍,请参见开发人员常见问题(FAQ)
<a href="http://www.postgresql.org/files/documentation/faqs/FAQ_DEV.html">http://www.postgresql.org/files/documentation/faqs/FAQ_DEV.html</a>
</p>
<h3> <a name="1.2"></a>1.2) 谁控制PostgreSQL ? </h3>
<p> <p>
(Portions copyright (c) 1996-2005, PostgreSQL Global Development Group Portions Copyright (c) 1994-6 Regents of the University of California) 如果你在寻找PostgreSQL的掌门人,或是什么中央委员会,或是什么所属公司,你只能放弃了---因为一个也不存在,但我们的确有一个
核心委员会和CVS管理组,但这些工作组的设立主要是为了进行管理工作而不是对PostgreSQL进行独占式控制,PostgreSQL项目是由任何人均
可参加的开发人员社区和所有用户控制的,你所需要做的就是订阅邮件列表,参与讨论即可(要参与PostgreSQL的开发详见
<a href="http://www.postgresql.org/docs/faqs.FAQ_DEV.html"> 开发人员常问题 (Developer's FAQ) </a>获取信息)。
</p> </p>
<h3> <a name="1.3"></a>1.3)PostgreSQL的版权是什么? </h3>
<p>PostgreSQL的发布遵从经典的BSD版权。它允许用户不限目的地使用PostgreSQL,甚至你可以销售PostgreSQL而不含源代码也可以,唯一的限制就是你不能因软件自身问题而向我们追诉法律责任,另外就是要求所有的软件拷贝中须包括以下版权声明。下面就是我们所使用的BSD版权声明内容:</p>
<p>PostgreSQL数据库管理系统</p>
<p> 部分版权(c)1996-2005,PostgreSQL 全球开发小组,部分版权(c)1994-1996 加州大学董事</p>
<p> (Portions copyright (c) 1996-2005,PostgreSQL Global Development Group Portions Copyright (c) 1994-6 Regents of the University of California)</p>
<p> <p>
允许为任何目的使用,拷贝,修改和分发这个软件和它的文档而不收取任何费用, 允许为任何目的使用,拷贝,修改和分发这个软件和它的文档而不收取任何费用,
并且无须签署因此而产生的证明,前提是上面的版权声明和本段以及下面两段文字出现在所有拷贝中。 并且无须签署因此而产生的证明,前提是上面的版权声明和本段以及下面两段文字出现在所有拷贝中。
</p> </p>
<p> <p>
(Permission to use, copy, modify, and distribute this software and its (Permission to use, copy, modify, and distribute this software and its
documentation for any purpose, without fee, and without a written agreement is documentation for any purpose, without fee, and without a written agreement is
hereby granted, provided that the above copyright notice and this paragraph and hereby granted, provided that the above copyright notice and this paragraph and
the following two paragraphs appear in all copies.) the following two paragraphs appear in all copies.)
</p> </p>
<p> <p>
在任何情况下,加州大学都不承担因使用此软件及其文档而导致的对任何当事人的直接的, 在任何情况下,加州大学都不承担因使用此软件及其文档而导致的对任何当事人的直接的,
间接的,特殊的,附加的或者相伴而生的损坏,包括利益损失的责任,即使加州大学已经建议了这些损失的可能性时也是如此。 间接的,特殊的,附加的或者相伴而生的损坏,包括利益损失的责任,即使加州大学已经建议了这些损失的可能性时也是如此。
</p> </p>
<p> <p>
(IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR (IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR
DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST
PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGE.) DAMAGE.)
</p> </p>
<p> <p>
加州大学明确放弃任何保证,包括但不局限于某一特定用途的商业和利益的隐含保证。 加州大学明确放弃任何保证,包括但不局限于某一特定用途的商业和利益的隐含保证。
这里提供的这份软件是基于“当作是”的基础的,因而加州大学没有责任提供维护,支持,更新,增强或者修改的服务。 这里提供的这份软件是基于“当作是”的基础的,因而加州大学没有责任提供维护,支持,更新,增强或者修改的服务。
</p> </p>
<p> <p>
(THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT (THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT
NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND
THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE,
SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.)<br/> SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.)<br/>
</p> </p>
<h4><a name="1.3"></a>1.3)PostgreSQL 可以运行在哪些操作系统平台上?</h4> <h3> <a name="1.4"></a>1.4)PostgreSQL 可以运行在哪些操作系统平台上? </h3>
<p> <p> 一般说来,任何现在对 UNIX 兼容的操作系统之上都能运行PostgreSQL 。在安装指南里列出了发布时经过明确测试的平台。</p>
一般说来,一个现代的 UNIX 兼容的平台都能运行 PostgreSQL 。在安装指南里列出了发布时经过明确测试的平台。
</p>
<p>
PostgreSQl也可以直接运行在基于微软Windows-NT的操作系统,如Win2000,WinXP 和 Win2003,已制作完成的安装包可从 <p>PostgreSQl也可以直接运行在基于微软Windows-NT的操作系统,如Win2000 SP4,WinXP 和 Win2003,已制作完成的安装包可从
<a href="http://pgfoundry.org/projects/pginstaller">http://pgfoundry.org/projects/pginstaller</a>下载,基于MSDOS的Windows操作系统 <a href="http://pgfoundry.org/projects/pginstaller">http://pgfoundry.org/projects/pginstaller</a>下载,基于MSDOS的Windows操作系统
(Win95,Win98,WinMe)需要通过Cygwin模拟环境运行PostgreSQL。 (Win95,Win98,WinMe)需要通过Cygwin模拟环境运行PostgreSQL。
</p> </p>
<p> <p>
同时也有一个为Novell Netware 6开发的版本可从<a href="http://forge.novell.com"> http://forge.novell.com </a>获取,为OS/2开发的版本可从 同时也有一个为Novell Netware 6开发的版本可从 <a href="http://forge.novell.com" target="_top">http://forge.novell.com</a>获取,为OS/2(eComStation)开发的版本可从
<a href="http://hobbes.nmsu.edu/cgi-bin/h-search?sh=1&amp;button=Search&amp;key=postgreSQL&amp;stype=all&amp;sort=type&amp;dir=%2F"> <a href="http://hobbes.nmsu.edu/cgi-bin/h-search?sh=1&amp;button=Search&amp;key=postgreSQL&amp;stype=all&amp;sort=type&amp;dir=%2F" target="_top">http://hobbes.nmsu.edu/cgi-bin/h-search?sh=1&amp;button=Search&amp;key=postgreSQL&amp;stype=all&amp;sort=type&amp;dir=%2F</a> 下载。
http://hobbes.nmsu.edu/cgi-bin/h-search?sh=1&amp;button=Search&amp;key=postgreSQL&amp;stype=all&amp;sort=type&amp;dir=%2F</a>
</p> </p>
<h4><a name="1.4"></a>1.4)我从哪里能得到 PostgreSQL?</h4> <h3> <a name="1.5"></a>1.5) 我从哪里能得到PostgreSQL? </h3>
<p> <p>
通过浏览器可从<a href="http://www.postgresql.org/ftp/">http://www.postgresql.org/ftp/</a>下载,也可通过FTP,从 通过浏览器可从<a href="http://www.postgresql.org/ftp/">http://www.postgresql.org/ftp/</a>下载,也可通过FTP,从
<a href="ftp://ftp.PostgreSQL.org/pub/">ftp://ftp.PostgreSQL.org/pub/</a>站点下载。 <a href="ftp://ftp.PostgreSQL.org/pub/">ftp://ftp.PostgreSQL.org/pub/</a>站点下载。
</p> </p>
<h3> <a name="1.6"></a>1.6) 最新版的PostgreSQL是什么? </h3>
<h4><a name="1.5"></a>1.5)我从哪里能得到对 PostgreSQL 的支持?</h4>
<p> <p>PostgreSQL 最新的版本是版本 8.2.1 。</p>
PostgreSQL社区通过邮件列表为其大多数用户提供帮助,加入邮件列表的主站点是<a href="http://www.postgresql.org/community/lists/"> http://www.postgresql.org/community/lists/</a>,一般情况下,先加入<i>General</i><i>Bug</i>邮件列表是一个较好的开始。
<p>我们计划每年发布一个主要升级版本,每几个月发布一个小版本。</p>
<h3> <a name="1.7"></a>1.7) 我从哪里能得到对PostgreSQL的支持? </h3>
<p>PostgreSQL社区通过邮件列表为其大多数用户提供帮助,订阅邮件列表的主站点是 <a href="http://www.postgresql.org/community/lists/" target="_top">http://www.postgresql.org/community/lists/</a>,一般情况下,先加入<i>General</i><i>Bug</i>邮件列表是一个较好的开始。
</p> </p>
<p> <p>
主要的IRC频道是在FreeNode(<i>irc.freenode.net</i>)的<i>#postgresql</i>,为了连上此频道,可以使用UNIX程序irc,其指令格式: 主要的IRC频道是在FreeNode(<i>irc.freenode.net</i>)的<i>#postgresql</i>,为了连上此频道,可以使用UNIX程序irc,其指令格式:
irc -c '#postgresql' "$USER" irc.freenode.net ,或者使用其他IRC客户端程序。在此网络中还存在一个PostgreSQL的西班牙频道(<i>#postgersql-es</i>)和法语频道 irc -c '#postgresql' "$USER" irc.freenode.net ,或者使用其他IRC客户端程序。在此网络中还存在一个PostgreSQL的西班牙频道(<i>#postgersql-es</i>)和法语频道
(<i>#postgresql-fr</i>)。同样地,在EFNET上也有一个PostgreSQL的交流频道。 (<i>#postgresql-fr</i>)。同样地,在EFNET上也有一个PostgreSQL的交流频道。
</p> </p>
<p> <p>
商业支持公司的列表在<a href=" http://techdocs.postgresql.org/companies.php"> http://techdocs.postgresql.org/companies.php</a> 可提供商业支持的公司列表可在<a href="http://techdocs.postgresql.org/companies.php" target="_top">http://techdocs.postgresql.org/companies.php</a>浏览。
</p> </p>
<h4><a name="1.6"></a>1.6)我如何提交一个BUG报告?</h4> <h3> <a name="1.8"></a>1.8) 我如何提交一个BUG报告? </h3>
<p> <p>
可访问 <a href="http://www.postgresql.org/support/submitbug">http://www.postgresql.org/support/submitbug</a>,填写Bug上报表格即可。 可访问 <a href="http://www.postgresql.org/support/submitbug">http://www.postgresql.org/support/submitbug</a>,填写Bug上报表格即可,同样也可访问ftp站点<a href="ftp://ftp.PostgreSQL.org/pub/">ftp://ftp.PostgreSQL.org/pub/</a> 检查有无更新的PostgreSQL版本或补丁。
</p> </p>
<p> <p>
同样也可访问ftp站点<a href="ftp://ftp.PostgreSQL.org/pub/">ftp://ftp.PostgreSQL.org/pub/</a> 检查有无更新的PostgreSQL版本或补丁。 通过使用Bug提交表格或是发往PostgreSQL邮件列表的Bug通常会有以下之一回复:
</p> </p>
<ul>
<li>所提交内容不是一个Bug及其不是Bug的原因。</li>
<li>所提交内容是一个已知的Bug并且已经加入TODO待处理任务列表。</li>
<li>所提交的Bug已在当前版本中被修正。</li>
<li>所提交的Bug已修正但尚未将补丁加入现在的发布软件包。</li>
<li>请求提交者提供更详细的信息:
<ul>
<li>操作系统</li>
<li>PostgreSQL版本</li>
<li>可重现Bug的测试案例</li>
<li>调试信息</li>
<li>调试跟踪输出</li>
</ul>
</li>
<li>所提交内容是一个新Bug,将执行以下工作:
<ul>
<li>创建一个新补丁并将其加入下一个主要版本或是小的改进版本中。</li>
<li>此Bug暂时不能修正,将被加至TODO待处理任务列表。</li>
</ul>
</li>
</ul>
<h3> <a name="1.9"></a>1.9) 我如何了解已知的 BUG 或暂缺的功能? </h3>
<p>PostgreSQL 支持一个扩展的 SQL:2003 的子集。参阅我们的<a href="http://www.postgresql.org/docs/faqs.TODO.html">TODO</a> 列表,了解已知Bug列表、暂缺的功能和将来的开发计划。
<h4><a name="1.7"></a>1.7)最新版的PostgreSQL 是什么?</h4>
<p>
PostgreSQL 最新的版本是版本 8.0.2 (译注:现最新版本为8.0.3)。
</p> </p>
<p>要求增加新功能的申请通常会收到以下之一的回复:</p>
<ul>
<li>该功能已加入TODO待处理任务列表。</li>
<li>该功能不是必须的,因为:
<ul>
<li>它是现有的且符合SQL标准的某功能的重复。</li>
<li>该功能性会大大增加代码的复杂程序,而带来的好处是微不足道的。</li>
<li>该功能是不安全或是不可靠的。</li>
</ul>
</li>
<li>该功能将被加入TODO待处理任务列表。</li>
</ul>
<p> <p>
我们计划每年发布一个主要版本,每几个月发布一个小版本。 PostgreSQL不使用Bug跟踪系统,因为我们发现在邮件列表中直接回复以及保证TODO任务列表总是处于最新状态的方式工作效率会更高一些。事实上,Bug不会在我们的软件中存在很长时间,
对影响很多用户的Bug也总是很快会被修正。唯一能找到所有改进、提高和修正的地方是CVS的日志信息,即使是在软件新版本的发布信息中也不会列出每一处的软件更新。
</p> </p>
<h4><a name="1.8"></a>1.8)能够获取的最新文档有哪些?</h4>
<p> <h3> <a name="1.10"></a>1.10) 能够获取的最新文档有哪些? </h3>
PostgreSQL包含大量的文档,主要有一些手册,手册页和一些的测试例子。参见 /doc 目录(译注:应为 $PGHOME/doc)。
你还可以在线浏览 PostgreSQL 的手册,其地址是:<a href="http://www.PostgreSQL.org/docs">http://www.PostgreSQL.org/docs</a>
<p>PostgreSQL包含大量的文档,主要有详细的参考手册,手册页和一些的测试例子。参见 /doc 目录(译注:应为 $PGHOME/doc)。
你还可以在线浏览PostgreSQL的手册,其网址是:<a href="http://www.PostgreSQL.org/docs">http://www.PostgreSQL.org/docs</a>
</p> </p>
<p> <p>
有两本关于 PostgreSQL 的书在线提供,在 有两本关于PostgreSQL的书在线提供,在
<a href="http://www.PostgreSQL.org/docs/awbook.html">http://www.PostgreSQL.org/docs/awbook.html</a> <a href="http://www.PostgreSQL.org/docs/awbook.html">http://www.PostgreSQL.org/docs/awbook.html</a>
<a href="http://www.commandprompt.com/ppbook/">http://www.commandprompt.com/ppbook/</a> <a href="http://www.commandprompt.com/ppbook/">http://www.commandprompt.com/ppbook/</a>
也有大量的PostgreSQL书籍可供购买,其中最为流行的一本是由Korry Douglas编写的。在 也有大量的PostgreSQL书籍可供购买,其中最为流行的一本是由Korry Douglas编写的。在
<a href="http://techdocs.PostgreSQL.org/techdocs/bookreviews.php">http://techdocs.PostgreSQL.org/techdocs/bookreviews.php</a> <a href="http://techdocs.PostgreSQL.org/techdocs/bookreviews.php">http://techdocs.PostgreSQL.org/techdocs/bookreviews.php</a>
上有大量有关PostgreSQL书籍的简介。 上有大量有关PostgreSQL书籍的简介。
<a href="http://techdocs.PostgreSQL.org/">http://techdocs.PostgreSQL.org/</a>上收集了有关 PostgreSQL 的大量技术文章。 <a href="http://techdocs.PostgreSQL.org/">http://techdocs.PostgreSQL.org/</a>上收集了有关PostgreSQL的大量技术文章。
</p>
<p>
客户端的命令行程序<i>psql</i>有一些以 \d 开头的命令,可显示关于类型,操作符,函数,汇总等的信息,使用 \? 可以显示所有可用的命令。
</p> </p>
<p> <p>
我们的 web 站点包含更多的文档。 客户端的命令行程序<i>psql</i>有一些以 \d 开头的命令,可显示关于类型,操作符,函数,聚合等信息,使用 \? 可以显示所有可用的命令。
</p> </p>
<h4><a name="1.9"></a>1.9)我如何了解已知的 BUG 或暂缺的功能?</h4>
<p> <p>
PostgreSQL 支持一个扩展了的 SQL-92 的子集。参阅我们的<a href="http://www.postgresql.org/docs/faqs.TODO.html">TODO</a> 列表,获取一个已知Bug,暂缺的功能和将来的计划。 我们的 web 站点包含更多的文档。
</p> </p>
<h4><a name="1.10"></a>1.10)我应该怎样学习 SQL ?</h4>
<h3> <a name="1.11"></a>1.11) 我应该怎样学习 SQL ? </h3>
<p> <p>
首先考虑上述提到的与PostgreSQL相关的书籍,另外一本是<i>Teach Yourself SQL in 21 Days, Second Edition</i> 首先考虑上述提到的与PostgreSQL相关的书籍,另外一本是<i>Teach Yourself SQL in 21 Days, Second Edition</i>,其详细介绍的网址是
我们的许多用户喜欢<i>The Practical SQL Handbook</i> Bowman, Judith S., et al., Addison-Wesley,其他的则喜欢 <a href="http://members.tripod.com/er4ebus/sql/index.htm">http://members.tripod.com/er4ebus/sql/index.htm</a>
<i>The Complete Reference SQL</i>, Groff et al., McGraw-Hill。 我们的许多用户喜欢<i>The Practical SQL Handbook</i>, Bowman, Judith S. 编写,Addison-Wesley公司出版,其他的则喜欢
<i>The Complete Reference SQL</i>, Groff 编写,McGraw-Hill公司出版。
</p> </p>
<p>在下列网址上也有很好的教程,他们是</p>
<ul>
<li><a href="http://www.intermedia.net/support/sql/sqltut.shtm">http://www.intermedia.net/support/sql/sqltut.shtm</a></li>
<li><a href="http://sqlcourse.com/">http://sqlcourse.com.</a></li>
<li><a href="http://www.w3schools.com/sql/default.asp">http://www.w3schools.com/sql/default.asp</a></li>
<li><a href="http://mysite.verizon.net/Graeme_Birchall/id1.html">http://mysite.verizon.net/Graeme_Birchall/id1.html</a></li>
</ul>
<h4><a name="1.11"></a>1.11)我应该怎样加入开发队伍?</h4>
<h3> <a name="1.12"></a>1.12)如何提交补丁或是加入开发队伍? </h3>
<p> <p>
详见<a href="http://www.postgresql.org/docs/faqs.FAQ_DEV.html"> Developer's FAQ </a> 详见<a href="http://www.postgresql.org/docs/faqs.FAQ_DEV.html"> 开发人员常见问题 (Developer's FAQ) </a>
</p> </p>
<h4><a name="1.12"></a>1.12)PostgreSQL 和其他数据库系统比起来如何?</h4> <h3> <a name="1.13"></a>1.13)PostgreSQL和其他数据库系统比起来如何? </h3>
<p> <p>
评价软件有好几种方法:特性,性能,可靠性,支持和价格。 评价软件有好几种方法:功能,性能,可靠性,支持和价格。
</p> </p>
<dl> <dl>
<dt><b>特性</b></dt> <dt><b>功能</b></dt>
<dd> <dd>PostgreSQL 拥有大型商用数据库最多的功能,例如:事务,子查询,触发器,视图,外键参考完整性和复杂的锁定等。
PostgreSQL 拥有大型商用 DBMS 里大多数特性, 我们还有一些它们没有的特性,如用户定义类型,继承,规则和多版本并行控制以减少锁的争用等。<br/>
例如:事务,子查询,触发器,视图,外键参考完整性和复杂的锁等。
我们还有一些它们没有的特性,如用户定义类型,继承,规则和多版本并行控制以减少锁的争用等。<br/>
</dd> </dd>
<dt><b>性能</b></dt> <dt><b>性能</b></dt>
<dd> <dd>PostgreSQL和其他商用和开源的数据库具有类似的性能。对某些处理它比较快,对其他一些处理它比较慢。
PostgreSQL 和其他商用和开源的数据库具有类似的性能。 与其他数据库相比,我们的性能优劣通常在 +/- 10%之间。<br/>
对某些处理它比较快,对其他一些处理它比较慢。
与其他数据库相比,我们的性能通常在 +/- 10%之间。<br/>
</dd> </dd>
<dt><b>可靠性</b></dt> <dt><b>可靠性</b></dt>
<dd> <dd>
我们知道 DBMS 必须是可靠的,否则它就一点用都没有。
我们努力做到发布经过认真测试的,稳定的臭虫最少的代码。每个版本至少有一个月的 beta 我们都知道数据库必须是可靠的,否则它就一点用都没有。我们努力做到发布经过认真测试的,缺陷最少的稳定代码。每个版本至少有一个月的 beta
测试时间,并且我们的发布历史显示我们可以提供稳定的,牢固的,可用于生产使用的版本。我们相信 测试时间,并且我们的发布历史显示我们可以提供稳定的,牢固的,可用于生产使用的版本。我们相信在这方面我们与其他的数据库软件是相当的。<br/>
在这方面我们与其他的数据库软件是相当的。<br/>
</dd> </dd>
<dt><b>支持</b></dt> <dt><b>支持</b></dt>
<dd> <dd>
我们的邮件列表提供一个非常大的开发人员和用户的组以帮助解决所碰到的任何问题。 我们的邮件列表提供一个非常大的开发人员和用户的组以帮助解决所碰到的任何问题。我们不能保证总是能解决问题,相比之下,商用数据库软件也并不是总能够提供解决方法。
我们不能保证肯定能解决问题,相比之下,商用 DBMS 也并不是总能够提供解决方法。 直接与开发人员,用户群,手册和源程序接触使PostgreSQL的支持比其他数据库还要好。还有一些商业性的全面技术支持,可以给提供给那些需要的人。(参阅1.7 小节)<br/>
直接与开发人员,用户群,手册和源程序接触令 PostgreSQL 的支持比其他 DBMS
还要好。还有一些商业性的预包装的支持,可以给提供给那些需要的人。(参阅 FAQ 条款 1.5 小节)<br/>
</dd> </dd>
<dt><b>价格</b></dt>
<dt><b>价格</b></dt>
<dd> <dd>
我们对任何用途都免费,包括商用和非商用目的。 我们对任何用途都免费,包括商用和非商用目的。
你可以不加限制地向你的产品里加入我们的代码,除了那些我们在上面的版权声明里声明的 BSD 风格的版权外。 你可以不加限制地向你的产品里加入我们的代码,除了那些我们在上面的版权声明里声明的 BSD版权之外的内容。
</dd> </dd>
</dl> </dl>
<h4><a name="1.13"></a>1.13)谁控制PostgreSQL ?</h4>
<p>
如果你在寻找PostgreSQL的掌门人,或是什么中央委员会,或是什么所属公司,你只能放弃了---因为一个也不存在,但我们的确有一个
委员会和CVS管理组,但这些工作组的设立主要是为了进行管理工作而不是对PostgreSQL进行控制,PostgreSQL项目是由任何人均
可参加的开发人员社区和所有用户控制的,你所需要做的就是加入邮件列表,参与讨论即可(要参与PostgreSQL的开发详见
<a href="http://www.postgresql.org/docs/faqs.FAQ_DEV.html"> Developer's FAQ </a>获取信息)。
</p>
<hr/> <hr/>
<div> <h2>用户客户端问题</h2> </div> <h2><a name="用户客户端问题"></a> 用户客户端问题 </h2>
<h4><a name="2.1"></a>2.1)我们可以用什么语言和 PostgreSQL 打交道?</h4>
<p> <h3> <a name="2.1"></a>2.1) 我们可以用什么语言和PostgreSQL打交道? </h3>
PostgreSQL(缺省情况)只安装有C和内嵌式C的接口,其他的接口都是独立的项目,能够分别下载,这些接口项目独立的好处
是他们可以有各自的发布计划和各自独立的开发组。 <p>PostgreSQL(缺省情况)只安装有C和内嵌式C的接口,其他的接口都是独立的项目,能够分别下载,这些接口项目独立的好处
是他们可以有各自的发布计划和各自独立的开发组。
</p> </p>
<p> <p>
一些编程语言如PHP都有访问 PostgreSQL 的接口,Perl,TCL,Python以及很多其他语言的接口在 一些编程语言如PHP都有访问PostgreSQL的接口,Perl、TCL、Python以及很多其他语言的接口在
<a href="http://gborg.postgresql.org/"> http://gborg.postgresql.org </a>上的<i>Drivers/Interfaces</i>小节可找到, <a href="http://gborg.postgresql.org" target="_top">http://gborg.postgresql.org</a>网站上的<i>Drivers/Interfaces</i>小节可找到,
并且通过Internet很容易搜索到。 并且通过Internet很容易搜索到。
</p> </p>
<h4><a name="2.2"></a>2.2)有什么工具可以把 PostgreSQL 用于 Web 页面?</h4>
<h3> <a name="2.2"></a>2.2) 有什么工具可以把PostgreSQL用于 Web 页面? </h3>
<p> <p>
一个介绍以数据库为后台的挺不错的站点是:<a href="http://www.webreview.com">http://www.webreview.com</a> 一个介绍以数据库为后台的挺不错的站点是:<a href="http://www.webreview.com">http://www.webreview.com</a>
</p> </p>
<p> <p>
对于 Web 集成,PHP 是一个极好的接口。它在:<a href="http://www.php.net/">http://www.php.net/</a> 对于 Web 集成,PHP 是一个极好的接口。它在<a href="http://www.php.net/">http://www.php.net/</a>
</p> </p>
<p> <p>
对于复杂的任务,很多人采用 Perl 接口和 CGI.pm 或 mod_perl 。 对于复杂的任务,很多人采用 Perl 接口和 使用CGI.pm的DBD::Pg 或 mod_perl 。
</p> </p>
<h4><a name="2.3"></a>2.3)PostgreSQL 拥有图形用户界面吗?</h4> <h3> <a name="2.3"></a>2.3)PostgreSQL拥有图形用户界面吗? </h3>
<p> <p>
是的,在 <a href="http://techdocs.postgresql.org/guides/GUITools">http://techdocs.postgresql.org/guides/GUITools</a>有一个详细的列表。 商业用户或是开源开发人员能找到很多的有关PostgreSQL的GUI图形工具软件,在 <a href="http://www.postgresql.org/docs/techdocs.54">PostgreSQL社区文档</a>有一个详细的列表。
</p> </p>
<hr/> <hr/>
<div> <h2>系统管理问题</h2> </div>
<h4><a name="3.1"></a>3.1)我怎样能把 PostgreSQL 装在 /usr/local/pgsql 以外的地方?</h4>
<h2><a name="系统管理问题"></a> 系统管理问题 </h2>
<h3> <a name="3.1"></a>3.1)我怎样能把PostgreSQL装在 /usr/local/pgsql 以外的地方? </h3>
<p> <p>
在运行 configure 时加上 --prefix 选项。 在运行 configure 时加上 --prefix 选项。
</p> </p>
<h4><a name="3.2"></a>3.2)我如何控制来自其他主机的连接?</h4>
<h3> <a name="3.2"></a>3.2) 我如何控制来自其他电脑的连接? </h3>
<p> <p>
缺省时,PostgreSQL 只允许通过 unix 域套接字或TCP/IP方式且来自本机的连接。 缺省情况下,PostgreSQL只允许来自本机且通过 unix 域套接字或TCP/IP方式的连接。
你只有在修改了配置文件<i>postgresql.conf</i>中的<i>listen_addresses</i>,且也在配置文件<i>pg_hba.conf</i>中打开了 你只有在修改了配置文件<i>postgresql.conf</i>中的<i>listen_addresses</i>,且也在配置文件<i>$PGDATA/pg_hba.conf</i>中打开了
主机为基础( host-based )的身份认证,并重新启动PostgreSQL,否则其他机器是不能与你的PostgreSQL服务器连接的。 基于远程电脑( host-based )的身份认证,并重新启动PostgreSQL,否则其他电脑是不能与你的PostgreSQL服务器进行连接的。
</p> </p>
<h4><a name="3.3"></a>3.3)我怎样调整数据库引擎以获得更好的性能?</h4> <h3> <a name="3.3"></a>3.3) 我怎样调整数据库引擎以获得更好的性能? </h3>
<p> <p>
有三个主要方面可以提升PostgreSQL的潜能。 有三个主要方面可以提升PostgreSQL的潜能。
</p> </p>
<dl> <dl>
<dt><b>查询方式的变化</b></dt> <dt><b>查询方式的变化</b></dt>
<dd> <dd>
这主要涉及修改查询方式以获取更好的性能: 这主要涉及修改查询方式以获取更好的性能:
<ul> <ul>
<li>创建索引,包括表达式和部分索引;</li> <li>创建索引,包括表达式和部分索引;</li>
<li>使用COPY语句代替多个Insert语句;</li>
<li>将多个SQL语句组成一个事务以减少提交事务的开销;</li> <li>使用COPY语句代替多个Insert语句;</li>
<li>从一个索引中提取多条记录时使用CLUSTER;</li> <li>将多个SQL语句组成一个事务以减少提交事务的开销;</li>
<li>从一个查询结果中取出部分记录时使用LIMIT;</li> <li>从一个索引中提取多条记录时使用CLUSTER;</li>
<li>使用预编译式查询(Prepared Query);</li> <li>从一个查询结果中取出部分记录时使用LIMIT;</li>
<li>使用ANALYZE以保持精确的优化统计;</li> <li>使用预编译式查询(Prepared Query);</li>
<li>定期使用 VACUUM 或 <i>pg_autovacuum</i></li> <li>使用ANALYZE以保持精确的优化统计;</li>
<li>进行大量数据更改时先删除索引(然后重建索引)</li>
<li>定期使用 VACUUM 或 <i>pg_autovacuum</i></li>
<li>进行大量数据更改时先删除索引(然后重建索引)</li>
</ul> </ul>
</dd> </dd>
<dt><b>服务器的配置</b></dt> <dt><b>服务器的配置</b></dt>
<dd> <dd>
配置文件<i>postgres.conf</i>中的很多设置都会影响性能,所有参数的列表可见:
<a href="http://www.postgresql.org/docs/current/static/runtime.html">Administration Guide/Server Run-time Environment/Run-time Configuration</a> 配置文件<i>postgres.conf</i>中的很多设置都会影响性能,所有参数的列表可见:
有关参数的解释可见:<a href="http://www.varlena.com/varlena/GeneralBits/Tidbits/annotated_conf_e.html"> <a href="http://www.postgresql.org/docs/current/static/runtime.html">管理员指南/数据库服务器运行环境/数据库服务器运行配置</a>
http://www.varlena.com/varlena/GeneralBits/Tidbits/annotated_conf_e.html </a> 有关参数的解释可见:<a href="http://www.varlena.com/varlena/GeneralBits/Tidbits/annotated_conf_e.html" target="_top">http://www.varlena.com/varlena/GeneralBits/Tidbits/annotated_conf_e.html</a>
<a href="http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html">http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html</a> <a href="http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html">http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html</a>
</dd> </dd>
<dt><b>硬件的选择</b></dt> <dt><b>硬件的选择</b></dt>
<dd> <dd>
计算机硬件对性能的影响可浏览 <a href="http://candle.pha.pa.us/main/writings/pgsql/hw_performance/index.html"> 计算机硬件对性能的影响可浏览
http://candle.pha.pa.us/main/writings/pgsql/hw_performance/index.html</a> <a href="http://candle.pha.pa.us/main/writings/pgsql/hw_performance/index.html" target="_top">http://candle.pha.pa.us/main/writings/pgsql/hw_performance/index.html</a>
<a href="http://www.powerpostgresql.com/PerfList/">http://www.powerpostgresql.com/PerfList/</a> <a href="http://www.powerpostgresql.com/PerfList/">http://www.powerpostgresql.com/PerfList/</a>
</dd> </dd>
</dl> </dl>
<h4><a name="3.4"></a>3.4)PostgreSQL 里可以获得什么样的调试特性?</h4> <h3> <a name="3.4"></a>3.4)PostgreSQL里可以获得什么样的调试特性? </h3>
<p>
PostgreSQL 有很多类似<i> log_* </i>的服务器配置变量可用于查询的打印和进程统计,而这些工作对调试和性能测试很有帮助。
<p>PostgreSQL 有很多类似<code> log_* </code>的服务器配置变量可用于查询的打印和进程统计,而这些工作对调试和性能测试很有帮助。
</p> </p>
<h4><a name="3.5"></a>3.5)为什么在试图连接时收到“Sorry, too many clients”消息?</h4> <h3> <a name="3.5"></a>3.5) 为什么在试图连接时收到“Sorry, too many clients(已有太多用户连接)”消息? </h3>
<p> <p>
这表示你已达到缺省100个并发后台进程数的限制,你需要通过修改<i>postgresql.conf</i>文件中的<i>max_connections</i>值来 这表示你已达到缺省100个并发后台进程数的限制,你需要通过修改<i>postgresql.conf</i>文件中的<i>max_connections</i>值来
增加postmaster的后台并发处理数,修改后需重新启动<i>postmaster</i> 增加postmaster的后台并发处理数,修改后需重新启动<i>postmaster</i>
</p> </p>
<h4><a name="3.6"></a>3.6)为什么要在升级 PostgreSQL 主要发布版本时做 dump 和 restore ?</h4> <h3> <a name="3.6"></a>3.6)PostgreSQL的升级过程有哪些内容 ? </h3>
<p>
PostgreSQL 开发组对每次小版本的升级主要只做了一些Bug修正工作,因此从 7.4.8 升级到 7.4.9 不需要 dump 和 restore,仅需要停止数据库服务器,安装更新后的软件包,然后重启服务器即可。
</p>
<p> <p>
PostgreSQL 开发组对每次小的升级仅做了较少的修改,因此从 7.4.0 升级到 7.4.1 不需要 dump 和 restore。 所有PostgreSQL的用户应该在最接近(你所使用的主版本)的小改进版本发布尽快升级。尽管每次升级可能都有一点风险,PostgreSQL的小改进版仅仅是设计用来修正一些Bug的,代码改动较少,所以风险还是很小的。PostgreSQL社区认为一般情况下不升级的风险还是多于升级的。
但是主要的升级(例如从 7.3 到 7.4)通常会修改系统表和数据表的内部格式。 </p>
这些变化一般比较复杂,因此我们不维数据文件的向后兼容。 <p>
dump 将数据按照通用的格式输出,随后可以被重新加载并使用新的内部格式。 主版本的升级(例如从 7.3 到 7.4)通常会修改系统表和数据表的内部格式。
这些改变一般比较复杂,因此我们不维持数据文件的向后兼容性。因此从老版本中进行数据导出(dump)/然后在新版本中进行数据导入(reload)对主版本的升级是必须的。
</p> </p>
<h4><a name="3.7"></a>3.7)(使用PostgreSQL)我需要使用什么计算机硬件 ?</h4> <h3> <a name="3.7"></a>3.7)(使用PostgreSQL)我需要使用什么计算机硬件 ? </h3>
<p> <p>
由于计算机硬件大多数是兼容的,人们总是倾向于相信所有计算机硬件质量也是相同的。事实上不是, 由于计算机硬件大多数是兼容的,人们总是倾向于相信所有计算机硬件质量也是相同的。事实上不是,
ECC RAM(带奇偶校验的内存),SCSI (硬盘)和优质的主板比一些便宜货要更加可靠且具有更好的性能。PostgreSQL几乎可以运行在任何硬件上, ECC RAM(带奇偶校验的内存),SCSI (硬盘)和优质的主板比一些便宜货要更加可靠且具有更好的性能。PostgreSQL几乎可以运行在任何硬件上,
但如果可靠性和性能对你的系统很重要,你就需要全面的研究一下你的硬件配置了。在我们的邮件列表上也有关于 但如果可靠性和性能对你的系统很重要,你就需要全面的研究一下你的硬件配置了。在我们的邮件列表上也有关于
硬件配置和性价比的讨论。 硬件配置和性价比的讨论。
</p> </p>
<hr/> <hr/>
<div><h2>操作问题</h2> </div> <h2><a name="操作问题"></a> 操作问题 </h2>
<h4><a name="4.1"></a>4.1)如何只选择一个查询结果的头几行?或是随机的一行?</h4>
<h3> <a name="4.1"></a>4.1) 如何只选择一个查询结果的头几行?或是随机的一行? </h3>
<p> <p>
如果你只是要提取几行数据,并且你在执行查询中知道确切的行数,你可以使用LIMIT功能。 如果你只是要提取几行数据,并且你在执行查询中知道确切的行数,你可以使用LIMIT功能。
如果有一个索引与 <i> ORDER BY</i>中的条件匹配,PostgreSQL 可能就只处理要求的头几条记录, 如果有一个索引与 <i> ORDER BY</i>中的条件匹配,PostgreSQL 可能就只处理要求的头几条记录,
(否则将对整个查询进行处理直到生成需要的行)。如果在执行查询功能时不知道确切的记录数, (否则将对整个查询进行处理直到生成需要的行)。如果在执行查询功能时不知道确切的记录数,
可使用游标(cursor)和FETCH功能。 可使用游标(cursor)和FETCH功能。
</p> </p>
<p> <p>
可使用以下方法提取一行随机记录的: 可使用以下方法提取一行随机记录的:
</p> </p>
<pre> <pre>
SELECT cols SELECT cols
FROM tab FROM tab
ORDER BY random() ORDER BY random()
LIMIT 1 ; LIMIT 1 ;
</pre> </pre>
<h4><a name="4.2"></a>4.2)如何查看表、索引、数据库以及用户的定义?如何查看<i>psql</i>里用到的查询指令并显示它们?</h4> <h3> <a name="4.2"></a>4.2) 如何查看表、索引、数据库以及用户的定义?如何查看<i>psql</i>里用到的查询指令并显示它们? </h3>
<p> <p>
<i>psql</i>中使用 \dt 命令来显示数据表的定义,要了解<i>psql</i>中的完整命令列表可使用\? ,另外,你也可以阅读 <i>psql</i> 的源代码 <i>psql</i>中使用 \dt 命令来显示数据表的定义,要了解<i>psql</i>中的完整命令列表可使用\? ,另外,你也可以阅读 <i>psql</i> 的源代码
文件<i>pgsql/src/bin/psql/describe.c</i>,它包括为生成<i>psql</i>反斜杠命令的输出的所有 SQL 命令。你还可以带 <i>-E</i> 选项启动 <i>psql</i> 文件<i>pgsql/src/bin/psql/describe.c</i>,它包括为生成<i>psql</i>反斜杠命令的输出的所有 SQL 命令。你还可以带 <i>-E</i> 选项启动 <i>psql</i>
这样它将打印出执行你在<i>psql</i>中所给出的命令的内部实际使用的SQL查询。PostgreSQL也提供了一个兼容SQL的INFORMATION SCHEMA接口, 这样它将打印出你在<i>psql</i>中所给出的命令执行时的内部实际使用的SQL查询语句。PostgreSQL也提供了一个兼容SQL的INFORMATION SCHEMA接口,
你可以从这里获取关于数据库的信息。 你可以从这里获取关于数据库的信息。
</p> </p>
<p> <p>
在系统中有一些以<i>pg_</i> 打头的系统表也描述了表的定义。 在系统中也有一些以<i>pg_</i> 打头的系统表也描述了表的定义。
</p> </p>
<p> <p>
使用 <i>psql -l</i> 指令可以列出所有的数据库。 使用 <i>psql -l</i> 指令可以列出所有的数据库。
</p> </p>
<p> <p>
也可以浏览一下 <i>pgsql/src/tutorial/syscat.source</i>文件,它列举了很多可从数据库系统表中获取信息的SELECT语法。 也可以浏览一下 <i>pgsql/src/tutorial/syscat.source</i>文件,它列举了很多可从数据库系统表中获取信息的SELECT语法。
</p> </p>
<h4><a name="4.3"></a>4.3)如何更改一个字段的数据类型?</h4> <h3> <a name="4.3"></a>4.3) 如何更改一个字段的数据类型? </h3>
<p> <p>
在8.0版本里更改一个字段的数据类型很容易,可使用 ALTER TABLE ALTER COLUMN TYPE 。 在8.0版本里更改一个字段的数据类型很容易,可使用 ALTER TABLE ALTER COLUMN TYPE 。
</p> </p>
<p> <p>
在以前的版本中,可以这样做: 在以前的版本中,可以这样做:
</p> </p>
<pre> <pre>
BEGIN; BEGIN;
...@@ -507,204 +597,220 @@ PostgreSQL ...@@ -507,204 +597,220 @@ PostgreSQL
UPDATE tab SET new_col = CAST(old_col AS new_data_type); UPDATE tab SET new_col = CAST(old_col AS new_data_type);
ALTER TABLE tab DROP COLUMN old_col; ALTER TABLE tab DROP COLUMN old_col;
COMMIT; COMMIT;
</pre> </pre>
<p> <p>
你然后可以使用<i>VACUUM FULL tab </i>指令来使系统收回无效数据所占用的空间。 你然后可以使用<i>VACUUM FULL tab </i>指令来使系统收回无效数据所占用的空间。
</p> </p>
<h4><a name="4.4"></a>4.4)一行记录,一个表,一个库的最大尺寸是多少?</h4> <h3> <a name="4.4"></a>4.4) 单条记录,单个表,单个数据库的最大限制是多少? </h3>
<p> <p>
下面是一些限制: 下面是一些限制:
</p> </p>
<blockquote> <blockquote>
<table> <table>
<tbody> <tbody>
<tr><td>一个数据库最大尺寸?</td><td>无限制(已存在有 32TB 的数据库)</td></tr> <tr><td>单个数据库最大尺寸?</td><td>无限制(已存在有 32TB 的数据库)</td></tr>
<tr><td>一个表的最大尺寸?</td><td>32 TB</td></tr> <tr><td>单个表的最大尺寸?</td><td>32 TB</td></tr>
<tr><td>一行记录的最大尺寸?</td><td>1.6 TB</td></tr> <tr><td>一行记录的最大尺寸?</td><td>1.6 TB</td></tr>
<tr><td>一个字段的最大尺寸?</td><td>1 GB</td></tr> <tr><td>一个字段的最大尺寸?</td><td>1 GB</td></tr>
<tr><td>一个表里最大行数?</td><td>无限制</td></tr>
<tr><td>一个表里最大列数?</td><td>250-1600 (与列类型有关)</td></tr> <tr><td>一个表里最大行数?</td><td>无限制</td></tr>
<tr><td>一个表里的最大索引数量?</td><td>无限制</td></tr> <tr><td>一个表里最大列数?</td><td>250-1600 (与列类型有关)</td></tr>
<tr><td>一个表里的最大索引数量?</td><td>无限制</td></tr>
</tbody> </tbody>
</table> </table>
</blockquote> </blockquote>
<p> <p>
当然,实际上没有真正的无限制,还是要受可用磁盘空间、可用内存/交换区的制约。 当然,实际上没有真正的无限制,还是要受可用磁盘空间、可用内存/交换区的制约。
事实上,当这些数值变得异常地大时,系统性能也会受很大影响。 事实上,当上述这些数值变得异常地大时,系统性能也会受很大影响。
</p> </p>
<p> <p>
表的最大尺寸 32 TB 不需要操作系统对大文件的支持。大表用多个 1 GB 的文件存储,因此文件系统尺寸的限制是不重要的。 单表的最大大小 32 TB 不需要操作系统对单个文件也需这么大的支持。大表用多个 1 GB 的文件存储,因此文件系统大小的限制是不重要的。
</p>
<p>
如果缺省的块大小增长到 32K ,最大的单表大小和最大列数还可以增加到四倍。
</p> </p>
<p> <p>
如果缺省的块大小增长到 32K ,最大的表尺寸和最大列数还可以增加到四倍。 有一个限制就是不能对大小多于2000字节的列创建索引。幸运地是这样的索引很少用到。通过对多字节列的内容进行MD5哈稀运算结果进行函数索引可对列的唯一性得到保证,
并且全文检索允许对列中的单词进行搜索。
</p> </p>
<h4><a name="4.5"></a>4.5)存储一个典型的文本文件里的数据需要多少磁盘空间?</h4> <h3> <a name="4.5"></a>4.5) 存储一个典型的文本文件里的数据需要多少磁盘空间? </h3>
<p> <p>
一个 Postgres 数据库(存储一个文本文件)所占用的空间最多可能需要相当于这个文本文件自身大小5倍的磁盘空间。 一个 Postgres 数据库(存储一个文本文件)所占用的空间最多可能需要相当于这个文本文件自身大小5倍的磁盘空间。
</p> </p>
<p> <p>
例如,假设有一个 100,000 行的文件,每行有一个整数和一个文本描述。 例如,假设有一个 100,000 行的文件,每行有一个整数和一个文本描述。
假设文本串的平均长度为20字节。文本文件占用 2.8 MB。存放这些数据的 PostgreSQL 数据库文件大约是 6.4 MB: 假设文本串的平均长度为20字节。文本文件占用 2.8 MB。存放这些数据的PostgreSQL数据库文件大约是 6.4 MB:
</p> </p>
<pre> <pre>
32 字节: 每行的头(估计值) 28 字节: 每行的头(大约值)
24 字节: 一个整数型字段和一个文本型字段 24 字节: 一个整数型字段和一个文本型字段
+ 4 字节: 页面内指向元组的指针 + 4 字节: 页面内指向元组的指针
---------------------------------------- ----------------------------------------
60 字节每行 56 字节每行
PostgreSQL 数据页的大小是 8192 字节 (8 KB),则: PostgreSQL 数据页的大小是 8192 字节 (8 KB),则:
8192 字节每页 8192 字节每页
------------------- = 136 行/数据页(向下取整) ------------------- = 146 行/数据页(向下取整)
60 字节每行 56 字节每行
100000 数据行 100000 数据行
-------------------- = 735 数据页(向上取整) -------------------- = 685 数据页(向上取整)
128 行每页 146 行/数据页
735 数据页 * 8192 字节/页 = 6,021,120 字节(6 MB) 685 数据页 * 8192 字节/页 = 5,611,520 字节(5.6 MB)
</pre> </pre>
<p> <p>
索引不需要这么多的额外消耗,但也确实包括被索引的数据,因此它们也可能很大。 索引不需要这么多的额外消耗,但也确实包括被索引的数据,因此它们也可能很大。
</p> </p>
<p> <p>
空值<i>NULL</i>存放在位图中,因此占用很少的空间。 空值<i>NULL</i>存放在位图中,因此占用很少的空间。
</p> </p>
<h4><a name="4.6"></a>4.6)为什么我的查询很慢?为什么这些查询没有利用索引?</h4> <h3> <a name="4.6"></a>4.6) 为什么我的查询很慢?为什么这些查询没有利用索引? </h3>
<p> <p>
并非每个查询都会自动使用索引。只有在表的大小超过一个最小值,并且查询只会选中表中较小比例的记录时才会采用索引。 并非每个查询都会自动使用索引。只有在表的大小超过一个最小值,并且查询只会选中表中较小比例的记录时才会采用索引。
这是因为索引扫描引起的随即磁盘存取可能比直接地读取表(顺序扫描)更慢。 这是因为索引扫描引起的随即磁盘存取可能比直接地读取表(顺序扫描)更慢。
</p> </p>
<p> <p>
为了判断是否使用索引,PostgreSQL必须获得有关表的统计值。这些统计值可以使用 VACUUM ANALYZE,或 ANALYZE 获得。 为了判断是否使用索引,PostgreSQL必须获得有关表的统计值。这些统计值可以使用 VACUUM ANALYZE,或 ANALYZE 获得。
使用统计值,优化器知道表中有多少行,就能够更好地判断是否利用索引。 使用统计值,优化器知道表中有多少行,就能够更好地判断是否利用索引。
统计值对确定优化的连接顺序和连接方法也很有用。在表的内容发生变化时,应定期进行统计值的更新收集。 统计值对确定优化的连接顺序和连接方法也很有用。在表的内容发生变化时,应定期进行统计值的更新收集。
</p> </p>
<p> <p>
索引通常不用于 ORDER BY 或执行连接。对一个大表的一次顺序扫描,再做一个显式的排序通常比索引扫描要快。 索引通常不用于 ORDER BY 或执行连接。对一个大表的一次顺序扫描再做一次排序通常比索引扫描要快。然而,如果将 LIMIT 和 ORDER BY
结合在一起使用的话,通常将会使用索引,因为这时仅返回表中的一小部分记录。
</p> </p>
<p> <p>
但是,在 LIMIT 和 ORDER BY 结合使用时经常会使用索引,因为这只会返回表的一小部分。 如果你确信PostgreSQL的优化器使用顺序扫描是不正确的,你可以使用<code>SET enable_seqscan TO 'off'</code>指令来关闭顺序扫描,
实际上,虽然 MAX() 和 MIN() 并不使用索引,通过对 然后再次运行查询,你就可以看出使用一个索引扫描是否确实要快一些。
ORDER BY 和 LLIMIT 使用索引取得最大值和最小值也是可以的:
</p>
<pre>
SELECT col
FROM tab
ORDER BY col [ DESC ]
LIMIT 1;
</pre>
<p>
如果你确信PostgreSQL的优化器使用顺序扫描是不正确的,你可以使用<code>SET enable_seqscan TO 'off'</code>指令,
然后再次运行查询,你就可以看出使用一个索引扫描是否确实要快一些。
</p> </p>
<p> <p>
当使用通配符操作,例如 <i>LIKE</i><i>~</i> 时,索引只能在特定的情况下使用:
当使用通配符操作,例如 <i>LIKE</i><i>~</i> 时,索引只能在特定的情况下使用:
</p> </p>
<ul> <ul>
<li>字符串的开始部分必须是普通字符串,也就是说: <li>字符串的开始部分必须是普通字符串,也就是说:
<ul> <ul>
<li> <i>LIKE</i> 模式不能以 <i>%</i> 打头。</li> <li> <i>LIKE</i> 模式不能以 <i>%</i> 打头。</li>
<li> <i>~</i> (正则表达式)模式必须以 <i>^</i> 打头。</li>
<li> <i>~</i> (正则表达式)模式必须以 <i>^</i> 打头。</li>
</ul> </ul>
</li> </li>
<li>字符串不能以匹配多个字符的模式类打头,例如 [a-e]。</li> <li>字符串不能以匹配多个字符的模式类打头,例如 [a-e]。</li>
<li>大小写无关的查找,如 ILIKE 和 ~* 等不使用索引,但可以用 <a href="#4.8">4.8</a> 节描述的函数索引。</li> <li>大小写无关的查找,如 ILIKE 和 ~* 等不使用索引,但可以用 <a href="#4.8">4.8</a> 节描述的表达式索引。</li>
<li>在做 initdb 时必须采用缺省的本地设置 C locale,因为系统不可能知道在非C locale情况时下一个最大字符是什么。
在这种情况下,你可以创建一个特殊的<code>text_pattern_ops</code>索引来用于<small>LIKE</small>的索引。 <li>在做 initdb 时必须采用缺省的本地设置 C locale,因为系统不可能知道在非C locale情况时下一个最大字符是什么。
在这种情况下,你可以创建一个特殊的<code>text_pattern_ops</code>索引来用于<small>LIKE</small>的索引。
</li> </li>
</ul> </ul>
<p> <p>
在8.0之前的版本中,除非要查询的数据类型和索引的数据类型相匹配,否则索引经常是未被用到,特别是对int2,int8和数值型的索引。 在8.0之前的版本中,除非要查询的数据类型和索引的数据类型相匹配,否则索引经常是未被用到,特别是对int2,int8和数值型的索引。
</p> </p>
<h4><a name="4.7"></a>4.7)我如何才能看到查询优化器是怎样评估处理我的查询?</h4> <h3> <a name="4.7"></a>4.7) 我如何才能看到查询优化器是怎样评估处理我的查询? </h3>
<p>
参考 <small>EXPLAIN</small> 手册页。
</p>
<h4><a name="4.8"></a>4.8)我怎样做正则表达式搜索和大小写无关的正则表达式查找?怎样利用索引进行大小写无关查找?</h4> <p>参考 <small>EXPLAIN</small> 手册页。</p>
<h3> <a name="4.8"></a>4.8) 我怎样做正则表达式搜索和大小写无关的正则表达式查找?怎样利用索引进行大小写无关查找? </h3>
<p> <p>
操作符 <i> ~ </i> 处理正则表达式匹配,而 <i>~*</i> 处理大小写无关的正则表达式匹配。大写些无关的 LIKE 变种成为 ILIKE。 操作符 <i> ~ </i> 处理正则表达式匹配,而 <i>~*</i> 处理大小写无关的正则表达式匹配。大小写无关的 LIKE 变种成为 ILIKE。
</p> </p>
<p> <p>
大小写无关的等式比较通常写做: 大小写无关的等式比较通常写做:
</p> </p>
<pre> SELECT * <pre>
SELECT *
FROM tab FROM tab
WHERE lower(col) = 'abc'; WHERE lower(col) = 'abc';
</pre> </pre>
<p> <p>
这样将不会使用标准的索引。但是可以创建一个可被利用的函数索引: 这样将不会使用标准的索引。但是可以创建一个在这种情况下使用的表达式索引:
</p> </p>
<pre> CREATE INDEX tabindex ON tab (lower(col)); <pre>
CREATE INDEX tabindex ON tab (lower(col));
</pre> </pre>
<p>
如果上述索引在创建时加入UNIQUE约束,虽然索引字段自身内容可以存储大小写不限的内容,但如果有UNIQUE约束后,这些内容不能仅仅是大小写不同(否则会造成冲突)。为了保证不发生这种情况,可以使用CHECK约束条件或是触发器在录入时进行限制。
</p>
<h4><a name="4.9"></a>4.9)在一个查询里,我怎样检测一个字段是否为 <i>NULL</i> ?我如何才能准确排序而不论某字段是否含 <i>NULL</i> 值?</h4> <h3> <a name="4.9"></a>4.9) 在一个查询里,我怎样检测一个字段是否为 <i>NULL</i> ?我如何才能准确排序而不论某字段是否含 <i>NULL</i> 值? </h3>
<p> <p>
<small>IS NULL</small><small>IS NOT NULL</small> 测试这个字段,具体方法如下:
<small>IS NULL</small><small>IS NOT NULL</small> 测试这个字段,具体方法如下:
</p> </p>
<pre> SELECT * <pre> SELECT *
FROM tab FROM tab
WHERE col IS NULL; WHERE col IS NULL;
</pre> </pre>
<p>为了能对含 <small>NULL</small>字段排序,可在 <small>ORDER BY</small> 条件中使用 <small>IS NULL</small> <p>为了能对含 <small>NULL</small>字段排序,可在 <small>ORDER BY</small> 条件中使用 <small>IS NULL</small>
<small>IS NOT NULL</small> 修饰符,条件为真 <i>true</i> 将比条件为假<i>false</i> 排在前面,下面的例子就会将含 <small>IS NOT NULL</small> 修饰符,条件为真 <i>true</i> 将比条件为假<i>false</i> 排在前面,下面的例子就会将含
NULL 的记录排在结果的上面部分: NULL 的记录排在结果的上面部分:
</p> </p>
<pre> SELECT * <pre> SELECT *
FROM tab FROM tab
ORDER BY (col IS NOT NULL) ORDER BY (col IS NOT NULL)
</pre> </pre>
<h4><a name="4.10"></a>4.10)各种字符类型之间有什么不同?</h4> <h3> <a name="4.10"></a>4.10) 各种字符类型之间有什么不同? </h3>
<blockquote> <blockquote>
<table> <table>
<tbody> <tbody>
<tr><th>类型</th><th>内部名称</th><th>说明</th></tr> <tr><th>类型</th><th>内部名称</th><th>说明</th></tr>
<tr><td>VARCHAR(n)</td><td>varchar</td><td>指定了最大长度,变长字符串,不足定义长度的部分不补齐</td></tr>
<tr><td>CHAR(n)</td><td>bpchar</td><td>定长字符串,实际数据不足定义长度时,以空格补齐</td></tr> <tr><td>VARCHAR(n)</td><td>varchar</td><td>指定了最大长度,变长字符串,不足定义长度的部分不补齐</td></tr>
<tr><td>TEXT</td><td>text</td><td>没有特别的上限限制(仅受行的最大长度限制)</td></tr> <tr><td>CHAR(n)</td><td>bpchar</td><td>定长字符串,实际数据不足定义长度时,以空格补齐</td></tr>
<tr><td>BYTEA</td><td>bytea</td><td>变长字节序列(使用NULL也是允许的)</td></tr> <tr><td>TEXT</td><td>text</td><td>没有特别的上限限制(仅受行的最大长度限制)</td></tr>
<tr><td>"char"</td><td>char</td><td>一个字符</td></tr> <tr><td>BYTEA</td><td>bytea</td><td>变长字节序列(使用NULL字符也是允许的)</td></tr>
<tr><td>"char"</td><td>char</td><td>单个字符</td></tr>
</tbody> </tbody>
</table> </table>
</blockquote> </blockquote>
<p> <p>
在系统表和在一些错误信息里你将看到内部名称。 在系统表和在一些错误信息里你将看到内部名称。
</p> </p>
<p> <p>
上面所列的前四种类型是"varlena"(变长)类型(也就是说,开头的四个字节是长度,后面才是数据)。 上面所列的前四种类型是"varlena"(变长)类型(也就是说,开头的四个字节是长度,后面才是数据)。
于是实际占用的空间比声明的大小要多一些。 于是实际占用的空间比声明的大小要多一些。
然而这些类型都可以被压缩存储,也可以用 TOAST 脱机存储,因此磁盘空间也可能比预想的要少。 然而这些类型如定义很长时都可以被压缩存储,因此磁盘空间也可能比预想的要少。
</p> </p>
<p> <p>
<small>VARCHAR(n)</small> 在存储限制了最大长度的变长字符串是最好的。 <small>VARCHAR(n)</small> 在存储限制了最大长度的变长字符串是最好的。
<small>TEXT</small> 适用于存储最大可达 1G左右但未定义限制长度的字符串。 <small>TEXT</small> 适用于存储最大可达 1G左右但未定义限制长度的字符串。
</p> </p>
<p> <p>
<small>CHAR(n)</small> 最适合于存储长度相同的字符串。 <small>CHAR(n)</small>会根据所给定的字段长度以空格补足(不足的字段内容), <small>CHAR(n)</small> 最适合于存储长度相同的字符串。 <small>CHAR(n)</small>会根据所给定的字段长度以空格补足(不足的字段内容),
<small>VARCHAR(n)</small> 只存储所给定的数据内容。 <small>VARCHAR(n)</small> 只存储所给定的数据内容。
<small>BYTEA</small> 用于存储二进制数据,尤其是包含 NULL 字节的值。这些类型具有相似的性能特性。 <small>BYTEA</small> 用于存储二进制数据,尤其是包含 NULL 字节的值。这些类型具有差不多的性能。
</p> </p>
<h4><a name="4.11.1"></a>4.11.1)我怎样创建一个序列号/自动递增的字段?</h4> <h3> <a name="4.11.1"></a>4.11.1) 我怎样创建一个序列号或是自动递增的字段? </h3>
<p> <p>PostgreSQL 支持 SERIAL 数据类型。(字段定义为SERIAL后)将自动创建一个序列生成器,例如:
PostgreSQL 支持 SERIAL 数据类型。它在字段上自动创建一个序列和索引。例如:
</p> </p>
<pre> <pre>
CREATE TABLE person ( CREATE TABLE person (
...@@ -713,8 +819,9 @@ PostgreSQL ...@@ -713,8 +819,9 @@ PostgreSQL
); );
</pre> </pre>
<p> <p>
会自动转换为: 会自动转换为以下SQL语句:
</p> </p>
<pre> <pre>
CREATE SEQUENCE person_id_seq; CREATE SEQUENCE person_id_seq;
CREATE TABLE person ( CREATE TABLE person (
...@@ -723,153 +830,177 @@ PostgreSQL ...@@ -723,153 +830,177 @@ PostgreSQL
); );
</pre> </pre>
<p> <p>
参考 create_sequence 手册页获取关于序列的更多信息。 参考 create_sequence 手册页获取关于序列生成器的更多信息。
</p> </p>
<h4><a name="4.11.2"></a>4.11.2)我如何获得一个插入的序列号的值?</h4> <h3> <a name="4.11.2"></a>4.11.2) 我如何获得一个插入的序列号的值? </h3>
<p> <p>
一种方法是在插入之前先用函数 nextval() 从序列对象里检索出下一个 SERIAL 值,然后再显式插入。使用 一种方法是在插入之前先用函数 nextval() 从序列对象里检索出下一个 SERIAL 值,然后再用此值精确地插入。使用
<a href="#4.11.1"> 4.11.1</a> 里的例表,可用伪码这样描述: <a href="#4.11.1"> 4.11.1</a> 里的例表,可用伪码这样描述:
</p> </p>
<pre> <pre>
new_id = execute("SELECT nextval('person_id_seq')"); new_id = execute("SELECT nextval('person_id_seq')");
execute("INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')"); execute("INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')");
</pre> </pre>
<p> <p>
这样还能在其他查询中使用存放在 new_id 里的新值(例如,作为 person 表的外键)。 这样还能在其他查询中使用存放在 new_id 里的新值(例如,作为参照 person 表的外键)。
注意自动创建的 SEQUENCE 对象的名称将会是 &lt;<i>table</i>&gt;_&lt;<i>serialcolumn</i>&gt;_<i>seq</i> 注意自动创建的 SEQUENCE 对象的名称将会是 &lt;<i>table</i>&gt;_&lt;<i>serialcolumn</i>&gt;_<i>seq</i>
这里 table 和 serialcolumn 分别是你的表的名称和你的 SERIAL 字段的名称。 这里 table 和 serialcolumn 分别是你的表的名称和你的 SERIAL 字段的名称。
</p> </p>
<p> <p>
类似的,在 SERIAL 对象缺省插入后你可以用函数 currval() 检索刚赋值的 SERIAL 值,例如: 类似的,在 SERIAL 对象缺省插入后你可以用函数 currval() 检索刚赋值的 SERIAL 值,例如:
</p> </p>
<pre> <pre>
execute("INSERT INTO person (name) VALUES ('Blaise Pascal')"); execute("INSERT INTO person (name) VALUES ('Blaise Pascal')");
new_id = execute("SELECT currval('person_id_seq')"); new_id = execute("SELECT currval('person_id_seq')");
</pre> </pre>
<h4><a name="4.11.3"></a>4.11.3)使用 <i>currval()</i> 会导致和其他用户的冲突情况(race condition)吗?</h4> <h3> <a name="4.11.3"></a>4.11.3) 同时使用 <i>currval()</i> 会导致和其他用户的冲突情况吗? </h3>
<p> <p>
不会。<i>currval()</i> 返回的是你本次会话进程所赋的值而不是所有用户的当前值。<br/> 不会。<i>currval()</i> 返回的是你本次会话进程所赋的值而不是所有用户的当前值。<br/>
</p> </p>
<h4><a name="4.11.4"></a>4.11.4)为什么不在事务异常中止后重用序列号呢?为什么在序列号字段的取值中存在间断呢?</h4> <h3> <a name="4.11.4"></a>4.11.4) 为什么不在事务异常中止后重用序列号呢?为什么在序列号字段的取值中存在间断呢? </h3>
<p> <p>
为了提高并发性,序列号在需要的时候赋予正在运行的事务,并且在事务结束之前不进行锁定, 为了提高并发性,序列号在需要的时候赋予正在运行的事务,并且在事务结束之前不进行锁定,
这就会导致异常中止的事务后,序列号会出现间隔。 这就会导致异常中止的事务后,序列号会出现间隔。
</p> </p>
<h4><br/><a name="4.12"></a>4.12)什么是 <small>OID</small> ?什么是 <small>CTID</small></h4> <h3> <a name="4.12"></a>4.12) 什么是 <small>OID</small> ?什么是 <small>CTID</small></h3>
<p>
PostgreSQL 里创建的每一行记录都会获得一个唯一的<small>OID</small>,除非在创建表时使用<small>WITHOUT OIDS</small>选项。
<small>OID</small>创建时会自动生成一个4字节的整数,所有 OID 在整个 PostgreSQL 中均是唯一的。 然而,它在超过40亿时将溢出, <p>PostgreSQL 里创建的每一行记录都会获得一个唯一的<small>OID</small>,除非在创建表时使用<small>WITHOUT OIDS</small>选项。
<small>OID</small>此后会出现重复。PostgreSQL 在它的内部系统表里使用 OID 在表之间建立联系。 <small>OID</small>创建时会自动生成一个4字节的整数,所有 OID 在相应PostgreSQL服务器中均是唯一的。 然而,它在超过40亿时将溢出,
<small>OID</small>此后会出现重复。PostgreSQL 在它的内部系统表里使用 OID 在表之间建立联系。
</p> </p>
<p> <p>
在用户的数据表中,最好是使用<small>SERIAl</small>来代替<small>OID</small> 在用户的数据表中,最好是使用<small>SERIAl</small>来代替<small>OID</small>
因为<small>SERIAL</small>只是保证在单个表中数据是唯一的,这样它溢出的可能性就非常小了,
<small>SERIAL8</small>可用来保存8字节的序列号字段。 因为<small>SERIAL</small>只要保证在单个表中的数值是唯一的就可以了,这样它溢出的可能性就非常小了,
<small>SERIAL8</small>可用来保存8字节的序列数值。
</p> </p>
<p> <p>
<small>CTID</small> 用于标识带着数据块(地址)和(块内)偏移的特定的物理行。 <small>CTID</small> 用于标识带着数据块(地址)和(块内)偏移的特定的物理行。
<small>CTID</small> 在记录被更改或重载后发生改变。索引入口使用它们指向物理行。 <small>CTID</small> 在记录被更改或重载后发生改变。索引数据使用它们指向物理行。
</p> </p>
<h4><a name="4.13"></a>4.13)为什么我收到错误信息“<i>ERROR: Memory exhausted in AllocSetAlloc()</i>”?</h4>
<h3> <a name="4.13"></a>4.13) 为什么我收到错误信息“<i>ERROR: Memory exhausted in AllocSetAlloc()</i>”? </h3>
<p> <p>
这很可能是系统的虚拟内存用光了,或者内核对某些资源有较低的限制值。在启动 postmaster 之前试试下面的命令: 这很可能是系统的虚拟内存用光了,或者内核对某些资源有较低的限制值。在启动 postmaster 之前试试下面的命令:
</p> </p>
<pre> <pre>
ulimit -d 262144 ulimit -d 262144
limit datasize 256m limit datasize 256m
</pre> </pre>
<p> <p>
取决于你用的 shell,上面命令只有一条能成功,但是它将把你的进程数据段限制设得比较高, 取决于你用的 shell,上面命令只有一条能成功,但是它将把你的进程数据段限制设得比较高,
因而也许能让查询完成。这条命令应用于当前进程,以及所有在这条命令运行后创建的子进程。 因而也许能让查询完成。这条命令应用于当前进程,以及所有在这条命令运行后创建的子进程。
如果你是在运行SQL客户端时因为后台返回了太多的数据而出现问题,请在运行客户端之前执行上述命令。 如果你是在运行SQL客户端时因为后台返回了太多的数据而出现问题,请在运行客户端之前执行上述命令。
</p> </p>
<h4><a name="4.14"></a>4.14)我如何才能知道所运行的 PostgreSQL 的版本?</h4> <h3> <a name="4.14"></a>4.14) 我如何才能知道所运行的PostgreSQL的版本? </h3>
<p> <p>
从 psql 里,输入 <code>SELECT version();</code>指令。 从 psql 里,输入 <code>SELECT version();</code>指令。
</p> </p>
<h4><a name="4.15"></a>4.15)我如何创建一个缺省值是当前时间的字段?</h4> <h3> <a name="4.15"></a>4.15) 我如何创建一个缺省值是当前时间的字段? </h3>
<p> <p>
使用 CURRENT_TIMESTAMP: 使用 CURRENT_TIMESTAMP:
</p> </p>
<pre> <pre>
CREATE TABLE test (x int, modtime TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE test (x int, modtime TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
</pre> </pre>
<h4><a name="4.16"></a>4.16)我怎样进行 outer join (外连接)?</h4> <h3> <a name="4.16"></a>4.16) 我怎样进行 outer join (外连接)? </h3>
<p> <p>PostgreSQL 采用标准的 SQL 语法支持外连接。这里是两个例子:</p>
PostgreSQL 采用标准的 SQL 语法支持外连接。这里是两个例子:
</p>
<pre> <pre>
SELECT * SELECT *
FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col); FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col);
</pre> </pre>
<p>或是</p> <p>或是</p>
<pre> <pre>
SELECT * SELECT *
FROM t1 LEFT OUTER JOIN t2 USING (col); FROM t1 LEFT OUTER JOIN t2 USING (col);
</pre> </pre>
<p> <p>
这两个等价的查询在 t1.col 和 t2.col 上做连接,并且返回 t1 中所有未连接的行(那些在 t2 中没有匹配的行)。 这两个等价的查询在 t1.col 和 t2.col 上做连接,并且返回 t1 中所有未连接的行(那些在 t2 中没有匹配的行)。
右[外]连接(RIGHT OUTER JOIN)将返回 t2 中未连接的行。 右[外]连接(RIGHT OUTER JOIN)将返回 t2 中未连接的行。
完全外连接(FULL OUTER JOIN)将返回 t1 和 t2 中未连接的行。 完全外连接(FULL OUTER JOIN)将返回 t1 和 t2 中未连接的行。
关键字 OUTER 在左[外]连接、右[外]连接和完全[外]连接中是可选的,普通连接被称为内连接(INNER JOIN)。 关键字 OUTER 在左[外]连接、右[外]连接和完全[外]连接中是可选的,普通连接被称为内连接(INNER JOIN)。
</p> </p>
<h4><a name="4.17"></a>4.17)如何使用涉及多个数据库的查询?</h4> <h3> <a name="4.17"></a>4.17) 如何使用涉及多个数据库的查询? </h3>
<p> <p>
没有办法查询当前数据库之外的数据库。 没有办法查询当前数据库之外的数据库。
因为 PostgreSQL 要加载与数据库相关的系统目录(系统表),因此跨数据库的查询如何执行是不定的。 因为PostgreSQL要加载与数据库相关的系统目录(系统表),因此跨数据库的查询如何执行是不定的。
</p> </p>
<p> <p>
附加增值模块contrib/dblink允许采用函数调用实现跨库查询。当然用户也可以同时连接到不同的数据库执行查询然后在客户端合并结果。 附加增值模块contrib/dblink允许采用函数调用实现跨库查询。当然用户也可以同时连接到不同的数据库执行查询然后在客户端合并结果。
</p> </p>
<h4><a name="4.18"></a>4.18)如何让函数返回多行或多列?</h4> <h3> <a name="4.18"></a>4.18) 如何让函数返回多行或多列数据? </h3>
<p> <p>
在函数中返回数据记录集的功能是很容易使用的,详情参见: 在函数中返回数据记录集的功能是很容易使用的,详情参见:
<a href="http://techdocs.postgresql.org/guides/SetReturningFunctions">http://techdocs.postgresql.org/guides/SetReturningFunctions</a> <a href="http://techdocs.postgresql.org/guides/SetReturningFunctions">http://techdocs.postgresql.org/guides/SetReturningFunctions</a>
</p> </p>
<h4><a name="4.19"></a>4.19)为什么我在使用PL/PgSQL函数存取临时表时会收到错误信息“relation with OID ##### does not exist”?</h4> <h3> <a name="4.19"></a>4.19) 为什么我在使用PL/PgSQL函数存取临时表时会收到错误信息“relation with OID ##### does not exist”? </h3>
<p> <p>
PL/PgSQL会缓存函数的内容,由此带来的一个不好的副作用是若一个 PL/PgSQL PL/PgSQL会缓存函数的脚本内容,由此带来的一个不好的副作用是若一个 PL/PgSQL
函数访问了一个临时表,然后该表被删除并重建了,则再次调用该函数将失败, 函数访问了一个临时表,然后该表被删除并重建了,则再次调用该函数将失败,
因为缓存的函数内容仍然指向旧的临时表。解决的方法是在 PL/PgSQL 中用<small>EXECUTE</small> 因为缓存的函数内容仍然指向旧的临时表。解决的方法是在 PL/PgSQL 中用<small>EXECUTE</small>
对临时表进行访问。这样会保证查询在执行前总会被重新解析。 对临时表进行访问。这样会保证查询在执行前总会被重新解析。
</p> </p>
<h4><a name="4.27"></a>4.27)目前有哪些数据复制方案可用?</h4> <h3> <a name="4.20"></a>4.20) 目前有哪些数据复制方案可用? </h3>
<p> <p>
“复制”只是一个术语,有好几种复制技术可使用,每种都有优点和缺点: “复制”只是一个术语,有好几种复制技术可用,每种都有优点和缺点:
</p> </p>
<p> <p>
主/从复制方式是允许一个主服务器接受读/写的申请,而多个从服务器只能接受读/<small>SELECT</small>查询的申请,
目前最流行且是免费的主/从 PostgreSQL复制方案是 主/从复制方式是允许一个主服务器接受读/写的申请,而多个从服务器只能接受读/<small>SELECT</small>查询的申请,
<a href="http://gborg.postgresql.org/project/slony1/projdisplay.php">Slony-I </a> 目前最流行且免费的主/从PostgreSQL复制方案是
<a href="http://gborg.postgresql.org/project/slony1/projdisplay.php">Slony-I </a>
</p> </p>
<p> <p>
多个主服务器的复制方式允许将读/写的申请发送给多台的计算机,这种方式由于需要在多台服务器之间同步数据变动 多个主服务器的复制方式允许将读/写的申请发送给多台的计算机,这种方式由于需要在多台服务器之间同步数据变动
可能会带来较严重的性能损失,<a href="http://pgfoundry.org/projects/pgcluster/">Pgcluster</a>是目前这种方案 可能会带来较严重的性能损失,<a href="http://pgfoundry.org/projects/pgcluster/">Pgcluster</a>是目前这种方案
中最好的,而且还可以免费下载。 中最好的,而且还可以免费下载。
</p> </p>
<p> <p>
也有一些商业需付费和基于硬件的数据复制方案,支持上述各种复制模型。 也有一些商业需付费和基于硬件的数据复制方案,支持上述各种复制模型。
</p> </p>
<h3> <a name="4.21">4.21</a>) 为何查询结果显示的表名或列名与我的查询语句中的不同?为何大写状态不能保留? </h3>
<p>
最常见的原因是在创建表时对表名或是列名使用了双引号“”,当使用了双引号后,表名或列名(称为标识符)存储时是区分
<a href="http://www.postgresql.org/docs/8.0/static/sql-syntax.html#SQL-SYNTAX-IDENTIFIERS">大小写的</a>
这意谓着你在查询时表名或列名也应使用双引号,一些工具软件,像pgAdmin会在发出创建表的指令时自动地在每个标识符上加双引号。
因此,为了标识符的统一,你应该:
</p>
<ul>
<li>在创建表时避免将标识符使用双引号引起来。</li>
<li>在标识符中只使用小写字母。</li>
<li>(为了与已存在的标识符相同)在查询中使用双引号将标识符引起来。</li>
</ul>
</body> </body>
</html>
</html>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment