PostgreSQL 读作 Post-Gres-Q-L,有时候也简称为Postgres 。
PostgreSQL 是面向目标的关系数据库系统,它具有传统商业数据库系统的所有功能,同时又含有将在下一代 DBMS 系统的使用的增强特性。 PostgreSQL 是自由免费的,并且所有源代码都可以获得。
PostgreSQL 的开发队伍主要为志愿者,他们遍布世界各地并通过互联网进行联系,这是一个社区开发项目,它不被任何公司控制。 如想加入开发队伍,请参见开发人员常见问题(FAQ) http://www.postgresql.org/files/documentation/faqs/FAQ_DEV.html
PostgreSQL的发布遵从经典的BSD版权。关于源代码的如何使用没有任何限制,我们很喜欢这种方式并且还没有打算改变它。
下面就是我们使用的BSD版权内容:
部分版权(c)1996-2005,PostgreSQL 全球开发小组,部分版权(c)1994-1996 加州大学董事
(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 agreement is hereby granted, provided that the above copyright notice and this paragraph and the following two paragraphs appear in all copies.)
在任何情况下,加州大学都不承担因使用此软件及其文档而导致的对任何当事人的直接的, 间接的,特殊的,附加的或者相伴而生的损坏,包括利益损失的责任,即使加州大学已经建议了这些损失的可能性时也是如此。
(IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST 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 DAMAGE.)
加州大学明确放弃任何保证,包括但不局限于某一特定用途的商业和利益的隐含保证。 这里提供的这份软件是基于“当作是”的基础的,因而加州大学没有责任提供维护,支持,更新,增强或者修改的服务。
(THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT 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 THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.)
一般说来,一个现代的 UNIX 兼容的平台都能运行 PostgreSQL 。在安装指南里列出了发布时经过明确测试的平台。
PostgreSQl也可以直接运行在基于微软Windows-NT的操作系统,如Win2000,WinXP 和 Win2003,已制作完成的安装包可从 http://pgfoundry.org/projects/pginstaller下载,基于MSDOS的Windows操作系统 (Win95,Win98,WinMe)需要通过Cygwin模拟环境运行PostgreSQL。
同时也有一个为Novell Netware 6开发的版本可从 http://forge.novell.com 获取,为OS/2开发的版本可从 http://hobbes.nmsu.edu/cgi-bin/h-search?sh=1&button=Search&key=postgreSQL&stype=all&sort=type&dir=%2F
通过浏览器可从http://www.postgresql.org/ftp/下载,也可通过FTP,从 ftp://ftp.PostgreSQL.org/pub/站点下载。
PostgreSQL社区通过邮件列表为其大多数用户提供帮助,加入邮件列表的主站点是 http://www.postgresql.org/community/lists/,一般情况下,先加入General 或 Bug邮件列表是一个较好的开始。
主要的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。
可访问 http://www.postgresql.org/support/submitbug,填写Bug上报表格即可。
同样也可访问ftp站点ftp://ftp.PostgreSQL.org/pub/ 检查有无更新的PostgreSQL版本或补丁。
PostgreSQL 最新的版本是版本 8.0.2 (译注:现最新版本为8.0.3)。
我们计划每年发布一个主要版本,每几个月发布一个小版本。
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 站点包含更多的文档。
PostgreSQL 支持一个扩展了的 SQL-92 的子集。参阅我们的TODO 列表,获取一个已知Bug,暂缺的功能和将来的计划。
首先考虑上述提到的与PostgreSQL相关的书籍,另外一本是Teach Yourself SQL in 21 Days, Second Edition, 我们的许多用户喜欢The Practical SQL Handbook Bowman, Judith S., et al., Addison-Wesley,其他的则喜欢 The Complete Reference SQL, Groff et al., McGraw-Hill。
详见 Developer's FAQ 。
评价软件有好几种方法:特性,性能,可靠性,支持和价格。
如果你在寻找PostgreSQL的掌门人,或是什么中央委员会,或是什么所属公司,你只能放弃了---因为一个也不存在,但我们的确有一个 委员会和CVS管理组,但这些工作组的设立主要是为了进行管理工作而不是对PostgreSQL进行控制,PostgreSQL项目是由任何人均 可参加的开发人员社区和所有用户控制的,你所需要做的就是加入邮件列表,参与讨论即可(要参与PostgreSQL的开发详见 Developer's FAQ 获取信息)。
PostgreSQL(缺省情况)只安装有C和内嵌式C的接口,其他的接口都是独立的项目,能够分别下载,这些接口项目独立的好处 是他们可以有各自的发布计划和各自独立的开发组。
一些编程语言如PHP都有访问 PostgreSQL 的接口,Perl,TCL,Python以及很多其他语言的接口在 http://gborg.postgresql.org 上的Drivers/Interfaces小节可找到, 并且通过Internet很容易搜索到。
一个介绍以数据库为后台的挺不错的站点是:http://www.webreview.com。
对于 Web 集成,PHP 是一个极好的接口。它在:http://www.php.net/。
对于复杂的任务,很多人采用 Perl 接口和 CGI.pm 或 mod_perl 。
是的,在 http://techdocs.postgresql.org/guides/GUITools有一个详细的列表。
在运行 configure 时加上 --prefix 选项。
缺省时,PostgreSQL 只允许通过 unix 域套接字或TCP/IP方式且来自本机的连接。 你只有在修改了配置文件postgresql.conf中的listen_addresses,且也在配置文件pg_hba.conf中打开了 主机为基础( host-based )的身份认证,并重新启动PostgreSQL,否则其他机器是不能与你的PostgreSQL服务器连接的。
有三个主要方面可以提升PostgreSQL的潜能。
PostgreSQL 有很多类似 log_* 的服务器配置变量可用于查询的打印和进程统计,而这些工作对调试和性能测试很有帮助。
这表示你已达到缺省100个并发后台进程数的限制,你需要通过修改postgresql.conf文件中的max_connections值来 增加postmaster的后台并发处理数,修改后需重新启动postmaster。
PostgreSQL 开发组对每次小的升级仅做了较少的修改,因此从 7.4.0 升级到 7.4.1 不需要 dump 和 restore。 但是主要的升级(例如从 7.3 到 7.4)通常会修改系统表和数据表的内部格式。 这些变化一般比较复杂,因此我们不维数据文件的向后兼容。 dump 将数据按照通用的格式输出,随后可以被重新加载并使用新的内部格式。
由于计算机硬件大多数是兼容的,人们总是倾向于相信所有计算机硬件质量也是相同的。事实上不是, ECC RAM(带奇偶校验的内存),SCSI (硬盘)和优质的主板比一些便宜货要更加可靠且具有更好的性能。PostgreSQL几乎可以运行在任何硬件上, 但如果可靠性和性能对你的系统很重要,你就需要全面的研究一下你的硬件配置了。在我们的邮件列表上也有关于 硬件配置和性价比的讨论。
如果你只是要提取几行数据,并且你在执行查询中知道确切的行数,你可以使用LIMIT功能。 如果有一个索引与 ORDER BY中的条件匹配,PostgreSQL 可能就只处理要求的头几条记录, (否则将对整个查询进行处理直到生成需要的行)。如果在执行查询功能时不知道确切的记录数, 可使用游标(cursor)和FETCH功能。
可使用以下方法提取一行随机记录的:
SELECT cols FROM tab ORDER BY random() LIMIT 1 ;
在psql中使用 \dt 命令来显示数据表的定义,要了解psql中的完整命令列表可使用\? ,另外,你也可以阅读 psql 的源代码 文件pgsql/src/bin/psql/describe.c,它包括为生成psql反斜杠命令的输出的所有 SQL 命令。你还可以带 -E 选项启动 psql, 这样它将打印出执行你在psql中所给出的命令的内部实际使用的SQL查询。PostgreSQL也提供了一个兼容SQL的INFORMATION SCHEMA接口, 你可以从这里获取关于数据库的信息。
在系统中有一些以pg_ 打头的系统表也描述了表的定义。
使用 psql -l 指令可以列出所有的数据库。
也可以浏览一下 pgsql/src/tutorial/syscat.source文件,它列举了很多可从数据库系统表中获取信息的SELECT语法。
在8.0版本里更改一个字段的数据类型很容易,可使用 ALTER TABLE ALTER COLUMN TYPE 。
在以前的版本中,可以这样做:
BEGIN; ALTER TABLE tab ADD COLUMN new_col new_data_type; UPDATE tab SET new_col = CAST(old_col AS new_data_type); ALTER TABLE tab DROP COLUMN old_col; COMMIT;
你然后可以使用VACUUM FULL tab 指令来使系统收回无效数据所占用的空间。
下面是一些限制:
一个数据库最大尺寸? 无限制(已存在有 32TB 的数据库) 一个表的最大尺寸? 32 TB 一行记录的最大尺寸? 1.6 TB 一个字段的最大尺寸? 1 GB 一个表里最大行数? 无限制 一个表里最大列数? 250-1600 (与列类型有关) 一个表里的最大索引数量? 无限制
当然,实际上没有真正的无限制,还是要受可用磁盘空间、可用内存/交换区的制约。 事实上,当这些数值变得异常地大时,系统性能也会受很大影响。
表的最大尺寸 32 TB 不需要操作系统对大文件的支持。大表用多个 1 GB 的文件存储,因此文件系统尺寸的限制是不重要的。
如果缺省的块大小增长到 32K ,最大的表尺寸和最大列数还可以增加到四倍。
一个 Postgres 数据库(存储一个文本文件)所占用的空间最多可能需要相当于这个文本文件自身大小5倍的磁盘空间。
例如,假设有一个 100,000 行的文件,每行有一个整数和一个文本描述。 假设文本串的平均长度为20字节。文本文件占用 2.8 MB。存放这些数据的 PostgreSQL 数据库文件大约是 6.4 MB:
32 字节: 每行的头(估计值) 24 字节: 一个整数型字段和一个文本型字段 + 4 字节: 页面内指向元组的指针 ---------------------------------------- 60 字节每行 PostgreSQL 数据页的大小是 8192 字节 (8 KB),则: 8192 字节每页 ------------------- = 136 行/数据页(向下取整) 60 字节每行 100000 数据行 -------------------- = 735 数据页(向上取整) 128 行每页 735 数据页 * 8192 字节/页 = 6,021,120 字节(6 MB)
索引不需要这么多的额外消耗,但也确实包括被索引的数据,因此它们也可能很大。
空值NULL存放在位图中,因此占用很少的空间。
并非每个查询都会自动使用索引。只有在表的大小超过一个最小值,并且查询只会选中表中较小比例的记录时才会采用索引。 这是因为索引扫描引起的随即磁盘存取可能比直接地读取表(顺序扫描)更慢。
为了判断是否使用索引,PostgreSQL必须获得有关表的统计值。这些统计值可以使用 VACUUM ANALYZE,或 ANALYZE 获得。 使用统计值,优化器知道表中有多少行,就能够更好地判断是否利用索引。 统计值对确定优化的连接顺序和连接方法也很有用。在表的内容发生变化时,应定期进行统计值的更新收集。
索引通常不用于 ORDER BY 或执行连接。对一个大表的一次顺序扫描,再做一个显式的排序通常比索引扫描要快。
但是,在 LIMIT 和 ORDER BY 结合使用时经常会使用索引,因为这只会返回表的一小部分。 实际上,虽然 MAX() 和 MIN() 并不使用索引,通过对 ORDER BY 和 LLIMIT 使用索引取得最大值和最小值也是可以的:
SELECT col FROM tab ORDER BY col [ DESC ] LIMIT 1;
如果你确信PostgreSQL的优化器使用顺序扫描是不正确的,你可以使用SET enable_seqscan TO 'off'
指令, 然后再次运行查询,你就可以看出使用一个索引扫描是否确实要快一些。
当使用通配符操作,例如 LIKE 或 ~ 时,索引只能在特定的情况下使用:
text_pattern_ops
索引来用于LIKE的索引。 在8.0之前的版本中,除非要查询的数据类型和索引的数据类型相匹配,否则索引经常是未被用到,特别是对int2,int8和数值型的索引。
参考 EXPLAIN 手册页。
操作符 ~ 处理正则表达式匹配,而 ~* 处理大小写无关的正则表达式匹配。大写些无关的 LIKE 变种成为 ILIKE。
大小写无关的等式比较通常写做:
SELECT * FROM tab WHERE lower(col) = 'abc';
这样将不会使用标准的索引。但是可以创建一个可被利用的函数索引:
CREATE INDEX tabindex ON tab (lower(col));
用 IS NULL 和 IS NOT NULL 测试这个字段,具体方法如下:
SELECT * FROM tab WHERE col IS NULL;
为了能对含 NULL字段排序,可在 ORDER BY 条件中使用 IS NULL和 IS NOT NULL 修饰符,条件为真 true 将比条件为假false 排在前面,下面的例子就会将含 NULL 的记录排在结果的上面部分:
SELECT * FROM tab ORDER BY (col IS NOT NULL)
类型 内部名称 说明 VARCHAR(n) varchar 指定了最大长度,变长字符串,不足定义长度的部分不补齐 CHAR(n) bpchar 定长字符串,实际数据不足定义长度时,以空格补齐 TEXT text 没有特别的上限限制(仅受行的最大长度限制) BYTEA bytea 变长字节序列(使用NULL也是允许的) "char" char 一个字符
在系统表和在一些错误信息里你将看到内部名称。
上面所列的前四种类型是"varlena"(变长)类型(也就是说,开头的四个字节是长度,后面才是数据)。 于是实际占用的空间比声明的大小要多一些。 然而这些类型都可以被压缩存储,也可以用 TOAST 脱机存储,因此磁盘空间也可能比预想的要少。
VARCHAR(n) 在存储限制了最大长度的变长字符串是最好的。 TEXT 适用于存储最大可达 1G左右但未定义限制长度的字符串。
CHAR(n) 最适合于存储长度相同的字符串。 CHAR(n)会根据所给定的字段长度以空格补足(不足的字段内容), 而 VARCHAR(n) 只存储所给定的数据内容。 BYTEA 用于存储二进制数据,尤其是包含 NULL 字节的值。这些类型具有相似的性能特性。
PostgreSQL 支持 SERIAL 数据类型。它在字段上自动创建一个序列和索引。例如:
CREATE TABLE person ( id SERIAL, name TEXT );
会自动转换为:
CREATE SEQUENCE person_id_seq; CREATE TABLE person ( id INT4 NOT NULL DEFAULT nextval('person_id_seq'), name TEXT );
参考 create_sequence 手册页获取关于序列的更多信息。
一种方法是在插入之前先用函数 nextval() 从序列对象里检索出下一个 SERIAL 值,然后再显式插入。使用 4.11.1 里的例表,可用伪码这样描述:
new_id = execute("SELECT nextval('person_id_seq')"); execute("INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')");
这样还能在其他查询中使用存放在 new_id 里的新值(例如,作为 person 表的外键)。 注意自动创建的 SEQUENCE 对象的名称将会是 <table>_<serialcolumn>_seq, 这里 table 和 serialcolumn 分别是你的表的名称和你的 SERIAL 字段的名称。
类似的,在 SERIAL 对象缺省插入后你可以用函数 currval() 检索刚赋值的 SERIAL 值,例如:
execute("INSERT INTO person (name) VALUES ('Blaise Pascal')"); new_id = execute("SELECT currval('person_id_seq')");
不会。currval() 返回的是你本次会话进程所赋的值而不是所有用户的当前值。
为了提高并发性,序列号在需要的时候赋予正在运行的事务,并且在事务结束之前不进行锁定, 这就会导致异常中止的事务后,序列号会出现间隔。
PostgreSQL 里创建的每一行记录都会获得一个唯一的OID,除非在创建表时使用WITHOUT OIDS选项。 OID创建时会自动生成一个4字节的整数,所有 OID 在整个 PostgreSQL 中均是唯一的。 然而,它在超过40亿时将溢出, OID此后会出现重复。PostgreSQL 在它的内部系统表里使用 OID 在表之间建立联系。
在用户的数据表中,最好是使用SERIAl来代替OID 因为SERIAL只是保证在单个表中数据是唯一的,这样它溢出的可能性就非常小了, SERIAL8可用来保存8字节的序列号字段。
CTID 用于标识带着数据块(地址)和(块内)偏移的特定的物理行。 CTID 在记录被更改或重载后发生改变。索引入口使用它们指向物理行。
这很可能是系统的虚拟内存用光了,或者内核对某些资源有较低的限制值。在启动 postmaster 之前试试下面的命令:
ulimit -d 262144 limit datasize 256m
取决于你用的 shell,上面命令只有一条能成功,但是它将把你的进程数据段限制设得比较高, 因而也许能让查询完成。这条命令应用于当前进程,以及所有在这条命令运行后创建的子进程。 如果你是在运行SQL客户端时因为后台返回了太多的数据而出现问题,请在运行客户端之前执行上述命令。
从 psql 里,输入 SELECT version();
指令。
使用 CURRENT_TIMESTAMP:
CREATE TABLE test (x int, modtime TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
PostgreSQL 采用标准的 SQL 语法支持外连接。这里是两个例子:
SELECT * FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col);
或是
SELECT * FROM t1 LEFT OUTER JOIN t2 USING (col);
这两个等价的查询在 t1.col 和 t2.col 上做连接,并且返回 t1 中所有未连接的行(那些在 t2 中没有匹配的行)。 右[外]连接(RIGHT OUTER JOIN)将返回 t2 中未连接的行。 完全外连接(FULL OUTER JOIN)将返回 t1 和 t2 中未连接的行。 关键字 OUTER 在左[外]连接、右[外]连接和完全[外]连接中是可选的,普通连接被称为内连接(INNER JOIN)。
没有办法查询当前数据库之外的数据库。 因为 PostgreSQL 要加载与数据库相关的系统目录(系统表),因此跨数据库的查询如何执行是不定的。
附加增值模块contrib/dblink允许采用函数调用实现跨库查询。当然用户也可以同时连接到不同的数据库执行查询然后在客户端合并结果。
在函数中返回数据记录集的功能是很容易使用的,详情参见: http://techdocs.postgresql.org/guides/SetReturningFunctions
PL/PgSQL会缓存函数的内容,由此带来的一个不好的副作用是若一个 PL/PgSQL 函数访问了一个临时表,然后该表被删除并重建了,则再次调用该函数将失败, 因为缓存的函数内容仍然指向旧的临时表。解决的方法是在 PL/PgSQL 中用EXECUTE 对临时表进行访问。这样会保证查询在执行前总会被重新解析。
“复制”只是一个术语,有好几种复制技术可使用,每种都有优点和缺点:
主/从复制方式是允许一个主服务器接受读/写的申请,而多个从服务器只能接受读/SELECT查询的申请, 目前最流行且是免费的主/从 PostgreSQL复制方案是 Slony-I 。
多个主服务器的复制方式允许将读/写的申请发送给多台的计算机,这种方式由于需要在多台服务器之间同步数据变动 可能会带来较严重的性能损失,Pgcluster是目前这种方案 中最好的,而且还可以免费下载。
也有一些商业需付费和基于硬件的数据复制方案,支持上述各种复制模型。
首页