PostgreSQL
PostgreSQL是一种特性很是齐备的自由软件的工具-关系型数据库治理系统(ORDBMS),它的良多特性恰是现今很多商业数据库的前身。
身世王谢
提及PostgreSQL,我们不能不道 Berkeley,也就是中文中的“加州大学伯克利分校”这所赫赫有名的大学。 诚恳说,伯克利(BSD)对盘算机科学的贡献堪称伟大,在全部计算机迷信的开展史上,几乎处处都有这所学 校的研究人员和门生的萍踪。只有略微对计算机技术史有些影象的人都市记得在 Unix 操作系统的生长里程碑上 BSD 这三个字的重量,然而大概正是由于 BSD 在系统和收集范畴里的光线太刺眼,掩饰了 BSD 对计算机技术其他分支的贡献,而PostgreSQL 正是此中之一。
追根究底天讲,PostgreSQL 最早入手下手于 BSD 的 Ingres 名目,这个项目重要是研讨干系型数据库手艺,早在 1970 年 E.F. Codd 就提出了关系模子,从那今后,人类在较量争论机范畴的数据治理就进进了一个新的期间。今后人们起头用抽象的关系语句来形貌本身的 数据,大大进步了人类对数据的笼统描写才能。而 Ingres 项目恰是就此举行研究的,它初于 1977 年,到 1985 年竣事,而其研究功效厥后被一家叫Relational Technologies 的贸易公司拿往做成了商品软件,后来这家公司又被 Computer Associates(CA)收买,不晓得 CA 的 JASMINE内里是不是还有昔时 Ingres 的影子?
新项目 Postgres
然后,从1986年开端,BSD 的 Michael Stonebraker 传授带领了称为 Postgres 的“后Ingres”项目, 其主要目的是数据库管理系统的更初级研究,因此而发生了 PostgreSQL 的直接前身,Postgres,而 PostgreSQL 的名字也是从 Postgres 项目继续过来的。 这个项目的功效长短常庞大的,在当代数据库的很多方面都做出的大量的孝敬,好比,面向对象的数据库, 部分索引技术,划定规矩,历程和数据库扩大等方面都走在了数据库管理系统的前线。而且,Stonebraker 传授还做出了一件制祸全人类的工作, 那就是把 Postgres 放在了 BSD 版权的庇护下,在这个版权的范畴里,任何人几乎可以做任何工作,包括加强它和商业化等。条件只是把 BSD 的版权声明包括在软件的源程序里。
Postgres 在 1989 年发布了第一个版本,因为是BSD版权,所以很快在各种研究机构和一些公家服务构造里普遍使用起来, 因为 浩繁用户使 Postgres 的开发变得更多地是保护代码和打补丁,而日趋背叛了本来的数据库管理系统的研究的目的, 到了1994年 Postgres 在版本4.2 的时刻正式停止。而 Postgres 的许多结果则转化成一个商业公司 Illustra,后来 Illustra 被 Informix 收购。看到这里,念必各人应当对Postgres 的影响有一些熟悉了吧。
炎黄子孙的奉献 Postgres95
Postgres 并没有因为 Postgres 项目的末止而截止成长,而是获得了一次重生:在1994年,两名伯克利的研究生在做研究生课题的时分,向 Postgres 里增添了现代的 SQL 语言的支持。请不要奇异,SQL 的祖宗是 E.F. Codd 的关系模子,然则 SQL 作为语言,不停到1992年才构成真实的国际标准(照旧草案),其时称为 SQL2,可是人们常称为 SQL92。而在那之前,所以查询语言都是由不同的数据库管理系统本身实现的,比方,在 Postgres 里本来是用叫 Postquel 的查询语言;这两位研究生是 Andrew Yu 和 Jolly Chen,看了名字,大师可能会想:“很象中国人的名字嘛”,没错,他们就是乌头发黄皮肤的炎黄子孙,不外很惋惜的是他们并没有在中国的(包括台湾省的)xx大学获得这样的成绩。这样,Postgres 迎来了 1995年,大要 是受xxxxxxx95 的定名方法的“开导”吧,他们俩把这个版本的 Postgres 定名为Postgres95,并且持续发布了几个版本,增强了一些特性。
PostgreSQL 可以说是最富特点的自由数据库管理系统,以至我们也可以说是最壮大的自由软件数据库管理系统。事实上, PostgreSQL 的特性笼盖了 SQL-2/SQL-92 和 SQL-3/SQL-99,起首,它包括了可以说是目宿世界上最富厚的数据类型的支持,个中有些数据类型可以说连商业数据库都不具有, 比如 IP 类型和多少类型等;其次,PostgreSQL 是全功能的自由软件数据库,很长工夫以来,PostgreSQL 是唯一支持事务、子查询、多版本并行控制系统、数据完备性查抄等特性的唯一的一种自由软件的数据库管理系统。直到比来才有 Inprise 的InterBase 以及 SAP 等厂商将其本来专有软件开放为自由软件以后才突破了这个唯一。最初,PostgreSQL拥有一支极度活泼的开发队伍,目前的提交人员曾经超越三十人, 而且在许多黑客的尽力下,PostgreSQL 的质量日趋提高,也从另外一个侧面上增加了人们使用 PostgreSQL 的决定信念,究竟?结果数据库管理系统不能象桌面操作系统那样 一天宕一次还让人感觉挺对劲 :-P。
从技能角度来说,PostgreSQL 接纳的是比力典范的 C/S (client/server)布局,也就是一个客户端对应一个服务器端保卫历程的模式, 这个保护进程阐发客户端来的查询恳求,死陈规划树,进行数据检索并终极把成绩花式化输出后返回给客户端。为了便于客户真个顺序的编写,由数据库服务器提供了同一的客户端 C 接口。而不同的客户端接口都是源自这个 C 接口,好比 ODBC,JDBC,Python,Perl ,Tcl,C/C++,ESQL 等, 同时也要指出的是,PostgreSQL 对接口的支持也长短常丰硕的,几近收持所有类型的数据库客户端接口。这一点也能够说是 PostgreSQL 一大长处。
说完长处,不能不说几句错误谬误,不能因为是自由软件而左袒 PostgreSQL,从 Postgres 最先,PostgreSQL 就承受了屡次转变。
首先,初期的 PostgreSQL 继续了几乎所有 Ingres, Postgres, Postgres95 的问题:过于学院味,因为首先它的目的是数据库研究,因此岂论在不变性, 性能照样使用便利方面,持久以来一向没有得到器重,直到 PostgreSQL 项目最先今后,情况才愈来愈好,目前,PostgreSQL 已经完全可以胜任任何中上规榜样围内的利用规模的营业。目前有报导的出产数据库的大小已经有 TB 级的数据量,已经迫近 32 位计算的极限。 不外学院味也给 PostgreSQL 带来一个意想不到的优点:大约因为各大学的软硬件环境差别太大的原因,它是目前支持平台最多的数据库管理系统的一种, 所支持的平台多达十几种,包括不同的系统,不同的硬件系统。至古,它仍然连结着支持平台最多的数据库管理系统的称呼。
其次,PostgreSQL 切实其实还完善一些比较高端的数据库管理系统需要的特性,比如联机热备份,数据库集群,更精良的管理工具和越发自动化的系统优化功能 等提高数据库性能的机制等,房地产税 收检查。
但是,话说返来,PostgreSQL 拥有极为壮大的扩展本领,你可以很轻易地扩展数据类型,内部函数,堆积,操作符等等,而且,别记了,你拥有所有的源程序, 实际上你可以做任何你可以做的事变。因此,很多弱点,在弹指之间就会消散也是很一般的。
总而行之,PostgreSQL的特征已完全可以知足尽大部份用户的需要,并且其品质和特性依然在一日千里地前进着,以是, 我们有来由信赖在不近的未来,PostgreSQL 必定可以成为一种良好的,自在的,贸易数据库的替换产物。
总结
作为一种数据库管理系统,PostgreSQL 其实不象 Linux 与某些商业操作系统相比那样,得到敏捷普遍的认可,这一点是可以了解的,Tom Lan 曾有一段话说得其实: “尾先,商业数据库系统不象某些商业操作系统那样其实太烂,相反,商业数据库系统的质量照样异常高的,与之相比,PostgreSQL 仍然有必然差异”但同时他也相信 “我们已经达到商业级的数据库系统的质量......”
的确,自由软件的发展具有腾跃性,因为开发者大多是使用空余时间进行开发,当开发者云集的时刻,新的工具可能一会儿就增加上来;而如果在自由软件活动的低潮时, 因为贫乏开发人员,所以可能会有一长段时间的寂静,然后又会跟着社会的发展而出现新的勾当。也就是一种螺旋的回升。
因此,我们在面临自由软件的时辰,肯定要有一点:要相信自己和依赖自己,因为自由软件的发展简直需要每个快乐喜爱者充实阐扬自己的智慧才干, 同时,也只有自由软件给你提供了这样的机遇——依托本人的气力改变自己的运气。末了,也只有这样,自由软件之光才能真正晖映我们的世界。
PostgreSQL常见问题(FAQ)
常见问题
1.1)PostgreSQL 是什么?该怎样发音?
1.2)谁掌握和经管PostgreSQL ?
1.3)PostgreSQL的版权是什么?
1.4)PostgreSQL可以运行在哪些操作系统平台上?
1.5)我从哪里能得到PostgreSQL?
1.6)最新版的PostgreSQL 是什么?
1.7)我从哪里能得到对PostgreSQL 的支持?
1.8)我怎样提交一个BUG陈述?
1.9)我如何认识已知的 BUG 或久缺的功能?
1.10)能够获取的最新文档有哪些?
1.11)我应当怎样进修 SQL ?
1.12)如何提交补丁或是加入开发部队?
1.13)PostgreSQL 和其他数据库系统比起来如何?
1.14)PostgreSQL 可以处理比来各个国度夏时制的变化吗?
用户客户端问题
2.1)我们可以用什么说话和PostgreSQL 打交道?
2.2)有什么工具可以把PostgreSQL 用于 Web 页面?
2.3)PostgreSQL 拥有图形用户界面吗?
系统办理问题
3.1)我如何才气把PostgreSQL 拆在 /usr/local/pgsql 之外的处所?
3.2)我如何节制来自其他电脑的连接?
3.3)我怎样调解数据库服务器以获得更好的性能?
3.4)PostgreSQL 里可以获得什么样的调试特性?
3.5)为什么在试图连接登录时收到“Sorry, too many clients” 动静?
3.6)PostgreSQL的进级进程有哪些内容?
3.7)(使用PostgreSQL)我需要使用什么计算机硬件?
操纵题目
4.1) 如何只选择一个查询成效的头几行?或是随机的一行?
4.2) 如何查看表、索引、数据库和用户的定义?如何检察psql里用到的查询指令并显现它们?
4.3) 如何更改一个字段的数据类型?
4.4) 单笔记录,单个表,一个数据库的最大限制是几?
4.5) 存储一个典范的文本文件里的数据需要几多磁盘空间?
4.6) 为什么我的查询很慢?为什么这些查询没有益用索引?
4.7) 我如何才能看到查询优化器是怎样评价处理我的查询的?
4.8) 我怎样做正则表达式搜索和大小写无关的正则表达式查找?怎样行使索引进行大小写无关查找?
4.9) 在一个查询里,我怎样检测一个字段是否为 NULL?我如何才能精确排序而非论某字段是否含NULL值?
4.10) 种种字符类型之间有什么不同?
4.11.1) 我如何创建一个序列号型或是主动递删的字段?
4.11.2) 我如何得到一个插入的序列号的值?
4.11.3) 同时运用 currval() 会招致和其他用户的辩论情形吗?
4.11.4) 为甚么不在事件非常中断后重用序列号呢?为何在序列号字段的与值中存在中断呢?
4.12) 什么是 OID?什么是 CTID ?
4.13) 为什么我收到错误信息“ERROR: Memory exhausted in AllocSetAlloc()”?
4.14) 我如何才能知道所运行的 PostgreSQL 的版本?
4.15) 我如何创建一个缺省值是当前时间的字段?
4.16) 如何执行外连接(outer join)查询?
4.17) 如何施行触及多个数据库的查询?
4.18) 如何让函数返回多行或多列数据?
4.19) 为什么我在使用PL/PgSQL函数存取一时表时会收到错误信息“relation with OID ##### does not exist”? 4.20) 现在有哪些数据复制方案可用?
4.21) 为什么查询成效隐示的表名或列名与我的查询语句中的不同?为什么大写状况不能保存?
常见问题 1.1)PostgreSQL 是什么?该怎样发音?
PostgreSQL 读作 Post-Gres-Q-L,偶然候也简称为Postgres 。想听一下其发音的人员可从这里下载声音文件: MP3 格式。
PostgreSQL 是面向方针的关系数据库系统,它具有传统商业数据库系统的所有功能,同时又含有将鄙人一代 DBMS 系统的使用的增强特性。PostgreSQL 是自由免费的,并且所有源代码都可以获得。
PostgreSQL 的开发队伍主要为自愿者,他们遍及天下各地并通过互联网进行接洽,这是一个社区开发项目,它不被任何公司控制。 如想加入开发队伍,请拜见开发人员常见问题(FAQ) /FAQ_DEV.html
1.2) 谁节制PostgreSQL ?
若是你在探求PostgreSQL的掌门人,或是什么中心委员会,或是什么所属公司,你只能抛却了---由于一个也不存在,但我们确实有一个 焦点委员会和CVS经管组,但这些工作组的设坐主如果为了进行治理工作而不是对PostgreSQL进行独有式控制,PostgreSQL项目是由任何人均 可加入的开发人员社区和所有效户控制的,你所需要做的就是定阅邮件列表,介入会商便可(要到场PostgreSQL的开发详见 开发人员常问题 (Developer's FAQ) 获守信息)。
1.3)PostgreSQL的版权是什么?
PostgreSQL的发布服从经典的BSD版权。它许可用户不限目标地使用PostgreSQL,乃至你可以贩卖PostgreSQL而不含源代码也可以,唯一的限制就是你不能因软件自身问题而向我们逃诉法令义务,另外就是请求所有的软件拷贝中须包括以下版权声明。下面就是我们所使用的BSD版权声明内容:
PostgreSQL数据库办理系统
部分版权(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.)
1.4)PostgreSQL 可以运转在哪些操纵系统仄台上?
普通说来,任何此刻对 UNIX 兼容的操作系统之上都能运行PostgreSQL 。在安装指北里列出了发布时颠末明白测试的平台。
PostgreSQl也可以直接运行在基于微软Windows-NT的操作系统,如Win2000 SP4,WinXP 和 Win2003,已建造实现的安装包可从 (Win95,Win98,WinMe)需要通过Cygwin摹拟情况运行PostgreSQL。
同时也有一个为Novell Netware 6开发的版本可从 n=Search&key=postgreSQL&stype=all&sort=type&dir=%2F 下载。
1.5) 我从那里能获得PostgreSQL?
通过浏览器可从 ftp://ftp.PostgreSQL.org/pub/站点下载。
1.6) 最新版的PostgreSQL是什么?
PostgreSQL 最新的版本是版本 8.2.1 。
我们企图每一年发布一个主要降级版本,每几个月发布一个小版本。
1.7) 我从哪里能得到对PostgreSQL的支持?
PostgreSQL社区通过邮件列表为其大多半用户提供资助,订阅邮件列表的主站点是 或 Bug邮件列表是一个较好的入手下手。
首要的IRC频道是在FreeNode(irc.freenode.net)的#postgresql,为了连上此频讲,可以使用UNIX法式irc,其指令格局: irc -c '#postgresql' "$USER" irc.freenode.net ,或使用其他IRC客户端步伐。在此收集中还存在一个PostgreSQL的西班牙频道(#postgersql-es)和法语频道 (#postgresql-fr)。一样地,在EFNET上也有一个PostgreSQL的交换频道。
可提供商业支持的公司列表可在
1.8) 我如何提交一个BUG陈说?
可会见 查抄有没有更新的PostgreSQL版本或补丁。
通过使用Bug提交表格或是发往PostgreSQL邮件列表的Bug每每会有以下之一复兴:
所提交内容不是一个Bug及其不是Bug的缘故原由。
所提交内容是一个已知的Bug而且已加入TODO待处理使命列表。
所提交的Bug已在当前版本中被改正。
所提交的Bug已批改但还没有将补钉插足此刻的公布软件包。
要求提交者提供更具体的信息:
操作系统
PostgreSQL版本
可重现Bug的测试案例
调试疑息
调试跟踪输出
所提交内容是一个新Bug,将执行以下工作:
创建一个新补丁并将其到场下一个次要版本或是小的改良版本中。
此Bug临时不能修正,将被加至TODO待处理任务列表。
1.9) 我如何相识已知的 BUG 或暂缺的功能?
PostgreSQL 支持一个扩大的 SQL:2003 的子散。参阅我们的TODO 列表,理解已知Bug列表、暂缺的功能和未来的开发打算。
要求增加新功能的申请平日会收到以下之一的回复:
该功能已参加TODO待处理义务列表。
该功能不是必须的,因为:
它是现有的且契合SQL尺度的某功用的反复。
该功能性会大大增加代码的复杂程序,而带来的益处是眇乎小哉的。
该功能是不平安或是不行靠的。
该功效将被到场TODO待处置惩罚使命列表。
PostgreSQL不使用Bug跟踪系统,因为我们发而今邮件列表中曲接答复和保证TODO义务列表老是处于最新形态的体式格局工作服从会更下一些。究竟上,Bug不会在我们的软件中存在很长时候,对影响许多用户的Bug也总是很快会被修正。唯一能找到所有改善、进步和建正的中央是CVS的日记信息,即便是在软件新版本的发布信息中也不会列出每处的软件更新。
1.10) 能够获取的最新文档有哪些?
PostgreSQL包括大量的文档,http://www.yele22.com,主要有详细的参考手册,手册页和一些的测试例子。拜见 /doc 目次(译注:应为 $PGHOME/doc)。 你还可以在线阅读PostgreSQL的手册,其网址是:
有两本关于PostgreSQL的书在线提供,在 和 。 也有大量的PostgreSQL册本可供采办,此中最为盛行的一本是由Korry Douglas编写的。在 s.php上 上有大批有关PostgreSQL书本的简介。在 客户真个饬令路程序psql有一些以 d 开首的敕令,可显示关于类型,操作符,函数,散开等信息,使用 ? 可以显示所有可用的命令。
我们的 web 站点包含更多的文档。
1.11) 我该当怎样进修 SQL ?
起首斟酌上述提到的取PostgreSQL相干的册本,别的一本是Teach Yourself SQL in 21 Days, Second Edition,其具体先容的网址是 咱们的很多用户喜好The Practical SQL Handbook, Bowman, Judith S. 编写,Addison-Wesley公司出书,其余的则喜好 The Complete Reference SQL, Groff 编写,McGraw-Hill公司出书。
在以下网址上也有很好的教程,他们是
1.12)如何提交补钉或是插手开发步队?
详见 开发人员常睹问题 (Developer's FAQ) 。
1.13)PostgreSQL和其他数据库系统比起来如何?
评估软件有好几种方法:功能,性能,靠得住性,支持和价钱。
功能 PostgreSQL 具有大型商用数据库最多的功能,例如:事务,子查询,触发器,视图,外键参考完好性和庞大的锁定等。 我们还有一些它们没有的特性,如用户定义类型,担当,法则和多版本并行控制以削减锁的争用等。
性能 PostgreSQL和其他商用和开源的数据库具备近似的机能。对某些处理它对照快,对其他一些处理它比力慢。 与其他数据库比拟,我们的性能好坏平日在 +/- 10%之间。
可靠性 我们都知道数据库必须是可靠的,否则它就一点用都没有。我们勉力做到发布颠末当真测试的,缺点起码的不乱代码。每一个版本最少有一个月的 beta 测试时间,并且我们的发布汗青显示我们可以提供稳固的,安稳的,可用于出产使用的版本。我们相信在这方面我们与其他的数据库软件是相当的。
撑持 我们的邮件列表供给一个十分大的开辟职员和用户的组以扶助解决所碰着的任何成绩。我们不克不及包管老是能处理题目,比拟之下,商用数据库硬件也并非总可以或许供给办理办法。 间接与开辟职员,用户群,脚册和源法式打仗使PostgreSQL的撑持比其他数据库借要好。另有一些贸易性的周全手艺支撑,可以给供应给那些需求的人。(参阅1.7 末节)
价钱 我们对任何用处都免费,包罗商用和非商用目标。 你可以不加限制地向你的产物里插足我们的代码,除那些我们在上面的版权声明里声明的 BSD版权以外的内容。 1.14) PostgreSQL可以处理近来各个国度夏时制的变革吗?
PostgreSQL 8.0之前的版本是使用操作系统中的时区数据库来处理夏时制的信息,自8.0版及当前的版本PostgreSQL会自身含有最新的时区信息。
用户客户端问题 2.1) 我们可以用什么语言和PostgreSQL打交道?
PostgreSQL(缺省情形)只安装有C和内嵌式C的接口,其他的接口都是自力的项目,可以或许划分下载,康宝莱,这些接口项目独立的益处 是他们可以有各自的发布规划和各自独立的开发组。
一些编程言语如PHP都有接见PostgreSQL的接口,Perl、TCL、Python以及许多其他说话的接口在 并且经过Internet很轻易搜刮到。
2.2) 有什么东西可以把PostgreSQL用于 Web 页面?
一个引见以数据库为后台的挺不错的站面是:
对付 Web 集成,PHP 是一个极好的接口。它在
关于复杂的任务,很多人采用 Perl 接口和 使用CGI.pm的DBD::Pg 或 mod_perl 。
2.3)PostgreSQL具有图形用户界面吗?
商业用户或是开源开发人员能找到很多的有关PostgreSQL的GUI图形工具软件,在 PostgreSQL社区文档有一个具体的列表。
系统管理问题 3.1)我怎样能把PostgreSQL装在 /usr/local/pgsql 之外的地方?
在运行 configure 时加上 --prefix 选项。
3.2) 我如何控制来自其他电脑的连接?
缺省状况下,PostgreSQL只容许来自本机且经由过程 unix 域套接字或TCP/IP体例的连接。 你只要在修正了设置装备摆设文件postgresql.conf中的listen_addresses,且也在设置文件$PGDATA/pg_hba.conf中翻开了 基于长途电脑( host-based )的身份认证,并从新启动PostgreSQL,否则其他电脑是不能与你的PostgreSQL服务器进行连接的。
3.3) 我怎样调剂数据库引擎以获得更好的性能?
有三个主要方面可以晋升PostgreSQL的潜能。
查询方式的变化 这主要触及修改查询方式以获取更好的性能:
创建索引,包孕表达式和部份索引;
使用COPY语句替代多个Insert语句;
将多个SQL语句构成一个事务以削减提交事务的开消;
从一个索引中提取多笔记录时使用CLUSTER;
从一个查询成绩中掏出部门纪录时使用LIMIT;
使用预编译式查询(Prepared Query);
使用ANALYZE以连结正确的优化统计;
按期使用 VACUUM 或 pg_autovacuum
进行大量数据更改时先删除索引(然后重修索引)
服务器的配置 配置文件postgres.conf中的很多设置都会影响性能,所有参数的列表可见: 管理员指南/数据库服务器运行情况/数据库服务器运行配置, 有关参数的诠释可见: /annotated_conf_e.html 和 /perf.html。 硬件的选择 计算机硬件对性能的影响可欣赏 formance/index.html 和 3.4)PostgreSQL里可以获得什么样的调试特性?
PostgreSQL 有很多相似 log_* 的服务器配置变量可用于查询的打印和进程统计,而这些工尴尬***难调试和性能测试很有匡助。
3.5) 为何在试图毗邻时支到“Sorry, too many clients(已有太多用户毗连)”动静?
这暗示你已到达缺省100个并发后台历程数的限制,你需要经由过程点窜postgresql.conf文件中的max_connections值来 增添postmaster的背景并发处置数,点窜后需从头启动postmaster。
3.6)PostgreSQL的升级过程有哪些内容?
PostgreSQL 开发组对每次小版本的进级首要只做了一些Bug批改事情,是以从 7.4.8 晋级到 7.4.9 不需要 dump 和 restore,仅需要遏制数据库服务器,装置更新后的软件包,然后重启服务器便可。
所有PostgreSQL的用户应该在最靠近(你所使用的主版本)的小改进版本发布尽快升级。虽然每次升级可能都有一点危险,PostgreSQL的小革新版仅仅是设想用来修正一些Bug的,代码窜改较少,所以风险照旧很小的。PostgreSQL社区以为一般情况下不升级的风险仍是多于升级的。
主版本的升级(例如从 7.3 到 7.4)凡是会修改系统表和数据表的内部花样。 这些改动一样平常对照复纯,因此我们不保持数据文件的向后兼容性。因此从老版本中进行数据导出(dump)/然后在新版本中进行数据导入(reload)对主版本的升级是必须的。
3.7)(使用PostgreSQL)我需要使用什么计较机硬件?
因为较量争论机硬件大大都是兼容的,人们总是偏向于相信所有计较机硬件量量也是雷同的。事真上不是, ECC RAM(带偶奇校验的内存),SCSI (硬盘)和优良的主板比一些自制货要愈加牢靠且拥有更好的性能。PostgreSQL险些可以运行在任何硬件上, 但如果靠得住性和性能对你的系统很主要,你就需要片面的研究一下你的硬件配置了。在我们的邮件列表上也有关于 硬件配置和性价比的计议。
操做问题 4.1) 若何只挑选一个查问成果的头多少止?或是随机的一行?
如果你只是要提取几行数据,并且你在执行查询中知道切实的行数,你可以使用LIMIT功能。 如果有一个索引与 ORDER BY中的条件匹配,PostgreSQL 可能就只处理要供的头几条记录, (否则将对全部查询进行处理直到生成需要的行)。如果在执行查询功能时不知道切当的记录数, 可使用游标(cursor)和FETCH功能。
可使用以下方法提取一行随机记录的:
SELECT cols
FROM tab
ORDER BY random()
LIMIT 1 ;4.2) 如何查看表、索引、数据库以及用户的定义?如何查看psql里用到的查询指令并显示它们?
在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语法。
4.3) 如何变动一个字段的数据类型?
在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 指令去使体系发出无效数据所占用的空间。
4.4) 单条记录,单个表,单个数据库的最大限制是若干?
下面是一些限制:
单个数据库最大尺寸? 有限制(已存在有 32TB 的数据库)
单个表的最大尺寸? 32 TB
一行记录的最大尺寸? 1.6 TB
一个字段的最大尺寸? 1 GB
一个表里最大行数? 无穷制
一个内外最大列数? 250-1600 (与列范例有闭)
一个表里的最大索引数目? 无穷制
固然,现实上没有真实的无穷制,仍是要受可用磁盘空间、可用内存/互换区的制约。 事实上,当上述这些数值变得异常地大时,系统性能也会受很大影响。
单表的最大大小 32 TB 不需要操作系统对单个文件也需这么大的支持。大表用多个 1 GB 的文件存储,因此文件系统大小的限制是不紧张的。
假如缺省的块大小增进到 32K ,最大的单表大小和最大列数还可以增长到四倍。
有一个限制就是不能对大小多于2000字节的列创建索引。荣幸地是这样的索引很罕用到。通过对多字节列的内容进行MD5哈密运算了局进行函数索引可对列的唯一性得到保证, 并且全文检索允许对列中的单词进行搜索。
4.5) 存储一个典型的文本文件里的数据需要几许磁盘空间?
一个 Postgres 数据库(存储一个文本文件)所占用的空间最多能够必要相称于这个文本文件本身大小5倍的磁盘空间。
例如,假定有一个 100,000 行的文件,每行有一个整数和一个文本描述。 假定文本串的均匀长度为20字节。文本文件占用 2.8 MB。存放这些数据的PostgreSQL数据库文件约莫是 6.4 MB:
28 字节: 每行的头(大约值)
24 字节: 一个整数型字段和一个文本型字段
+ 4 字节: 页面内指背元组的指针
----------------------------------------
56 字节每行
PostgreSQL 数据页的大小是 8192 字节 (8 KB),则:
8192 字节每页
------------------- = 146 行/数据页(向下取整)
56 字节每行
100000 数据行
-------------------- = 685 数据页(向上取整)
146 行/数据页
685 数据页 * 8192 字节/页 = 5,611,520 字节(5.6 MB)
索引不需要这么多的分外?丧,但也确切包孕被索引的数据,果此它们也可能很大。
空值NULL存放在位图中,因此占用很少的空间。
4.6) 为什么我的查询很缓?为什么这些查询没有操纵索引?
并不是每一个查询都邑自动使用索引。只有在表的大小跨越一个最小值,并且查询只会选中表中较小比例的纪录时才会采用索引。 这是因为索引扫描引发的随即磁盘存取可能比直接地读取表(次序扫描)更慢。
为了判定能否使用索引,PostgreSQL必须获得有关表的统计值。这些统计值可以使用 VACUUM ANALYZE,或 ANALYZE 获得。 使用统计值,优化器知道表中有几何行,就可以够更好地判定是不是哄骗索引。 统计值对肯定劣化的连接按次和连接方法也很有效。在表的内容产生转变时,应活期进行统计值的更新搜集。
索引凡是不消于 ORDER BY 或实行毗连。对一个年夜表的一次挨次扫描再做一次排序每每比索引扫描要快。但是,若是将 LIMIT 战 ORDER BY 连系正在一路利用的话,平常将会利用索引,由于这时候仅返回表中的一小部门记实。
如果你确信PostgreSQL的优化器使用次第扫描是不精确的,你可以使用SET enable_seqscan TO 'off'指令来封闭递次扫描, 然后再次运行查询,你就能够看出使用一个索引扫描是否的确要快一些。
当使用通配符操作,例如 LIKE 或 ~ 时,索引只能在特定的情况下使用:
字符串的起头部分必须是一般字符串,也就是说:
LIKE 模式不能以 % 打头。
~ (正则表白式)形式必需以 ^ 挨头。
字符串不能以匹配多个字符的模式类打头,比方 [a-e]。
大小写无关的查找,如 ILIKE 和 ~* 等不使用索引,但可以用 4.8 节描述的抒发式索引。
在做 initdb 时必需采用缺省的当地设置 C locale,因为系统不成能知道在非C locale情况时下一个最大字符是什么。 在这类环境下,你可以创建一个特别的text_pattern_ops索引来用于LIKE的索引。
在8.0之前的版本中,除非要查询的数据类型和索引的数据类型相匹配,可则索引常常是未被用到,出格是对int2,int8和数值型的索引。
4.7) 我如何才能看到查询优化器是怎样评估处理我的查询?
参考 EXPLAIN 手册页。
4.8) 我怎样做正则表达式搜刮和大小写无关的正则表达式查找?怎样操纵索引进行大小写无关查找?
操作符 ~ 处理正则表达式匹配,而 ~* 处理大小写无关的正则表达式匹配。大小写无关的 LIKE 变种成为 ILIKE。
大小写无关的等式比拟一般写做:
SELECT *
FROM tab
WHERE lower(col) = 'abc';
这样将不会使用标准的索引。但是可以创建一个在这种情况下使用的表达式索引:
CREATE INDEX tabindex ON tab (lower(col));
假如上述索引在创立时插手UNIQUE束缚,固然索引字段本身内容能够存储巨细写不限的内容,但假如有UNIQUE束缚后,那些内容不克不及仅仅是大小写分歧(不然会形成抵触)。为了包管没有发作这类环境,可使用CHECK约束前提或是触收器在录进时停止限定。
4.9) 在一个查询里,我怎样检测一个字段是否为 NULL ?我如何才能正确排序而不管某字段是否含 NULL 值?
用 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)4.10) 各类字符类型之间有什么差别? 类型 内部称号 申明
VARCHAR(n) varchar 指定了最大长度,变长字符串,缺乏定义长度的局部不补齐
CHAR(n) bpchar 定长字符串,实际数据不足定义长度时,以空格补齐
TEXT text 没有特此外上限限制(仅受行的最大长度限制)
BYTEA bytea 变长字节序列(使用NULL字符也是答应的)
"char" char 单个字符
在系统表和在一些错误信息里你将看到内部名称。
上里所列的前四品种型是"varlena"(变长)类型(也便是道,开首的四个字节是少度,前面才是数据)。 因而实践占用的空间比申明的大小要多一些。 然而这些类型如定义很长时皆可以被紧缩存储,是以磁盘空间也大概比料想的要少。
VARCHAR(n) 在存储限制了最大长度的变长字符串是最好的。 TEXT 合用于存储最大可达 1G摆布但不决义限制长度的字符串。
CHAR(n) 最合适于存储长度不异的字符串。 CHAR(n)会按照所给定的字段长度以空格补足(不敷的字段内容),而 VARCHAR(n) 只存储所给定的数据内容。 BYTEA 用于存储两进制数据,特别是包罗 NULL 字节的值。这些类型存在好未几的机能。
4.11.1) 我怎样创建一个序列号或是自动递增的字段?
PostgreSQL 支持 SERIAL 数据类型。(字段定义为SERIAL后)将自动创建一个序列生成器,例如:
CREATE TABLE person (
id SERIAL,
name TEXT
);
会自动转换为以下SQL语句:
CREATE SEQUENCE person_id_seq;
CREATE TABLE person (
id INT4 NOT NULL DEFAULT nextval('person_id_seq'),
name TEXT
);
参考 create_sequence 手册页获得关于序列生成器的更多信息。
4.11.2) 我如何获得一个插入的序列号的值?
一种圆法是在插入之前先用函数 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')");4.11.3) 同时使用 currval() 会导致和其他用户的冲突情况吗?
不会。currval() 返回的是你本次会话进程所赋的值而不是所有用户确当前值。
4.11.4) 为什么不在事务同常中断后重用序列号呢?为什么在序列号字段的取值中存在中断呢?
为了提高并发性,序列号在需要的时辰付与正在运行的事务,并且在事务完毕之前不进行锁定, 这就会致使异常中行的事务后,序列号会泛起距离。
4.12) 什么是 OID ?什么是 CTID ?
PostgreSQL 里创建的每行记载城市取得一个独一的OID,除非在创建表时使用WITHOUT OIDS选项。 OID建立时会主动天生一个4字节的整数,一切 OID 在响应PostgreSQL效劳器中均是独一的。 但是,它在跨越40亿时将溢出, OID尔后会呈现反复。PostgreSQL 在它的内部系统内外使用 OID 在表之间成立联络。
在用户的数据表中,最好是使用SERIAl来取代OID 因为SERIAL只要保证在单个表中的数值是唯一的就能够了,这样它溢出的可能性就非常小了, SERIAL8可用来生存8字节的序列数值。
CTID 用于标识带着数据块(地点)和(块内)偏偏移的特定的物理行。 CTID 在记录被更改或重载后发生改变。索引数据使用它们指向物理行。
4.13) 为甚么我收到毛病信息“ERROR: Memory exhausted in AllocSetAlloc()”?
这极可能是系统的假造内存用光了,大概内查对某些资本有较低的限制值。在启动 postmaster 之前尝尝下面的命令:
ulimit -d 262144
limit datasize 256m
取决于你用的 shell,上面命令只有一条能胜利,但是它将把你的进程数据段限制设得比较高, 因而或许能让查询完成。这条命令运用于当进步程,以及所有在这条命令运行后创建的子进程。 如果你是在运行SQL客户端时因为后台返回了太多的数据而出现问题,请在运行客户端之前执行上述命令。
4.14) 我如何才能知道所运行的PostgreSQL的版本?
从 psql 里,输入 SELECT version();指令。
4.15) 我如何创建一个缺省值是当前时间的字段?
使用 CURRENT_TIMESTAMP:
CREATE TABLE test (x int, modtime TIMESTAMP DEFAULT CURRENT_TIMESTAMP );4.16) 我怎样进行 outer join (外连接)?
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)。
4.17) 如何使用涉及多个数据库的查询?
不法子查询当前数据库以外的数据库。 由于PostgreSQL要减载与数据库相干的系统目次(系统表),因而跨数据库的查询如何履行是不定的。
附加增值模块contrib/dblink允许采用函数调用实现跨库查询。当然用户也可以同时连接到不同的数据库执行查询然后在客户端归并后果。
4.18) 如何让函数返回多行或多列数据?
在函数中返回数据记录集的功能是很简单使用的,详情参见: Functions
4.19) 为什么我在使用PL/PgSQL函数存取暂且表时会收到错误信息“relation with OID ##### does not exist”?
PL/PgSQL会缓存函数的剧本内容,由此带来的一个欠好的副感化是若一个 PL/PgSQL 函数拜候了一个且则表,然后该表被删除并重建了,则再次挪用该函数将失利, 因为缓存的函数内容仍旧指向旧的姑且表。解决的方法是在 PL/PgSQL 顶用EXECUTE 对且自表进行访问。这样会保证查询在执行前总会被从头剖析。
4.20) 今朝有哪些数据复制方案可用?
“复制”只是一个术语,有好几种复制技术可用,每种都有优点和瑕玷:
主/从复造方法是答应一个主办事器接管读/写的申请,而多个从服务器只能承受读/SELECT查询的申请, 今朝最风行且免费的主/从PostgreSQL复制计划是 Slony-I 。
多个主服务器的复制方式许可将读/写的申请发收给多台的计算机,这种方式由于需要在多台服务器之间同步数据变更 可能会带来较严峻的性能损得,Pgcluster是目前这种方案 中最好的,而且还可以避免费下载。
也有一些商业需付费和基于硬件的数据复制方案,支持上述各种复制模型。
4.21) 为何查询效果显示的表名或列名与我的查询语句中的不同?为何大写状况不能保存?
最多见的缘由是在创建表时对表名或是列名使用了双引号“”,当使用了双引号后,http://www.cnabk.com,表名或列名(称为标识符)存储时是辨别 大小写的, 这意谓着你在查询时表名或列名也应使用双引号,一些工具软件,像pgAdmin会在收回创建表的指令时自动地在每一个标识符上加双引号。 因此,为了标识符的同一,你应该:
在创建表时制止将标识符使用单引号引发来。
在标识符中只使用小写字母。
(为了与已存在的标识符沟通)在查询中使用双引号将标识符惹起来。
身世王谢
提及PostgreSQL,我们不能不道 Berkeley,也就是中文中的“加州大学伯克利分校”这所赫赫有名的大学。 诚恳说,伯克利(BSD)对盘算机科学的贡献堪称伟大,在全部计算机迷信的开展史上,几乎处处都有这所学 校的研究人员和门生的萍踪。只有略微对计算机技术史有些影象的人都市记得在 Unix 操作系统的生长里程碑上 BSD 这三个字的重量,然而大概正是由于 BSD 在系统和收集范畴里的光线太刺眼,掩饰了 BSD 对计算机技术其他分支的贡献,而PostgreSQL 正是此中之一。
追根究底天讲,PostgreSQL 最早入手下手于 BSD 的 Ingres 名目,这个项目重要是研讨干系型数据库手艺,早在 1970 年 E.F. Codd 就提出了关系模子,从那今后,人类在较量争论机范畴的数据治理就进进了一个新的期间。今后人们起头用抽象的关系语句来形貌本身的 数据,大大进步了人类对数据的笼统描写才能。而 Ingres 项目恰是就此举行研究的,它初于 1977 年,到 1985 年竣事,而其研究功效厥后被一家叫Relational Technologies 的贸易公司拿往做成了商品软件,后来这家公司又被 Computer Associates(CA)收买,不晓得 CA 的 JASMINE内里是不是还有昔时 Ingres 的影子?
新项目 Postgres
然后,从1986年开端,BSD 的 Michael Stonebraker 传授带领了称为 Postgres 的“后Ingres”项目, 其主要目的是数据库管理系统的更初级研究,因此而发生了 PostgreSQL 的直接前身,Postgres,而 PostgreSQL 的名字也是从 Postgres 项目继续过来的。 这个项目的功效长短常庞大的,在当代数据库的很多方面都做出的大量的孝敬,好比,面向对象的数据库, 部分索引技术,划定规矩,历程和数据库扩大等方面都走在了数据库管理系统的前线。而且,Stonebraker 传授还做出了一件制祸全人类的工作, 那就是把 Postgres 放在了 BSD 版权的庇护下,在这个版权的范畴里,任何人几乎可以做任何工作,包括加强它和商业化等。条件只是把 BSD 的版权声明包括在软件的源程序里。
Postgres 在 1989 年发布了第一个版本,因为是BSD版权,所以很快在各种研究机构和一些公家服务构造里普遍使用起来, 因为 浩繁用户使 Postgres 的开发变得更多地是保护代码和打补丁,而日趋背叛了本来的数据库管理系统的研究的目的, 到了1994年 Postgres 在版本4.2 的时刻正式停止。而 Postgres 的许多结果则转化成一个商业公司 Illustra,后来 Illustra 被 Informix 收购。看到这里,念必各人应当对Postgres 的影响有一些熟悉了吧。
炎黄子孙的奉献 Postgres95
Postgres 并没有因为 Postgres 项目的末止而截止成长,而是获得了一次重生:在1994年,两名伯克利的研究生在做研究生课题的时分,向 Postgres 里增添了现代的 SQL 语言的支持。请不要奇异,SQL 的祖宗是 E.F. Codd 的关系模子,然则 SQL 作为语言,不停到1992年才构成真实的国际标准(照旧草案),其时称为 SQL2,可是人们常称为 SQL92。而在那之前,所以查询语言都是由不同的数据库管理系统本身实现的,比方,在 Postgres 里本来是用叫 Postquel 的查询语言;这两位研究生是 Andrew Yu 和 Jolly Chen,看了名字,大师可能会想:“很象中国人的名字嘛”,没错,他们就是乌头发黄皮肤的炎黄子孙,不外很惋惜的是他们并没有在中国的(包括台湾省的)xx大学获得这样的成绩。这样,Postgres 迎来了 1995年,大要 是受xxxxxxx95 的定名方法的“开导”吧,他们俩把这个版本的 Postgres 定名为Postgres95,并且持续发布了几个版本,增强了一些特性。
PostgreSQL 可以说是最富特点的自由数据库管理系统,以至我们也可以说是最壮大的自由软件数据库管理系统。事实上, PostgreSQL 的特性笼盖了 SQL-2/SQL-92 和 SQL-3/SQL-99,起首,它包括了可以说是目宿世界上最富厚的数据类型的支持,个中有些数据类型可以说连商业数据库都不具有, 比如 IP 类型和多少类型等;其次,PostgreSQL 是全功能的自由软件数据库,很长工夫以来,PostgreSQL 是唯一支持事务、子查询、多版本并行控制系统、数据完备性查抄等特性的唯一的一种自由软件的数据库管理系统。直到比来才有 Inprise 的InterBase 以及 SAP 等厂商将其本来专有软件开放为自由软件以后才突破了这个唯一。最初,PostgreSQL拥有一支极度活泼的开发队伍,目前的提交人员曾经超越三十人, 而且在许多黑客的尽力下,PostgreSQL 的质量日趋提高,也从另外一个侧面上增加了人们使用 PostgreSQL 的决定信念,究竟?结果数据库管理系统不能象桌面操作系统那样 一天宕一次还让人感觉挺对劲 :-P。
从技能角度来说,PostgreSQL 接纳的是比力典范的 C/S (client/server)布局,也就是一个客户端对应一个服务器端保卫历程的模式, 这个保护进程阐发客户端来的查询恳求,死陈规划树,进行数据检索并终极把成绩花式化输出后返回给客户端。为了便于客户真个顺序的编写,由数据库服务器提供了同一的客户端 C 接口。而不同的客户端接口都是源自这个 C 接口,好比 ODBC,JDBC,Python,Perl ,Tcl,C/C++,ESQL 等, 同时也要指出的是,PostgreSQL 对接口的支持也长短常丰硕的,几近收持所有类型的数据库客户端接口。这一点也能够说是 PostgreSQL 一大长处。
说完长处,不能不说几句错误谬误,不能因为是自由软件而左袒 PostgreSQL,从 Postgres 最先,PostgreSQL 就承受了屡次转变。
首先,初期的 PostgreSQL 继续了几乎所有 Ingres, Postgres, Postgres95 的问题:过于学院味,因为首先它的目的是数据库研究,因此岂论在不变性, 性能照样使用便利方面,持久以来一向没有得到器重,直到 PostgreSQL 项目最先今后,情况才愈来愈好,目前,PostgreSQL 已经完全可以胜任任何中上规榜样围内的利用规模的营业。目前有报导的出产数据库的大小已经有 TB 级的数据量,已经迫近 32 位计算的极限。 不外学院味也给 PostgreSQL 带来一个意想不到的优点:大约因为各大学的软硬件环境差别太大的原因,它是目前支持平台最多的数据库管理系统的一种, 所支持的平台多达十几种,包括不同的系统,不同的硬件系统。至古,它仍然连结着支持平台最多的数据库管理系统的称呼。
其次,PostgreSQL 切实其实还完善一些比较高端的数据库管理系统需要的特性,比如联机热备份,数据库集群,更精良的管理工具和越发自动化的系统优化功能 等提高数据库性能的机制等,房地产税 收检查。
但是,话说返来,PostgreSQL 拥有极为壮大的扩展本领,你可以很轻易地扩展数据类型,内部函数,堆积,操作符等等,而且,别记了,你拥有所有的源程序, 实际上你可以做任何你可以做的事变。因此,很多弱点,在弹指之间就会消散也是很一般的。
总而行之,PostgreSQL的特征已完全可以知足尽大部份用户的需要,并且其品质和特性依然在一日千里地前进着,以是, 我们有来由信赖在不近的未来,PostgreSQL 必定可以成为一种良好的,自在的,贸易数据库的替换产物。
总结
作为一种数据库管理系统,PostgreSQL 其实不象 Linux 与某些商业操作系统相比那样,得到敏捷普遍的认可,这一点是可以了解的,Tom Lan 曾有一段话说得其实: “尾先,商业数据库系统不象某些商业操作系统那样其实太烂,相反,商业数据库系统的质量照样异常高的,与之相比,PostgreSQL 仍然有必然差异”但同时他也相信 “我们已经达到商业级的数据库系统的质量......”
的确,自由软件的发展具有腾跃性,因为开发者大多是使用空余时间进行开发,当开发者云集的时刻,新的工具可能一会儿就增加上来;而如果在自由软件活动的低潮时, 因为贫乏开发人员,所以可能会有一长段时间的寂静,然后又会跟着社会的发展而出现新的勾当。也就是一种螺旋的回升。
因此,我们在面临自由软件的时辰,肯定要有一点:要相信自己和依赖自己,因为自由软件的发展简直需要每个快乐喜爱者充实阐扬自己的智慧才干, 同时,也只有自由软件给你提供了这样的机遇——依托本人的气力改变自己的运气。末了,也只有这样,自由软件之光才能真正晖映我们的世界。
PostgreSQL常见问题(FAQ)
常见问题
1.1)PostgreSQL 是什么?该怎样发音?
1.2)谁掌握和经管PostgreSQL ?
1.3)PostgreSQL的版权是什么?
1.4)PostgreSQL可以运行在哪些操作系统平台上?
1.5)我从哪里能得到PostgreSQL?
1.6)最新版的PostgreSQL 是什么?
1.7)我从哪里能得到对PostgreSQL 的支持?
1.8)我怎样提交一个BUG陈述?
1.9)我如何认识已知的 BUG 或久缺的功能?
1.10)能够获取的最新文档有哪些?
1.11)我应当怎样进修 SQL ?
1.12)如何提交补丁或是加入开发部队?
1.13)PostgreSQL 和其他数据库系统比起来如何?
1.14)PostgreSQL 可以处理比来各个国度夏时制的变化吗?
用户客户端问题
2.1)我们可以用什么说话和PostgreSQL 打交道?
2.2)有什么工具可以把PostgreSQL 用于 Web 页面?
2.3)PostgreSQL 拥有图形用户界面吗?
系统办理问题
3.1)我如何才气把PostgreSQL 拆在 /usr/local/pgsql 之外的处所?
3.2)我如何节制来自其他电脑的连接?
3.3)我怎样调解数据库服务器以获得更好的性能?
3.4)PostgreSQL 里可以获得什么样的调试特性?
3.5)为什么在试图连接登录时收到“Sorry, too many clients” 动静?
3.6)PostgreSQL的进级进程有哪些内容?
3.7)(使用PostgreSQL)我需要使用什么计算机硬件?
操纵题目
4.1) 如何只选择一个查询成效的头几行?或是随机的一行?
4.2) 如何查看表、索引、数据库和用户的定义?如何检察psql里用到的查询指令并显现它们?
4.3) 如何更改一个字段的数据类型?
4.4) 单笔记录,单个表,一个数据库的最大限制是几?
4.5) 存储一个典范的文本文件里的数据需要几多磁盘空间?
4.6) 为什么我的查询很慢?为什么这些查询没有益用索引?
4.7) 我如何才能看到查询优化器是怎样评价处理我的查询的?
4.8) 我怎样做正则表达式搜索和大小写无关的正则表达式查找?怎样行使索引进行大小写无关查找?
4.9) 在一个查询里,我怎样检测一个字段是否为 NULL?我如何才能精确排序而非论某字段是否含NULL值?
4.10) 种种字符类型之间有什么不同?
4.11.1) 我如何创建一个序列号型或是主动递删的字段?
4.11.2) 我如何得到一个插入的序列号的值?
4.11.3) 同时运用 currval() 会招致和其他用户的辩论情形吗?
4.11.4) 为甚么不在事件非常中断后重用序列号呢?为何在序列号字段的与值中存在中断呢?
4.12) 什么是 OID?什么是 CTID ?
4.13) 为什么我收到错误信息“ERROR: Memory exhausted in AllocSetAlloc()”?
4.14) 我如何才能知道所运行的 PostgreSQL 的版本?
4.15) 我如何创建一个缺省值是当前时间的字段?
4.16) 如何执行外连接(outer join)查询?
4.17) 如何施行触及多个数据库的查询?
4.18) 如何让函数返回多行或多列数据?
4.19) 为什么我在使用PL/PgSQL函数存取一时表时会收到错误信息“relation with OID ##### does not exist”? 4.20) 现在有哪些数据复制方案可用?
4.21) 为什么查询成效隐示的表名或列名与我的查询语句中的不同?为什么大写状况不能保存?
常见问题 1.1)PostgreSQL 是什么?该怎样发音?
PostgreSQL 读作 Post-Gres-Q-L,偶然候也简称为Postgres 。想听一下其发音的人员可从这里下载声音文件: MP3 格式。
PostgreSQL 是面向方针的关系数据库系统,它具有传统商业数据库系统的所有功能,同时又含有将鄙人一代 DBMS 系统的使用的增强特性。PostgreSQL 是自由免费的,并且所有源代码都可以获得。
PostgreSQL 的开发队伍主要为自愿者,他们遍及天下各地并通过互联网进行接洽,这是一个社区开发项目,它不被任何公司控制。 如想加入开发队伍,请拜见开发人员常见问题(FAQ) /FAQ_DEV.html
1.2) 谁节制PostgreSQL ?
若是你在探求PostgreSQL的掌门人,或是什么中心委员会,或是什么所属公司,你只能抛却了---由于一个也不存在,但我们确实有一个 焦点委员会和CVS经管组,但这些工作组的设坐主如果为了进行治理工作而不是对PostgreSQL进行独有式控制,PostgreSQL项目是由任何人均 可加入的开发人员社区和所有效户控制的,你所需要做的就是定阅邮件列表,介入会商便可(要到场PostgreSQL的开发详见 开发人员常问题 (Developer's FAQ) 获守信息)。
1.3)PostgreSQL的版权是什么?
PostgreSQL的发布服从经典的BSD版权。它许可用户不限目标地使用PostgreSQL,乃至你可以贩卖PostgreSQL而不含源代码也可以,唯一的限制就是你不能因软件自身问题而向我们逃诉法令义务,另外就是请求所有的软件拷贝中须包括以下版权声明。下面就是我们所使用的BSD版权声明内容:
PostgreSQL数据库办理系统
部分版权(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.)
1.4)PostgreSQL 可以运转在哪些操纵系统仄台上?
普通说来,任何此刻对 UNIX 兼容的操作系统之上都能运行PostgreSQL 。在安装指北里列出了发布时颠末明白测试的平台。
PostgreSQl也可以直接运行在基于微软Windows-NT的操作系统,如Win2000 SP4,WinXP 和 Win2003,已建造实现的安装包可从 (Win95,Win98,WinMe)需要通过Cygwin摹拟情况运行PostgreSQL。
同时也有一个为Novell Netware 6开发的版本可从 n=Search&key=postgreSQL&stype=all&sort=type&dir=%2F 下载。
1.5) 我从那里能获得PostgreSQL?
通过浏览器可从 ftp://ftp.PostgreSQL.org/pub/站点下载。
1.6) 最新版的PostgreSQL是什么?
PostgreSQL 最新的版本是版本 8.2.1 。
我们企图每一年发布一个主要降级版本,每几个月发布一个小版本。
1.7) 我从哪里能得到对PostgreSQL的支持?
PostgreSQL社区通过邮件列表为其大多半用户提供资助,订阅邮件列表的主站点是 或 Bug邮件列表是一个较好的入手下手。
首要的IRC频道是在FreeNode(irc.freenode.net)的#postgresql,为了连上此频讲,可以使用UNIX法式irc,其指令格局: irc -c '#postgresql' "$USER" irc.freenode.net ,或使用其他IRC客户端步伐。在此收集中还存在一个PostgreSQL的西班牙频道(#postgersql-es)和法语频道 (#postgresql-fr)。一样地,在EFNET上也有一个PostgreSQL的交换频道。
可提供商业支持的公司列表可在
1.8) 我如何提交一个BUG陈说?
可会见 查抄有没有更新的PostgreSQL版本或补丁。
通过使用Bug提交表格或是发往PostgreSQL邮件列表的Bug每每会有以下之一复兴:
所提交内容不是一个Bug及其不是Bug的缘故原由。
所提交内容是一个已知的Bug而且已加入TODO待处理使命列表。
所提交的Bug已在当前版本中被改正。
所提交的Bug已批改但还没有将补钉插足此刻的公布软件包。
要求提交者提供更具体的信息:
操作系统
PostgreSQL版本
可重现Bug的测试案例
调试疑息
调试跟踪输出
所提交内容是一个新Bug,将执行以下工作:
创建一个新补丁并将其到场下一个次要版本或是小的改良版本中。
此Bug临时不能修正,将被加至TODO待处理任务列表。
1.9) 我如何相识已知的 BUG 或暂缺的功能?
PostgreSQL 支持一个扩大的 SQL:2003 的子散。参阅我们的TODO 列表,理解已知Bug列表、暂缺的功能和未来的开发打算。
要求增加新功能的申请平日会收到以下之一的回复:
该功能已参加TODO待处理义务列表。
该功能不是必须的,因为:
它是现有的且契合SQL尺度的某功用的反复。
该功能性会大大增加代码的复杂程序,而带来的益处是眇乎小哉的。
该功能是不平安或是不行靠的。
该功效将被到场TODO待处置惩罚使命列表。
PostgreSQL不使用Bug跟踪系统,因为我们发而今邮件列表中曲接答复和保证TODO义务列表老是处于最新形态的体式格局工作服从会更下一些。究竟上,Bug不会在我们的软件中存在很长时候,对影响许多用户的Bug也总是很快会被修正。唯一能找到所有改善、进步和建正的中央是CVS的日记信息,即便是在软件新版本的发布信息中也不会列出每处的软件更新。
1.10) 能够获取的最新文档有哪些?
PostgreSQL包括大量的文档,http://www.yele22.com,主要有详细的参考手册,手册页和一些的测试例子。拜见 /doc 目次(译注:应为 $PGHOME/doc)。 你还可以在线阅读PostgreSQL的手册,其网址是:
有两本关于PostgreSQL的书在线提供,在 和 。 也有大量的PostgreSQL册本可供采办,此中最为盛行的一本是由Korry Douglas编写的。在 s.php上 上有大批有关PostgreSQL书本的简介。在 客户真个饬令路程序psql有一些以 d 开首的敕令,可显示关于类型,操作符,函数,散开等信息,使用 ? 可以显示所有可用的命令。
我们的 web 站点包含更多的文档。
1.11) 我该当怎样进修 SQL ?
起首斟酌上述提到的取PostgreSQL相干的册本,别的一本是Teach Yourself SQL in 21 Days, Second Edition,其具体先容的网址是 咱们的很多用户喜好The Practical SQL Handbook, Bowman, Judith S. 编写,Addison-Wesley公司出书,其余的则喜好 The Complete Reference SQL, Groff 编写,McGraw-Hill公司出书。
在以下网址上也有很好的教程,他们是
1.12)如何提交补钉或是插手开发步队?
详见 开发人员常睹问题 (Developer's FAQ) 。
1.13)PostgreSQL和其他数据库系统比起来如何?
评估软件有好几种方法:功能,性能,靠得住性,支持和价钱。
功能 PostgreSQL 具有大型商用数据库最多的功能,例如:事务,子查询,触发器,视图,外键参考完好性和庞大的锁定等。 我们还有一些它们没有的特性,如用户定义类型,担当,法则和多版本并行控制以削减锁的争用等。
性能 PostgreSQL和其他商用和开源的数据库具备近似的机能。对某些处理它对照快,对其他一些处理它比力慢。 与其他数据库比拟,我们的性能好坏平日在 +/- 10%之间。
可靠性 我们都知道数据库必须是可靠的,否则它就一点用都没有。我们勉力做到发布颠末当真测试的,缺点起码的不乱代码。每一个版本最少有一个月的 beta 测试时间,并且我们的发布汗青显示我们可以提供稳固的,安稳的,可用于出产使用的版本。我们相信在这方面我们与其他的数据库软件是相当的。
撑持 我们的邮件列表供给一个十分大的开辟职员和用户的组以扶助解决所碰着的任何成绩。我们不克不及包管老是能处理题目,比拟之下,商用数据库硬件也并非总可以或许供给办理办法。 间接与开辟职员,用户群,脚册和源法式打仗使PostgreSQL的撑持比其他数据库借要好。另有一些贸易性的周全手艺支撑,可以给供应给那些需求的人。(参阅1.7 末节)
价钱 我们对任何用处都免费,包罗商用和非商用目标。 你可以不加限制地向你的产物里插足我们的代码,除那些我们在上面的版权声明里声明的 BSD版权以外的内容。 1.14) PostgreSQL可以处理近来各个国度夏时制的变革吗?
PostgreSQL 8.0之前的版本是使用操作系统中的时区数据库来处理夏时制的信息,自8.0版及当前的版本PostgreSQL会自身含有最新的时区信息。
用户客户端问题 2.1) 我们可以用什么语言和PostgreSQL打交道?
PostgreSQL(缺省情形)只安装有C和内嵌式C的接口,其他的接口都是自力的项目,可以或许划分下载,康宝莱,这些接口项目独立的益处 是他们可以有各自的发布规划和各自独立的开发组。
一些编程言语如PHP都有接见PostgreSQL的接口,Perl、TCL、Python以及许多其他说话的接口在 并且经过Internet很轻易搜刮到。
2.2) 有什么东西可以把PostgreSQL用于 Web 页面?
一个引见以数据库为后台的挺不错的站面是:
对付 Web 集成,PHP 是一个极好的接口。它在
关于复杂的任务,很多人采用 Perl 接口和 使用CGI.pm的DBD::Pg 或 mod_perl 。
2.3)PostgreSQL具有图形用户界面吗?
商业用户或是开源开发人员能找到很多的有关PostgreSQL的GUI图形工具软件,在 PostgreSQL社区文档有一个具体的列表。
系统管理问题 3.1)我怎样能把PostgreSQL装在 /usr/local/pgsql 之外的地方?
在运行 configure 时加上 --prefix 选项。
3.2) 我如何控制来自其他电脑的连接?
缺省状况下,PostgreSQL只容许来自本机且经由过程 unix 域套接字或TCP/IP体例的连接。 你只要在修正了设置装备摆设文件postgresql.conf中的listen_addresses,且也在设置文件$PGDATA/pg_hba.conf中翻开了 基于长途电脑( host-based )的身份认证,并从新启动PostgreSQL,否则其他电脑是不能与你的PostgreSQL服务器进行连接的。
3.3) 我怎样调剂数据库引擎以获得更好的性能?
有三个主要方面可以晋升PostgreSQL的潜能。
查询方式的变化 这主要触及修改查询方式以获取更好的性能:
创建索引,包孕表达式和部份索引;
使用COPY语句替代多个Insert语句;
将多个SQL语句构成一个事务以削减提交事务的开消;
从一个索引中提取多笔记录时使用CLUSTER;
从一个查询成绩中掏出部门纪录时使用LIMIT;
使用预编译式查询(Prepared Query);
使用ANALYZE以连结正确的优化统计;
按期使用 VACUUM 或 pg_autovacuum
进行大量数据更改时先删除索引(然后重修索引)
服务器的配置 配置文件postgres.conf中的很多设置都会影响性能,所有参数的列表可见: 管理员指南/数据库服务器运行情况/数据库服务器运行配置, 有关参数的诠释可见: /annotated_conf_e.html 和 /perf.html。 硬件的选择 计算机硬件对性能的影响可欣赏 formance/index.html 和 3.4)PostgreSQL里可以获得什么样的调试特性?
PostgreSQL 有很多相似 log_* 的服务器配置变量可用于查询的打印和进程统计,而这些工尴尬***难调试和性能测试很有匡助。
3.5) 为何在试图毗邻时支到“Sorry, too many clients(已有太多用户毗连)”动静?
这暗示你已到达缺省100个并发后台历程数的限制,你需要经由过程点窜postgresql.conf文件中的max_connections值来 增添postmaster的背景并发处置数,点窜后需从头启动postmaster。
3.6)PostgreSQL的升级过程有哪些内容?
PostgreSQL 开发组对每次小版本的进级首要只做了一些Bug批改事情,是以从 7.4.8 晋级到 7.4.9 不需要 dump 和 restore,仅需要遏制数据库服务器,装置更新后的软件包,然后重启服务器便可。
所有PostgreSQL的用户应该在最靠近(你所使用的主版本)的小改进版本发布尽快升级。虽然每次升级可能都有一点危险,PostgreSQL的小革新版仅仅是设想用来修正一些Bug的,代码窜改较少,所以风险照旧很小的。PostgreSQL社区以为一般情况下不升级的风险仍是多于升级的。
主版本的升级(例如从 7.3 到 7.4)凡是会修改系统表和数据表的内部花样。 这些改动一样平常对照复纯,因此我们不保持数据文件的向后兼容性。因此从老版本中进行数据导出(dump)/然后在新版本中进行数据导入(reload)对主版本的升级是必须的。
3.7)(使用PostgreSQL)我需要使用什么计较机硬件?
因为较量争论机硬件大大都是兼容的,人们总是偏向于相信所有计较机硬件量量也是雷同的。事真上不是, ECC RAM(带偶奇校验的内存),SCSI (硬盘)和优良的主板比一些自制货要愈加牢靠且拥有更好的性能。PostgreSQL险些可以运行在任何硬件上, 但如果靠得住性和性能对你的系统很主要,你就需要片面的研究一下你的硬件配置了。在我们的邮件列表上也有关于 硬件配置和性价比的计议。
操做问题 4.1) 若何只挑选一个查问成果的头多少止?或是随机的一行?
如果你只是要提取几行数据,并且你在执行查询中知道切实的行数,你可以使用LIMIT功能。 如果有一个索引与 ORDER BY中的条件匹配,PostgreSQL 可能就只处理要供的头几条记录, (否则将对全部查询进行处理直到生成需要的行)。如果在执行查询功能时不知道切当的记录数, 可使用游标(cursor)和FETCH功能。
可使用以下方法提取一行随机记录的:
SELECT cols
FROM tab
ORDER BY random()
LIMIT 1 ;4.2) 如何查看表、索引、数据库以及用户的定义?如何查看psql里用到的查询指令并显示它们?
在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语法。
4.3) 如何变动一个字段的数据类型?
在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 指令去使体系发出无效数据所占用的空间。
4.4) 单条记录,单个表,单个数据库的最大限制是若干?
下面是一些限制:
单个数据库最大尺寸? 有限制(已存在有 32TB 的数据库)
单个表的最大尺寸? 32 TB
一行记录的最大尺寸? 1.6 TB
一个字段的最大尺寸? 1 GB
一个表里最大行数? 无穷制
一个内外最大列数? 250-1600 (与列范例有闭)
一个表里的最大索引数目? 无穷制
固然,现实上没有真实的无穷制,仍是要受可用磁盘空间、可用内存/互换区的制约。 事实上,当上述这些数值变得异常地大时,系统性能也会受很大影响。
单表的最大大小 32 TB 不需要操作系统对单个文件也需这么大的支持。大表用多个 1 GB 的文件存储,因此文件系统大小的限制是不紧张的。
假如缺省的块大小增进到 32K ,最大的单表大小和最大列数还可以增长到四倍。
有一个限制就是不能对大小多于2000字节的列创建索引。荣幸地是这样的索引很罕用到。通过对多字节列的内容进行MD5哈密运算了局进行函数索引可对列的唯一性得到保证, 并且全文检索允许对列中的单词进行搜索。
4.5) 存储一个典型的文本文件里的数据需要几许磁盘空间?
一个 Postgres 数据库(存储一个文本文件)所占用的空间最多能够必要相称于这个文本文件本身大小5倍的磁盘空间。
例如,假定有一个 100,000 行的文件,每行有一个整数和一个文本描述。 假定文本串的均匀长度为20字节。文本文件占用 2.8 MB。存放这些数据的PostgreSQL数据库文件约莫是 6.4 MB:
28 字节: 每行的头(大约值)
24 字节: 一个整数型字段和一个文本型字段
+ 4 字节: 页面内指背元组的指针
----------------------------------------
56 字节每行
PostgreSQL 数据页的大小是 8192 字节 (8 KB),则:
8192 字节每页
------------------- = 146 行/数据页(向下取整)
56 字节每行
100000 数据行
-------------------- = 685 数据页(向上取整)
146 行/数据页
685 数据页 * 8192 字节/页 = 5,611,520 字节(5.6 MB)
索引不需要这么多的分外?丧,但也确切包孕被索引的数据,果此它们也可能很大。
空值NULL存放在位图中,因此占用很少的空间。
4.6) 为什么我的查询很缓?为什么这些查询没有操纵索引?
并不是每一个查询都邑自动使用索引。只有在表的大小跨越一个最小值,并且查询只会选中表中较小比例的纪录时才会采用索引。 这是因为索引扫描引发的随即磁盘存取可能比直接地读取表(次序扫描)更慢。
为了判定能否使用索引,PostgreSQL必须获得有关表的统计值。这些统计值可以使用 VACUUM ANALYZE,或 ANALYZE 获得。 使用统计值,优化器知道表中有几何行,就可以够更好地判定是不是哄骗索引。 统计值对肯定劣化的连接按次和连接方法也很有效。在表的内容产生转变时,应活期进行统计值的更新搜集。
索引凡是不消于 ORDER BY 或实行毗连。对一个年夜表的一次挨次扫描再做一次排序每每比索引扫描要快。但是,若是将 LIMIT 战 ORDER BY 连系正在一路利用的话,平常将会利用索引,由于这时候仅返回表中的一小部门记实。
如果你确信PostgreSQL的优化器使用次第扫描是不精确的,你可以使用SET enable_seqscan TO 'off'指令来封闭递次扫描, 然后再次运行查询,你就能够看出使用一个索引扫描是否的确要快一些。
当使用通配符操作,例如 LIKE 或 ~ 时,索引只能在特定的情况下使用:
字符串的起头部分必须是一般字符串,也就是说:
LIKE 模式不能以 % 打头。
~ (正则表白式)形式必需以 ^ 挨头。
字符串不能以匹配多个字符的模式类打头,比方 [a-e]。
大小写无关的查找,如 ILIKE 和 ~* 等不使用索引,但可以用 4.8 节描述的抒发式索引。
在做 initdb 时必需采用缺省的当地设置 C locale,因为系统不成能知道在非C locale情况时下一个最大字符是什么。 在这类环境下,你可以创建一个特别的text_pattern_ops索引来用于LIKE的索引。
在8.0之前的版本中,除非要查询的数据类型和索引的数据类型相匹配,可则索引常常是未被用到,出格是对int2,int8和数值型的索引。
4.7) 我如何才能看到查询优化器是怎样评估处理我的查询?
参考 EXPLAIN 手册页。
4.8) 我怎样做正则表达式搜刮和大小写无关的正则表达式查找?怎样操纵索引进行大小写无关查找?
操作符 ~ 处理正则表达式匹配,而 ~* 处理大小写无关的正则表达式匹配。大小写无关的 LIKE 变种成为 ILIKE。
大小写无关的等式比拟一般写做:
SELECT *
FROM tab
WHERE lower(col) = 'abc';
这样将不会使用标准的索引。但是可以创建一个在这种情况下使用的表达式索引:
CREATE INDEX tabindex ON tab (lower(col));
假如上述索引在创立时插手UNIQUE束缚,固然索引字段本身内容能够存储巨细写不限的内容,但假如有UNIQUE束缚后,那些内容不克不及仅仅是大小写分歧(不然会形成抵触)。为了包管没有发作这类环境,可使用CHECK约束前提或是触收器在录进时停止限定。
4.9) 在一个查询里,我怎样检测一个字段是否为 NULL ?我如何才能正确排序而不管某字段是否含 NULL 值?
用 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)4.10) 各类字符类型之间有什么差别? 类型 内部称号 申明
VARCHAR(n) varchar 指定了最大长度,变长字符串,缺乏定义长度的局部不补齐
CHAR(n) bpchar 定长字符串,实际数据不足定义长度时,以空格补齐
TEXT text 没有特此外上限限制(仅受行的最大长度限制)
BYTEA bytea 变长字节序列(使用NULL字符也是答应的)
"char" char 单个字符
在系统表和在一些错误信息里你将看到内部名称。
上里所列的前四品种型是"varlena"(变长)类型(也便是道,开首的四个字节是少度,前面才是数据)。 因而实践占用的空间比申明的大小要多一些。 然而这些类型如定义很长时皆可以被紧缩存储,是以磁盘空间也大概比料想的要少。
VARCHAR(n) 在存储限制了最大长度的变长字符串是最好的。 TEXT 合用于存储最大可达 1G摆布但不决义限制长度的字符串。
CHAR(n) 最合适于存储长度不异的字符串。 CHAR(n)会按照所给定的字段长度以空格补足(不敷的字段内容),而 VARCHAR(n) 只存储所给定的数据内容。 BYTEA 用于存储两进制数据,特别是包罗 NULL 字节的值。这些类型存在好未几的机能。
4.11.1) 我怎样创建一个序列号或是自动递增的字段?
PostgreSQL 支持 SERIAL 数据类型。(字段定义为SERIAL后)将自动创建一个序列生成器,例如:
CREATE TABLE person (
id SERIAL,
name TEXT
);
会自动转换为以下SQL语句:
CREATE SEQUENCE person_id_seq;
CREATE TABLE person (
id INT4 NOT NULL DEFAULT nextval('person_id_seq'),
name TEXT
);
参考 create_sequence 手册页获得关于序列生成器的更多信息。
4.11.2) 我如何获得一个插入的序列号的值?
一种圆法是在插入之前先用函数 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')");4.11.3) 同时使用 currval() 会导致和其他用户的冲突情况吗?
不会。currval() 返回的是你本次会话进程所赋的值而不是所有用户确当前值。
4.11.4) 为什么不在事务同常中断后重用序列号呢?为什么在序列号字段的取值中存在中断呢?
为了提高并发性,序列号在需要的时辰付与正在运行的事务,并且在事务完毕之前不进行锁定, 这就会致使异常中行的事务后,序列号会泛起距离。
4.12) 什么是 OID ?什么是 CTID ?
PostgreSQL 里创建的每行记载城市取得一个独一的OID,除非在创建表时使用WITHOUT OIDS选项。 OID建立时会主动天生一个4字节的整数,一切 OID 在响应PostgreSQL效劳器中均是独一的。 但是,它在跨越40亿时将溢出, OID尔后会呈现反复。PostgreSQL 在它的内部系统内外使用 OID 在表之间成立联络。
在用户的数据表中,最好是使用SERIAl来取代OID 因为SERIAL只要保证在单个表中的数值是唯一的就能够了,这样它溢出的可能性就非常小了, SERIAL8可用来生存8字节的序列数值。
CTID 用于标识带着数据块(地点)和(块内)偏偏移的特定的物理行。 CTID 在记录被更改或重载后发生改变。索引数据使用它们指向物理行。
4.13) 为甚么我收到毛病信息“ERROR: Memory exhausted in AllocSetAlloc()”?
这极可能是系统的假造内存用光了,大概内查对某些资本有较低的限制值。在启动 postmaster 之前尝尝下面的命令:
ulimit -d 262144
limit datasize 256m
取决于你用的 shell,上面命令只有一条能胜利,但是它将把你的进程数据段限制设得比较高, 因而或许能让查询完成。这条命令运用于当进步程,以及所有在这条命令运行后创建的子进程。 如果你是在运行SQL客户端时因为后台返回了太多的数据而出现问题,请在运行客户端之前执行上述命令。
4.14) 我如何才能知道所运行的PostgreSQL的版本?
从 psql 里,输入 SELECT version();指令。
4.15) 我如何创建一个缺省值是当前时间的字段?
使用 CURRENT_TIMESTAMP:
CREATE TABLE test (x int, modtime TIMESTAMP DEFAULT CURRENT_TIMESTAMP );4.16) 我怎样进行 outer join (外连接)?
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)。
4.17) 如何使用涉及多个数据库的查询?
不法子查询当前数据库以外的数据库。 由于PostgreSQL要减载与数据库相干的系统目次(系统表),因而跨数据库的查询如何履行是不定的。
附加增值模块contrib/dblink允许采用函数调用实现跨库查询。当然用户也可以同时连接到不同的数据库执行查询然后在客户端归并后果。
4.18) 如何让函数返回多行或多列数据?
在函数中返回数据记录集的功能是很简单使用的,详情参见: Functions
4.19) 为什么我在使用PL/PgSQL函数存取暂且表时会收到错误信息“relation with OID ##### does not exist”?
PL/PgSQL会缓存函数的剧本内容,由此带来的一个欠好的副感化是若一个 PL/PgSQL 函数拜候了一个且则表,然后该表被删除并重建了,则再次挪用该函数将失利, 因为缓存的函数内容仍旧指向旧的姑且表。解决的方法是在 PL/PgSQL 顶用EXECUTE 对且自表进行访问。这样会保证查询在执行前总会被从头剖析。
4.20) 今朝有哪些数据复制方案可用?
“复制”只是一个术语,有好几种复制技术可用,每种都有优点和瑕玷:
主/从复造方法是答应一个主办事器接管读/写的申请,而多个从服务器只能承受读/SELECT查询的申请, 今朝最风行且免费的主/从PostgreSQL复制计划是 Slony-I 。
多个主服务器的复制方式许可将读/写的申请发收给多台的计算机,这种方式由于需要在多台服务器之间同步数据变更 可能会带来较严峻的性能损得,Pgcluster是目前这种方案 中最好的,而且还可以避免费下载。
也有一些商业需付费和基于硬件的数据复制方案,支持上述各种复制模型。
4.21) 为何查询效果显示的表名或列名与我的查询语句中的不同?为何大写状况不能保存?
最多见的缘由是在创建表时对表名或是列名使用了双引号“”,当使用了双引号后,http://www.cnabk.com,表名或列名(称为标识符)存储时是辨别 大小写的, 这意谓着你在查询时表名或列名也应使用双引号,一些工具软件,像pgAdmin会在收回创建表的指令时自动地在每一个标识符上加双引号。 因此,为了标识符的同一,你应该:
在创建表时制止将标识符使用单引号引发来。
在标识符中只使用小写字母。
(为了与已存在的标识符沟通)在查询中使用双引号将标识符惹起来。