PostgreSQL读作Post-Gres-Q-L,有时候也简称为Postgres。
PostgreSQL是面向目标的关系数据库系统,它具有传统商业数据库系统的所有功能,同时又含有将在下一代DBMS系统的使用的增强特性。PostgreSQL是自由免费的,并且所有源代码都可以获得。
(Permissiontouse,copy,modify,anddistributethissoftwareanditsdocumentationforanypurpose,withoutfee,andwithoutawrittenagreementisherebygranted,providedthattheabovecopyrightnoticeandthisparagraphandthefollowingtwoparagraphsappearinallcopies.)
在任何情况下,加州大学都不承担因使用此软件及其文档而导致的对任何当事人的直接的,间接的,特殊的,附加的或者相伴而生的损坏,包括利益损失的责任,即使加州大学已经建议了这些损失的可能性时也是如此。
(INNOEVENTSHALLTHEUNIVERSITYOFCALIFORNIABELIABLETOANYPARTYFORDIRECT,INDIRECT,SPECIAL,INCIDENTAL,ORCONSEQUENTIALDAMAGES,INCLUDINGLOSTPROFITS,ARISINGOUTOFTHEUSEOFTHISSOFTWAREANDITSDOCUMENTATION,EVENIFTHEUNIVERSITYOFCALIFORNIAHASBEENADVISEDOFTHEPOSSIBILITYOFSUCHDAMAGE.)
加州大学明确放弃任何保证,包括但不局限于某一特定用途的商业和利益的隐含保证。这里提供的这份软件是基于“当作是”的基础的,因而加州大学没有责任提供维护,支持,更新,增强或者修改的服务。
(THEUNIVERSITYOFCALIFORNIASPECIFICALLYDISCLAIMSANYWARRANTIES,INCLUDING,BUTNOTLIMITEDTO,THEIMPLIEDWARRANTIESOFMERCHANTABILITYANDFITNESSFORAPARTICULARPURPOSE.THESOFTWAREPROVIDEDHEREUNDERISONAN"ASIS"BASIS,ANDTHEUNIVERSITYOFCALIFORNIAHASNOOBLIGATIONSTOPROVIDEMAINTENANCE,SUPPORT,UPDATES,ENHANCEMENTS,ORMODIFICATIONS.)
一般说来,一个现代的UNIX兼容的平台都能运行PostgreSQL。在安装指南里列出了发布时经过明确测试的平台。
主要的IRC频道是在FreeNode(irc.freenode.net)的#postgresql,为了连上此频道,可以使用UNIX程序irc,其指令格式:irc-c'#postgresql'"$USER"irc.freenode.net,或者使用其他IRC客户端程序。在此网络中还存在一个PostgreSQL的西班牙频道(#postgersql-es)和法语频道(#postgresql-fr)。同样地,在EFNET上也有一个PostgreSQL的交流频道。
同样也可访问ftp站点ftp://ftp.PostgreSQL.org/pub/检查有无更新的PostgreSQL版本或补丁。
PostgreSQL最新的版本是版本8.0.2(译注:现最新版本为8.0.3)。
我们计划每年发布一个主要版本,每几个月发布一个小版本。
客户端的命令行程序psql有一些以/d开头的命令,可显示关于类型,操作符,函数,汇总等的信息,使用/可以显示所有可用的命令。
我们的web站点包含更多的文档。
评价软件有好几种方法:特性,性能,可靠性,支持和价格。
PostgreSQL(缺省情况)只安装有C和内嵌式C的接口,其他的接口都是独立的项目,能够分别下载,这些接口项目独立的好处是他们可以有各自的发布计划和各自独立的开发组。
对于复杂的任务,很多人采用Perl接口和CGI.pm或mod_perl。
在运行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将数据按照通用的格式输出,随后可以被重新加载并使用新的内部格式。
由于计算机硬件大多数是兼容的,人们总是倾向于相信所有计算机硬件质量也是相同的。事实上不是,ECCRAM(带奇偶校验的内存),SCSI(硬盘)和优质的主板比一些便宜货要更加可靠且具有更好的性能。PostgreSQL几乎可以运行在任何硬件上,但如果可靠性和性能对你的系统很重要,你就需要全面的研究一下你的硬件配置了。在我们的邮件列表上也有关于硬件配置和性价比的讨论。
如果你只是要提取几行数据,并且你在执行查询中知道确切的行数,你可以使用LIMIT功能。如果有一个索引与ORDERBY中的条件匹配,PostgreSQL可能就只处理要求的头几条记录,(否则将对整个查询进行处理直到生成需要的行)。如果在执行查询功能时不知道确切的记录数,可使用游标(cursor)和FETCH功能。
可使用以下方法提取一行随机记录的:
SELECTcols FROMtab ORDERBYrandom() LIMIT1;4.2)如何查看表、索引、数据库以及用户的定义?如何查看psql里用到的查询指令并显示它们?在psql中使用/dt命令来显示数据表的定义,要了解psql中的完整命令列表可使用/,另外,你也可以阅读psql的源代码文件pgsql/src/bin/psql/describe.c,它包括为生成psql反斜杠命令的输出的所有SQL命令。你还可以带-E选项启动psql,这样它将打印出执行你在psql中所给出的命令的内部实际使用的SQL查询。PostgreSQL也提供了一个兼容SQL的INFORMATIONSCHEMA接口,你可以从这里获取关于数据库的信息。
在系统中有一些以pg_打头的系统表也描述了表的定义。
使用psql-l指令可以列出所有的数据库。
也可以浏览一下pgsql/src/tutorial/syscat.source文件,它列举了很多可从数据库系统表中获取信息的SELECT语法。
在8.0版本里更改一个字段的数据类型很容易,可使用ALTERTABLEALTERCOLUMNTYPE。
在以前的版本中,可以这样做:
BEGIN;ALTERTABLEtabADDCOLUMNnew_colnew_data_type;UPDATEtabSETnew_col=CAST(old_colASnew_data_type);ALTERTABLEtabDROPCOLUMNold_col;COMMIT;你然后可以使用VACUUMFULLtab指令来使系统收回无效数据所占用的空间。
下面是一些限制:
当然,实际上没有真正的无限制,还是要受可用磁盘空间、可用内存/交换区的制约。事实上,当这些数值变得异常地大时,系统性能也会受很大影响。
表的最大尺寸32TB不需要操作系统对大文件的支持。大表用多个1GB的文件存储,因此文件系统尺寸的限制是不重要的。
如果缺省的块大小增长到32K,最大的表尺寸和最大列数还可以增加到四倍。
一个Postgres数据库(存储一个文本文件)所占用的空间最多可能需要相当于这个文本文件自身大小5倍的磁盘空间。
例如,假设有一个100,000行的文件,每行有一个整数和一个文本描述。假设文本串的平均长度为20字节。文本文件占用2.8MB。存放这些数据的PostgreSQL数据库文件大约是6.4MB:
32字节:每行的头(估计值)24字节:一个整数型字段和一个文本型字段+4字节:页面内指向元组的指针----------------------------------------60字节每行PostgreSQL数据页的大小是8192字节(8KB),则:8192字节每页-------------------=136行/数据页(向下取整)60字节每行100000数据行--------------------=735数据页(向上取整)128行每页735数据页*8192字节/页=6,021,120字节(6MB)索引不需要这么多的额外消耗,但也确实包括被索引的数据,因此它们也可能很大。
空值NULL存放在位图中,因此占用很少的空间。
并非每个查询都会自动使用索引。只有在表的大小超过一个最小值,并且查询只会选中表中较小比例的记录时才会采用索引。这是因为索引扫描引起的随即磁盘存取可能比直接地读取表(顺序扫描)更慢。
为了判断是否使用索引,PostgreSQL必须获得有关表的统计值。这些统计值可以使用VACUUMANALYZE,或ANALYZE获得。使用统计值,优化器知道表中有多少行,就能够更好地判断是否利用索引。统计值对确定优化的连接顺序和连接方法也很有用。在表的内容发生变化时,应定期进行统计值的更新收集。
索引通常不用于ORDERBY或执行连接。对一个大表的一次顺序扫描,再做一个显式的排序通常比索引扫描要快。
但是,在LIMIT和ORDERBY结合使用时经常会使用索引,因为这只会返回表的一小部分。实际上,虽然MAX()和MIN()并不使用索引,通过对ORDERBY和LLIMIT使用索引取得最大值和最小值也是可以的:
SELECTcol FROMtab ORDERBYcol[DESC] LIMIT1;如果你确信PostgreSQL的优化器使用顺序扫描是不正确的,你可以使用SETenable_seqscanTO'off'指令,然后再次运行查询,你就可以看出使用一个索引扫描是否确实要快一些。
当使用通配符操作,例如LIKE或~时,索引只能在特定的情况下使用:
在8.0之前的版本中,除非要查询的数据类型和索引的数据类型相匹配,否则索引经常是未被用到,特别是对int2,int8和数值型的索引。
参考EXPLAIN手册页。
操作符~处理正则表达式匹配,而~*处理大小写无关的正则表达式匹配。大写些无关的LIKE变种成为ILIKE。
大小写无关的等式比较通常写做:
SELECT*FROMtabWHERElower(col)='abc';这样将不会使用标准的索引。但是可以创建一个可被利用的函数索引:
CREATEINDEXtabindexONtab(lower(col));4.9)在一个查询里,我怎样检测一个字段是否为NULL?我如何才能准确排序而不论某字段是否含NULL值?用ISNULL和ISNOTNULL测试这个字段,具体方法如下:
SELECT*FROMtabWHEREcolISNULL;为了能对含NULL字段排序,可在ORDERBY条件中使用ISNULL和ISNOTNULL修饰符,条件为真true将比条件为假false排在前面,下面的例子就会将含NULL的记录排在结果的上面部分:
SELECT*FROMtabORDERBY(colISNOTNULL)4.10)各种字符类型之间有什么不同?类型内部名称说明VARCHAR(n)varchar指定了最大长度,变长字符串,不足定义长度的部分不补齐CHAR(n)bpchar定长字符串,实际数据不足定义长度时,以空格补齐TEXTtext没有特别的上限限制(仅受行的最大长度限制)BYTEAbytea变长字节序列(使用NULL也是允许的)"char"char一个字符在系统表和在一些错误信息里你将看到内部名称。
VARCHAR(n)在存储限制了最大长度的变长字符串是最好的。TEXT适用于存储最大可达1G左右但未定义限制长度的字符串。
CHAR(n)最适合于存储长度相同的字符串。CHAR(n)会根据所给定的字段长度以空格补足(不足的字段内容),而VARCHAR(n)只存储所给定的数据内容。BYTEA用于存储二进制数据,尤其是包含NULL字节的值。这些类型具有相似的性能特性。
PostgreSQL支持SERIAL数据类型。它在字段上自动创建一个序列和索引。例如:
CREATETABLEperson( idSERIAL, nameTEXT );会自动转换为:
CREATESEQUENCEperson_id_seq; CREATETABLEperson( idINT4NOTNULLDEFAULTnextval('person_id_seq'), nameTEXT );参考create_sequence手册页获取关于序列的更多信息。
new_id=execute("SELECTnextval('person_id_seq')"); execute("INSERTINTOperson(id,name)VALUES(new_id,'BlaisePascal')");这样还能在其他查询中使用存放在new_id里的新值(例如,作为person表的外键)。注意自动创建的SEQUENCE对象的名称将会是