国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > PostgreSQL > 正文

PostgreSQL 常見問題(FAQ)

2019-09-08 23:32:57
字體:
供稿:網(wǎng)友
最近更新:2000 年 三月二十一日 星期二 16:09:11 EST

目前維護(hù)人員:Bruce Momjian (pgman@candle.pha.pa.us)
中文版維護(hù)人員:何偉平 (laser@zhengmai.com.cn)


本文檔的最新版本可以在 postgreSQL Web 站點(diǎn)上看到,http://www.PostgreSQL.org。

Linux 相關(guān)的問題在 http://www.PostgreSQL.org/docs/faq-linux.html 里回答。

Irix 相關(guān)的問題在 http://www.PostgreSQL.org/docs/faq-irix.html 里回答。

HPUX 相關(guān)的問題在 http://www.PostgreSQL.org/docs/faq-hpux.shtml 里回答。


--------------------------------------------------------------------------------

常見問題
1.1) PostgreSQL 是什么?
1.2) PostgreSQL 的版權(quán)是什么?
1.3) PostgreSQL 運(yùn)行在什么 Unix 平臺(tái)上?
1.4) 可用的非unix平臺(tái)有那些?
1.5) 我在那里能得到 PostgreSQL?
1.6) 我從那里能得到對(duì) PostgreSQL 的支持?
1.7) PostgreSQL 最新的版本是什么?
1.8) 可獲得的 PostgreSQL 的文檔有那些?
1.9) 我如何了解已知的臭蟲或缺失的特性?
1.10) 我應(yīng)該怎樣學(xué)習(xí) SQL ?
1.11) PostgreSQL 是 Y2K 兼容的嗎?
1.12) 我應(yīng)該怎樣加入開發(fā)隊(duì)伍?
1.13) 我應(yīng)該怎樣提交一個(gè)臭蟲報(bào)告?
1.14) PostgreSQL 和其他 DBMS 比起來如何?


用戶客戶端問題
2.1) 有 PostgreSQL 的 ODBC 驅(qū)動(dòng)程序么?
2.2) 有什么工具可以把 PostgreSQL 用于 Web 頁面?
2.3) PostgreSQL 擁有圖形用戶界面嗎?有報(bào)表生成器嗎?有嵌入的查詢語言接口嗎?
2.4) 我們可以用什么語言和 PostgreSQL 打交道?


管理員問題
3.1) 為什么 initdb 會(huì)失敗?
3.2) 我怎樣能把 PostgreSQL 裝在 /usr/local/pgsql 以外的地方?
3.3) 當(dāng)我運(yùn)行 postmaster 時(shí),我收到Bad System Call(系統(tǒng)調(diào)用錯(cuò))或者內(nèi)核傾倒消息。為什么?
3.4) 當(dāng)我試圖運(yùn)行 postmaster 時(shí),我收到 IpcMemoryCreate errors3 消息。為什么?
3.5) 當(dāng)我試圖運(yùn)行 postmaster 時(shí),我收到 IpcSemaphoreCreate 錯(cuò)誤。為什么?
3.6) 我如何禁止其他主機(jī)訪問我的 PostgreSQL 數(shù)據(jù)庫
3.7) 為什么我無法從其他機(jī)器上聯(lián)接到我的數(shù)據(jù)庫來?
3.8) 為什么我不能以 root 用戶身份訪問數(shù)據(jù)庫?
3.9) 為什么在并行訪問表時(shí),我的所有(數(shù)據(jù)庫)服務(wù)器都崩潰了?
3.10) 我怎樣調(diào)節(jié)數(shù)據(jù)庫引擎以獲得更好的性能?
3.11) PostgreSQL 里可以獲得什么樣的調(diào)試特性?
3.12) 當(dāng)我試圖聯(lián)接時(shí)收到'Sorry, too many clients' 消息。這是為什么?
3.13) 我的數(shù)據(jù)庫目錄里面的 pg_psort.XXX 文件是什么?
3.14) 我如何設(shè)置一個(gè) pg_group?


操作問題
4.1) 系統(tǒng)看起來被逗號(hào),小數(shù)點(diǎn)和日期格式弄糊涂了。
4.2) 二進(jìn)制游標(biāo)和普通游標(biāo)之間準(zhǔn)確的區(qū)別是什么?
4.3) 我如何只 select (選取)一個(gè)查詢的頭幾行?
4.4) 我如何獲取一個(gè)表的列表,或者是其他我能在 psql 里看到的東西?
4.5) 你怎樣從一個(gè)表里面刪除一個(gè)列?
4.6) 一行,一個(gè)表,一個(gè)庫的最大尺寸是多少?
4.7) 存儲(chǔ)一個(gè)典型的平面文件里的數(shù)據(jù)需要多少磁盤空間?
4.8) 我如何查看一個(gè)數(shù)據(jù)庫里面定義了那些索引或者操作?
4.9) 我的查詢很慢或者沒有利用索引。為什么?
4.10) 我如何才能看到查詢優(yōu)化器是怎樣計(jì)算我的查詢的?
4.11) R-tree 索引是什么?
4.12) 什么是基因查詢優(yōu)化(Genetic Query Optimization)?
4.13) 我怎樣做規(guī)則表達(dá)式搜索和大小寫無關(guān)搜索?
4.14) 在一個(gè)查詢里,我怎樣檢測一個(gè)字段是否為 NULL?
4.15) 各種字符類型之間有什么不同?
4.16.1) 我怎樣創(chuàng)建一個(gè)序列號(hào)/自動(dòng)遞增的字段?
4.16.2) 我如何獲得一個(gè)插入的序列號(hào)的值?
4.16.3) 使用 currval() 和 nextval() 會(huì)導(dǎo)致一個(gè)與其他并行后端進(jìn)程之間的一個(gè)競爭條件嗎?
4.17) 什么是 oid?什么是 tid?
4.18) 里 PostgreSQL 使用的一些術(shù)語的含義是什么?
4.19) 為什么我收到錯(cuò)誤 "FATAL: palloc failure: memory exhausted?"
4.20) 我如何才能知道我運(yùn)行的 PostgreSQL 的版本?
4.21) 為什么我的大對(duì)象操作收到invalid large obj descriptor(非法大對(duì)象描述符)。?
4.22) 我如何創(chuàng)建一個(gè)缺省值是當(dāng)前時(shí)間的字段?
4.23) 為什么我的使用 IN 的子查詢這么慢?


擴(kuò)展 PostgreSQL
5.1) 我寫了一個(gè)用戶定義函數(shù)。當(dāng)我在psql 里運(yùn)行它時(shí),為什么會(huì)導(dǎo)致內(nèi)核傾倒?
5.2) 消息:NOTICE:PortalHeapMemoryFree: 0x402251d0 not in alloc set! 是什么意思?
5.3) 我如何能給 PostgreSQL 貢獻(xiàn)一些挺不錯(cuò)的新類型和函數(shù)?
5.4) 我怎樣寫一個(gè)返回一條記錄的 C 函數(shù)?
5.5) 我修改了源代碼。為什么重新編譯后沒有看到改變?



--------------------------------------------------------------------------------

常見問題
1.1) PostgreSQL是什么?
PostgreSQL 是一個(gè) POSTGRES 數(shù)據(jù)庫管理系統(tǒng)的增強(qiáng)版,是一個(gè)下一代 DBMS 的研究原型。PostgreSQL 在保持 POSTGRES 的強(qiáng)大的數(shù)據(jù)模型和豐富的數(shù)據(jù)類型的基礎(chǔ)上,用一個(gè)擴(kuò)展了的 SQL 的子集取代了原先的 PostQuel 查詢語言。PostgreSQL 是自由的并且所有源代碼都可以獲得。

PostgreSQL 的開發(fā)是由一個(gè)互聯(lián)網(wǎng)相聯(lián)的開發(fā)人員隊(duì)伍進(jìn)行的,他們都參加 PostgreSQL 開發(fā)郵件列表。目前的協(xié)調(diào)人是 Marc G. Fournier (scrappy@postgreSQL.org)。(如何加入?yún)㈤喯挛模_@個(gè)隊(duì)伍現(xiàn)在負(fù)責(zé) PostgreSQL 所有目前的和未來的開發(fā)。

PostgreSQL 1.01 的作者是 Andrew Yu 和 Jolly Chen。還有許多其他人為移植,測試,調(diào)試和增強(qiáng)代碼做了大量貢獻(xiàn)。PostgreSQL 起源的最初的 Postgres 的代碼,是在加州大學(xué)伯克利分校的 Michael Stonebraker 教授的指導(dǎo)下,由許多研究生,本科生和編程職員完成的。

這個(gè)軟件最初在伯克利的名字是 Postgres。在 1995 年,當(dāng)增加了 SQL 功能后,它的名字改成 Postgres95。在 1996年末,這個(gè)名字改為 PostgreSQL。

1.2) PostgreSQL 的版權(quán)是什么?
PostgreSQL 受下面的版權(quán)約束。

PostgreSQL 數(shù)據(jù)庫管理系統(tǒng)

(PostgreSQL Data Base Management System)

部分版權(quán)(c)1996-2000,PostgreSQL,Inc 部分版權(quán)(c)1994-6 加州大學(xué)董事

(Portions copyright (c) 1996-2000, PostgreSQL, Inc Portions Copyright (c) 1994-6 Regents of the University of California)

允許為任何目的使用,拷貝,修改和分發(fā)這個(gè)軟件和它的文檔而不收取任何費(fèi)用,并且無須簽署因此而產(chǎn)生的證明,前提是上面的版權(quán)聲明和本段以及下面兩段出現(xiàn)在所有拷貝中。

(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.)

在任何情況下,加州大學(xué)都不承擔(dān)因使用此軟件及其文檔而導(dǎo)致的對(duì)任何當(dāng)事人的直接的,間接的,特殊的,附加的或者相伴而生的損壞,包括利益損失的責(zé)任,即使加州大學(xué)已經(jīng)建議了這些損失的可能性時(shí)也是如此。

(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.)

加州大學(xué)明確放棄任何保證,包括但不局限于某一特定用途的商業(yè)和利益的隱含保證。這里提供的這份軟件是基于“當(dāng)作是”的基礎(chǔ)的,因而加州大學(xué)沒有責(zé)任提供維護(hù),支持,更新,增強(qiáng)或者修改的服務(wù)。

(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.3) PostgreSQL 運(yùn)行在什么平臺(tái)上?
作者們?cè)谙旅孢@些平臺(tái)上編譯和測試了 PostgreSQL (其中有些平臺(tái)的編譯要求使用 gcc):

aix - IBM AIX 3.2.5 或 4.x 
alpha - Digital Unix 2.0, 3.2, 4.0 上的 DEC Alpha AXP 
BSD44_derived - 從4.4-lite BSD 發(fā)展來的 OS (NetBSD,F(xiàn)reeBSD) 
bsdi - BSD/OS 2.x, 3.x, 4.x 
dgux - DG/UX 5.4R4.11 
hpux - HP PA-RISC 上的 HP-UX 9.*, 10.* 
i386_solaris - i386 Solaris 
irix5 - SGI MIPS 上的 IRIX 5.3 
linux - Intel i86 Alpha SPARC PPC M68k 
sco - SCO 3.2v5 Unixware 
sparc_solaris - SUN SPARC 上的 Solaris 2.4, 2.5, 2.5.1 
sunos4 - SUN SPARC 上的 SunOS 4.1.3 
svr4 - Intel x86 上的 Intel SVR4 and MIPS 
ultrix4 - DEC MIPS 上的 Ultrix 4.4 
1.4) 可用的非 unix 平臺(tái)有那些?
把 libpq C 庫,psql,和其他接口和二進(jìn)制編譯成可以在 MS Windows 平臺(tái)上運(yùn)行是可能的。這種情況下,客戶端在 MS Windows 上運(yùn)行,并且通過 TCP/IP 與一個(gè)運(yùn)行在我們支持的 Unix 平臺(tái)上的服務(wù)器進(jìn)行通訊。

在發(fā)布包里面有一個(gè) win31.mak 文件用于制作 Win32 的 libpq 庫和 psql。

數(shù)據(jù)庫服務(wù)器現(xiàn)在可以通過使用 Cygnus Unix/NT 移植庫在 Windows NT 上面運(yùn)行。參閱發(fā)布包里的 pgsql/doc/README.NT 文件。

還有一個(gè) web 頁在 http://www.freebsd.org/~kevlo/postgres/portNT.html。另外還有一個(gè)使用 U/Win 的移植在 http://surya.wipro.com/uwin/ported.html. 

1.5) 我在那里可以得到 PostgreSQL?
PostgreSQL 的主匿名 ftp 站在 ftp://ftp.postgreSQL.org/pub 

鏡像站可以參考我們網(wǎng)站的主頁。

1.6) 我從那里能得到對(duì) PostgreSQL 的支持?
加州大學(xué)伯克利分校不對(duì) PostgreSQL 提供任何官方支持。它是通過志愿者的行動(dòng)維護(hù)的。

主要的郵件列表是:pgsql-general@postgreSQL.org。可以在那里討論有關(guān) PostgreSQL 的問題。要加入列表,發(fā)一封郵件內(nèi)容(不是主題行)為

subscribe
end

的郵件到 pgsql-general-request@postgreSQL.org。

還可以獲取摘要列表。要加入這個(gè)列表,發(fā)郵件到:pgsql-general-digest-request@postgreSQL.org,其內(nèi)容為:

subscribe
end

每當(dāng)主列表達(dá)到大約 30k 的消息內(nèi)容時(shí),摘要就發(fā)送給這個(gè)列表的成員。

還可以參加臭蟲郵件列表。要加入這個(gè)列表,發(fā)送一個(gè)郵件到 bugs-request@postgreSQL.org,內(nèi)容為:

subscribe
end

還可以參加開發(fā)人員郵件列表。要加入這個(gè)列表,發(fā)送一個(gè)郵件到 hackers-request@postgreSQL.org,內(nèi)容為:

subscribe
end

其他的關(guān)于 PostgreSQL 郵件列表和其他信息可以在 PostgreSQL 的 WWW 主頁找到:

http://postgreSQL.org 

在 EFNet 里還有一個(gè) IRC 頻道,頻道 #PostgreSQL。我用 unix 命令irc -c '#PostgreSQL' "$USER" irc.phoenix.net

PostgreSQL 的商業(yè)支持可以在 http://www.pgsql.com/ 獲得。

1.7) PostgreSQL 最新的版本是什么?
PostgreSQL 最新的版本是版本 7.0。

我們計(jì)劃每四個(gè)月發(fā)布一個(gè)主要版本。

1.8) 可獲得的 PostgreSQL 文檔有那些?
在發(fā)布包里有一些手冊(cè),手冊(cè)頁和一些小的測試?yán)印⒁姟?doc 目錄。(譯注:應(yīng)為 $PGHOME/doc)。你還可以在線瀏覽PostgreSQL 的手冊(cè),在 http://www.postgresql.org/docs/postgres.。

psql 有一些很好的 /d 命令,顯示關(guān)于類型,操作符,函數(shù),聚集等的信息。

web 站包含更多的文檔。

1.9) 我如何了解已知的臭蟲和缺失的特性?
PostgreSQL 支持一個(gè)擴(kuò)展了的 SQL-92 的子集。參閱我們的 TODO,獲取一個(gè)已知臭蟲,缺失特性和未來計(jì)劃的列表。

1.10) 我應(yīng)該怎樣學(xué)習(xí) SQL?
在 http://w3.one.net/~jhoffman/sqltut.htm 和 http://ourworld.compuserve.com/homepages/Graeme_Birchall/HTM_COOK.HTM. 有一個(gè)很好的教程。

另一個(gè)是 "Teach Yourself SQL in 21 Days, Second Edition"(21天學(xué)會(huì)SQL,第二版),在 http://members.tripod.com/er4ebus/sql/index.htm 

我們的許多用戶喜歡 The Practical SQL Handbook, Bowman et al., Addison Wesley. 其他的有 Lan Times Guide to SQL, Groff et al., Osborne McGraw-Hill.

1.11) PostgreSQL 是 Y2K 兼容的嗎?
是,我們很容易控制 2000AD 之后和 2000BC 之前的日期。

1.12) 我應(yīng)該怎樣加入開發(fā)隊(duì)伍?
首先,下載最新的源代碼和閱讀我們 web 站上的 PostgreSQL 開發(fā)者文檔。第二,加入 pgsql-hackers 和 pgsql-patches 郵件列表。第三,向 pgsql-patches 提交高質(zhì)量的補(bǔ)丁程序。

現(xiàn)在大概有十幾個(gè)人有 PostgreSQL CVS 歸檔 COMMIT 的權(quán)限。他們都已經(jīng)提交了非常多高質(zhì)量的補(bǔ)丁了,以至于現(xiàn)有的提交人很難跟上節(jié)奏,并且我們相信他們提交的補(bǔ)丁都是高質(zhì)量的。

1.13) 我怎樣提交一個(gè)臭蟲報(bào)告?
填充"bug-template"(臭蟲模板)文件然后發(fā)送到:bugs@postgreSQL.org

同樣也要看看我們的 ftp 站點(diǎn) ftp://ftp.postgreSQL.org/pub,看有沒有更新的 PostgreSQL 版本或補(bǔ)丁。

1.14) PostgreSQL 和其他 DBMS 比起來如何?
評(píng)價(jià)軟件有好幾種方法:特性,性能,可靠性和價(jià)格。

特性 
PostgreSQL 擁有大型商用 DBMS 里大多數(shù)特性,例如:事務(wù),子查詢,觸發(fā)器,視圖和復(fù)雜的鎖定等。我們還有一些它們沒有的特性,如用戶定義類型,繼承,規(guī)則和多版本并行控制以減少鎖的爭用等。我們還沒有外鍵參考完整或外部聯(lián)合(foreign key referential integrity or outer joins),不過正在準(zhǔn)備在下一個(gè)版本增加這些特性。


性能 
PostgreSQL 在兩種模式下運(yùn)行。通常的 fsync (同步)模式把每個(gè)完成的事務(wù)都沖洗到磁盤上,以保證如果 OS 崩潰了或者在下幾秒鐘出現(xiàn)掉電的情況下,你的所有數(shù)據(jù)都安全地存放在磁盤上。這種模式下,我們比大多數(shù)商用數(shù)據(jù)庫都慢,部分原因是因?yàn)槟切?shù)據(jù)庫缺省狀態(tài)下很少這樣保守地向磁盤沖洗數(shù)據(jù)。在 no-fsync (非同步)模式下,我們一般都比商用數(shù)據(jù)庫快,盡管在這種模式下,一個(gè) OS 的崩潰將導(dǎo)致數(shù)據(jù)損壞。我們正在建設(shè)一種中間模式,這種模式比完全同步(fsync)模式的性能損失小,而且將保證在OS 崩潰情況下的 30 秒內(nèi)的數(shù)據(jù)完整。這種模式可以由數(shù)據(jù)庫管理員選擇。

與 MySQL 或更輕便的數(shù)據(jù)庫系統(tǒng)比較,我們?cè)凇nsert/update 時(shí)慢,因?yàn)槲覀冇蓄~外的事務(wù)處理。當(dāng)然 MySQL 不具有我們?cè)谏厦娴奶匦远卫锝o出的任何特性。我們的主要方向是靈活性和特性,盡管我們通過優(yōu)化和源碼分析不斷地改進(jìn)性能。

我們通過創(chuàng)建一個(gè) Unix 進(jìn)程處理每個(gè)用戶的聯(lián)接。后端進(jìn)程共享數(shù)據(jù)緩沖區(qū)和鎖信息。在多 CPU 的條件下,多個(gè)后端很容易運(yùn)行在不同的 CPU 上。


可靠性 
我們知道 DBMS 必須是可靠的,否則它就一點(diǎn)用都沒有。我們努力做到發(fā)布經(jīng)過認(rèn)真測試的,穩(wěn)定的臭蟲最少的代碼。每個(gè)版本至少有一個(gè)月的 beta 測試,并且我們的發(fā)布?xì)v史顯示我們可以提供穩(wěn)定的,牢固的,可用于生產(chǎn)使用的版本。我們相信在這方面我們與其他的數(shù)據(jù)庫軟件是相當(dāng)?shù)摹?


支持 
我們的郵件列表提供一個(gè)非常大的開發(fā)人員和用戶的組以幫助解決所碰到的任何問題。我們不能保證肯定能解決問題,相比之下,商用 DBMS 也并不是總能夠提供解決方法。直接與開發(fā)人員,用戶群,手冊(cè)和源程序接觸令 PostgreSQL 的支持比其他 DBMS 還要好。還有一些商業(yè)性的預(yù)包裝的支持,可以給提供給那些需要的人。(參閱支持 FAQ 條款。)


價(jià)格 
我們對(duì)任何用途都免費(fèi),包括商用和非商用目的。你可以不加限制地向你的產(chǎn)品里加入我們的代碼,除了那些我們?cè)谏厦娴陌鏅?quán)聲明里聲明的 BSD 風(fēng)格的版權(quán)外。



--------------------------------------------------------------------------------

用戶客戶問題
2.1) 有 PostgreSQL 的 ODBC 驅(qū)動(dòng)么?
有兩個(gè) ODBC 驅(qū)動(dòng)可以獲得,PostODBC 和 OpenLink ODBC.

在發(fā)布版本里面包含。關(guān)于它的更多信息可以從:http://www.insightdist.com/psqlodbc 獲得。

OpenLink ODBC 可以從 http://www.openlinksw.com 獲得。它與他們的標(biāo)準(zhǔn) ODBC 客戶端軟件兼容,因而你可以在任何他們支持的客戶端平臺(tái)(Win, Mac, Unix, VMS)上使用 PostgreSQL ODBC。

他們可能將這個(gè)產(chǎn)品銷售給那些需要商業(yè)支持的用戶,但是總是有一個(gè) freeware (自由軟件)的版本可以得到。請(qǐng)?jiān)儐枴ostgres95@openlink.co.uk。

2.2) 有什么工具可以把 PostgreSQL 用于 Web 頁面?
一個(gè)介紹以數(shù)據(jù)庫為后臺(tái)的 Web 頁面在:http://www.webtools.com。

還有一個(gè)在:http://www.phone.net/home/mwm/hotlist/。

對(duì)于 web 集成,PHP 是一個(gè)極好的接口。它在:http://www.php.net

PHP 很適合用于簡單任務(wù),但對(duì)于更復(fù)雜的任務(wù),可以使用 perl 接口和 CGI.pm。

一個(gè)以 WDB 為基礎(chǔ),使用 perl 的 WWW 網(wǎng)關(guān)可以從 http://www.eol.ists.ca/~dunlop/wdb-p95 下載。

2.3) PostgreSQL 擁有圖形用戶界面嗎?有報(bào)表生成器嗎?有嵌入的查詢語言接口嗎?
我們有一個(gè)叫 pgaccess 的很好的圖形用戶接口,它是做為發(fā)布版本的一部分發(fā)布的。Pgaccess 還有一個(gè)報(bào)表生成器。它的網(wǎng)頁在 http://www.flex.ro/pgaccess

我們還有 ecpg,它是一個(gè)用于 C 的嵌入的 SQL 查詢語言接口。

2.4) 我們可以用什么語言和 PostgreSQL 打交道?
我們有:

C(libpq) 
C++(libpq++) 
Embedded C(ecpg) 
Java(jdbc) 
Perl(perl5) 
ODBC(odbc) 
Python(PyGreSQL) 
TCL(libpgtcl) 
C 簡易 API(libpgeasy) 
嵌入的 HTML(PHP,來自 http://www.php.net) 

--------------------------------------------------------------------------------

管理員問題
3.1) 為什么 initdb 會(huì)失敗?
檢查一下,確保你的路徑里沒有任何以前版本的二進(jìn)制文件(如果你看到消息 WARN:heap_modifytuple: repl is / 9,那么就是這個(gè)問題。) 
檢查一下,看看你有沒有正確設(shè)置路徑。 
檢查一下,看看 postgres 用戶是否擁有正確的文件 
3.2) 我怎樣能把 PostgreSQL 裝在 /usr/local/pgsql 以外的地方?
最簡單的方法是在運(yùn)行 configure 的時(shí)候聲明 --prefix 選項(xiàng)。如果你忘記這么做了,你可以編輯 Makefile.global 并相應(yīng)地修改 POSTGRESDIR,或者創(chuàng)建一個(gè) Makefile.custom 并且在那里定義 POSTGRESDIR。

3.3) 當(dāng)我運(yùn)行 postmaster 時(shí),我收到Bad System Call (系統(tǒng)調(diào)用錯(cuò))或內(nèi)核傾倒。為什么?
這可能是很多方面的問題,但首先應(yīng)該檢查你在內(nèi)核里配置安裝了 system V (系統(tǒng) V)擴(kuò)展。PostgreSQL 需要內(nèi)核支持共享內(nèi)存和信號(hào)燈。

3.4) 當(dāng)我試圖運(yùn)行 postmaster 時(shí),我收到 IpcMemoryCreate 錯(cuò)誤。為什么?
你要么是沒有在內(nèi)核里正確配置共享內(nèi)存,要么是你需要擴(kuò)大你的內(nèi)核的可用共享內(nèi)存。你需要的共享內(nèi)存具體的數(shù)量取決于你的體系結(jié)構(gòu)和你配置你的 postmaster 運(yùn)行時(shí)使用的緩沖區(qū)和后端進(jìn)程數(shù)目。對(duì)大多數(shù)系統(tǒng),使用缺省緩沖區(qū)和進(jìn)程數(shù)目時(shí),你最少需要~1MB。

3.5) 當(dāng)我試圖運(yùn)行 postmaster 時(shí),我收到 IpcSemaphoreCreate 錯(cuò)誤。為什么?
如果錯(cuò)誤信息是 IpcSemaphoreCreate: semget failed (No space left on device),那么原因是你的內(nèi)核沒有配置足夠的信號(hào)燈資源。Postgres 的每個(gè)潛在的后端進(jìn)程都需要一些信號(hào)燈。一個(gè)臨時(shí)的解決方法是以比較少的后端數(shù)量(參數(shù))啟動(dòng) postmaster。使用開關(guān) -N 帶一個(gè)少于缺省值 32 的參數(shù)運(yùn)行 postmaster。更長久的解決方法是加大你的內(nèi)核的 SEMMNS 和 SEMMNI 參數(shù)。

如果錯(cuò)誤信息是其他的什么東西,你可能就根本沒有在內(nèi)核里面配置信號(hào)燈支持。

3.6) 我如何禁止其他主機(jī)訪問我的 PostgreSQL 數(shù)據(jù)庫?
缺省時(shí),PostgreSQL 只允許通過 unix 域套接字來自本機(jī)的聯(lián)接。除非你使用 -i 開關(guān)啟動(dòng) postmaster,并且通過對(duì)應(yīng)的編輯 $PGDATA/pg_hba.conf 文件打開了主機(jī)為基礎(chǔ)( host-based )的認(rèn)證,否則其他機(jī)器是不能與你的機(jī)器聯(lián)接的。這樣將允許 TCP/IP 聯(lián)接。

3.7) 為什么我無法從其他機(jī)器上聯(lián)接到我的數(shù)據(jù)庫來?
缺省的配置只允許從本地利用 unix 域套接字與數(shù)據(jù)庫聯(lián)接。要打開 TCP/IP 聯(lián)接,確信你是帶著 -i 開關(guān)運(yùn)行 postmaster 的,并且相應(yīng)的向文件 pgsql/data/pg_hba.conf 里增加了一些恰當(dāng)?shù)闹鳈C(jī)記錄。參考 pg_hba.conf 手冊(cè)頁。

3.8) 為什么我不能以 root 用戶身份訪問數(shù)據(jù)庫?
你不應(yīng)以用戶標(biāo)識(shí)(user id)0 (root)創(chuàng)建數(shù)據(jù)庫。他們將不能訪問數(shù)據(jù)庫。這是一種安全預(yù)防措施,以避免任何用戶都能動(dòng)態(tài)地把對(duì)象模塊與數(shù)據(jù)庫進(jìn)行引擎鏈接。

3.9) 為什么在并行訪問表時(shí),我的所有(數(shù)據(jù)庫)服務(wù)器都崩潰了?
這個(gè)問題可能是因?yàn)閮?nèi)核沒有配置成支持信號(hào)燈引起的。

3.10) 我怎樣調(diào)節(jié)數(shù)據(jù)庫引擎以獲得更好的性能?
當(dāng)然,索引可以加速查詢。EXPLAIN 命令允許你觀察 PostgreSQL 如何解釋你的查詢,以及使用了哪個(gè)索引。

如果你正處理一堆 INSERT,考慮使用 COPY 命令以大批量的方式進(jìn)行。這樣做比單獨(dú)一個(gè) INSERTS 快得多。第二,沒有處于 BEGIN WORK/COMMIT 事務(wù)塊之間的語句被認(rèn)為處于它們自身的事務(wù)里面。試著在一個(gè)事務(wù)塊里面處理更多的語句。這樣可以減少事務(wù)帶來的過荷。同樣,在做大量的數(shù)據(jù)改變時(shí)考慮刪除和重建索引。

還有幾件調(diào)節(jié)的方法可以使用。你可以通過帶 -o -F 選項(xiàng)運(yùn)行 postmaster 關(guān)閉 fsync()。這樣將避免每次事務(wù)后調(diào)用 fsync() 把數(shù)據(jù)沖刷到磁盤上。

你還可以使用 postmaster -B 選項(xiàng)增加后端進(jìn)程使用的共享內(nèi)存緩沖的數(shù)目。如果你把這個(gè)參數(shù)設(shè)置得太高,postmaster 可能無法啟動(dòng),因?yàn)槟阋呀?jīng)超過了你的內(nèi)核在共享內(nèi)存空間上的限制。每個(gè)緩沖區(qū)是 8K 并且缺省 64 個(gè)緩沖區(qū)。

你還可以使用后端的 -S 選項(xiàng)來增加每個(gè)后端用于臨時(shí)排序用的最大內(nèi)存數(shù)量。-S 值是以千字節(jié)計(jì)的,缺省是 512 (也就是說,512K)。把這個(gè)數(shù)目搞得太大也不是個(gè)好主意,因?yàn)槟憧赡茉谝粋€(gè)查詢激活多個(gè)并行排序時(shí)用光內(nèi)存。

你還可以使用 CLUSTER 命令來把一個(gè)基本表里的數(shù)據(jù)按照索引的匹配進(jìn)行分組。參閱 cluster(l) 的手冊(cè)頁獲取更多細(xì)節(jié)。

3.11) PostgreSQL 里可以獲得什么樣的調(diào)試特性?
PostgreSQL 有幾個(gè)特性用于報(bào)告狀態(tài)信息,這些信息可能對(duì)調(diào)試用途很有幫助。

首先,通過附帶 --enable-cassert 選項(xiàng)運(yùn)行 configure,有很多 assert() 監(jiān)控后端的過程和在發(fā)生某些未曾預(yù)料的現(xiàn)象時(shí)停止程序運(yùn)行。

postmaster 和 postgres 都有一些可用的選項(xiàng)。首先,當(dāng)你啟動(dòng) postmaster 時(shí),確保你把標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤定向到了一個(gè)日志文件里去了,象:

cd /usr/local/pgsql
./bin/postmaster >server.log 2>&1 &

這樣將在 PostgreSQL 頂級(jí)目錄下輸出一個(gè) server.log 文件。這個(gè)文件包含服務(wù)器碰到的問題和錯(cuò)誤的有用信息。postmaster 有一個(gè) -d 選項(xiàng),該選項(xiàng)允許我們獲得更多的細(xì)節(jié)匯報(bào)。-d 選項(xiàng)接受一個(gè)數(shù)字標(biāo)明調(diào)試級(jí)別。需要警告的是高的調(diào)試級(jí)別可能會(huì)生成巨大的日志文件。

你實(shí)際上可以直接在命令行上運(yùn)行 postgres 后端,然后直接鍵入你的 SQL 語句。我們只推薦在調(diào)試的時(shí)候這么干。請(qǐng)注意這時(shí)一個(gè)新行結(jié)束一個(gè)查詢,而不是一個(gè)分號(hào)。如果你帶著調(diào)試符號(hào)編譯,你可以使用一個(gè)調(diào)試器觀看發(fā)生了什么事情。因?yàn)楹蠖藳]有由 postmaster 啟動(dòng)的,它不是在一個(gè)典型的環(huán)境里運(yùn)行而且鎖定/后端交互問題可能不能復(fù)現(xiàn)。有些調(diào)試器可以附加到一個(gè)已運(yùn)行的后端上;那是在一個(gè)正常的多后端環(huán)境下診斷問題的最方便的方法。

postgres 程序有 -s,-A,和 -t 選項(xiàng)可能在調(diào)試和性能測量的時(shí)候非常有用。

你還可以帶構(gòu)形文件編譯后端,以便觀察什么函數(shù)占據(jù)著執(zhí)行時(shí)間。后端構(gòu)形文件將放在 pgsql/data/base/dbname 目錄下。客戶端構(gòu)形文件將放在客戶端當(dāng)前目錄下。

3.12) 當(dāng)我試圖聯(lián)接時(shí)收到'Sorry, too many clients' 消息。這是為什么?
你需要增大 postmaster 關(guān)于它可以啟動(dòng)的并發(fā)后端進(jìn)程數(shù)目的限制。

在 Postgres 6.5 及以上版本,缺省限制是 32 進(jìn)程。你可以通過帶著適當(dāng)?shù)摹?N 值開關(guān)啟動(dòng) postmaster 增加這個(gè)數(shù)目。缺省配置下你最大可以把 -N 設(shè)置為 1024;如果你需要更多后端進(jìn)程,增大 include/config.h 里的 MAXBACKENDS 值然后重新制作。如果你愿意,你可以在配置的時(shí)候設(shè)置 -N 的缺省值:使用 configure 的 --with-maxbackends 開關(guān)。

要注意如果你把 -N 設(shè)置為大于 32,你必須同樣增大 -B,超過它缺省的 64;-B 必須最少是 -N 的兩倍,而且為了更好的性能可能要比那個(gè)數(shù)字要大。對(duì)于大數(shù)目的后端進(jìn)程,你可能還會(huì)發(fā)現(xiàn)你還需要增加許多 Unix 內(nèi)核配置參數(shù)值。要檢查的東西包括共享內(nèi)存塊的最大尺寸,SHMMAX,信號(hào)燈的最大數(shù)目,SEMMNS 和 SEMMNI,最大的進(jìn)程數(shù),NPROC,單用戶最大進(jìn)程數(shù),MAXUPRC,以及打開文件的最大數(shù)目,NFILE 和 NINODE。Postgres 對(duì)允許的后端進(jìn)程數(shù)有限制的原因是為了確保你的系統(tǒng)不會(huì)用光資源。

在 Postgres 早于 6.5 的版本,最大后端數(shù)目缺省是 64,并且對(duì)它的修改首先需要修改 include/storage/sinvaladt.h 里的 MaxBackendId 常量,然后重新制作。

3.13) 我的數(shù)據(jù)庫目錄里面的 pg_tempNNN.NN 文件是什么?
這些是查詢執(zhí)行器生成的臨時(shí)文件。例如,如果需要為滿足 ORDER BY 條件做排序,并且排序需要比后端的 -S 參數(shù)給出的更多的空間,那么就會(huì)創(chuàng)建一個(gè)臨時(shí)文件保存多出來的數(shù)據(jù)。

臨時(shí)文件應(yīng)該自動(dòng)消失,不過如果在排序過程中后端崩潰了就可能不能自動(dòng)消失了。如果目前沒有什么事務(wù)在運(yùn)行,把 pg_tempNNN.NN 文件刪除是安全的。

3.14)我如何設(shè)置一個(gè) pg_group?
目前,我們建立一個(gè)用戶組還沒有簡單的接口。你不得不顯式的 insert/update pg_group 表。例如:

jolly=> insert into pg_group (groname, grosysid, grolist)
jolly=>     values ('posthackers', '1234', '{5443, 8261}');
INSERT 548224
jolly=> grant insert on foo to group posthackers;
CHANGE
jolly=>

pg_group 里的字段是:

groname:組名稱。這是一個(gè)名稱并且應(yīng)該完全由字母和數(shù)字組成。不要包含下劃線和其他標(biāo)點(diǎn)。 
grosysid:組 id,這是一個(gè) int4。應(yīng)該在所有組中唯一。 
grolist:屬于這個(gè)組的 pg_user id 的列表。這是一個(gè) int4[]。 

--------------------------------------------------------------------------------

操作問題
4.1) 系統(tǒng)看起來被逗號(hào),小數(shù)點(diǎn)和日期格式弄糊涂了。
檢查你的本地化(locale)配置。PostgreSQL 使用用戶的本地化配置運(yùn)行 postmaster 進(jìn)程。可以用 postgres 和 psql SET 命令控制日期格式。根據(jù)你的操作環(huán)境設(shè)置那些值。

4.2) 二進(jìn)制游標(biāo)和普通游標(biāo)之間準(zhǔn)確的區(qū)別是什么?
參閱 DECLARE 手冊(cè)頁獲取信息。

4.3)我如何只 SELECT (選取)一個(gè)查詢的頭幾行?
參閱 FETCH 手冊(cè)頁,或者使用 SELECT ... LIMIT....

即使你只需要開頭的幾行,也會(huì)涉及到整個(gè)查詢。試著使用帶有 ORDER BY 的查詢。如果有一個(gè)索引與 ORDER BY 匹配,PostgreSQL 可能就只計(jì)算要求的頭幾條記錄,否則將對(duì)整個(gè)查詢進(jìn)行計(jì)算直到生成需要的行。

4.4) 我如何獲取一個(gè)表的列表,或者是其他我能在 psql 里看到的東西?
你可以閱讀 psql 的源代碼,文件 pgsql/src/bin/psql/psql.c。它包括為生成 psql 的反斜杠命令的輸出的 SQL 命令。你還可以帶著 -E 選項(xiàng)啟動(dòng) psql,這樣它將打印出執(zhí)行你給出的命令所用的查詢。

4.5) 你怎樣從一個(gè)表里面刪除一個(gè)列?
我們不支持 ALTER TABLE DROP COLUMN,但可以這樣做:

SELECT ...  -- select all columns but the one you want to remove
INTO TABLE new_table
FROM old_table;
DROP TABLE old_table;
ALTER TABLE new_table RENAME TO old_table;

4.6) 一行,一個(gè)表,一個(gè)庫的最大尺寸是多少?
行被限制在 8K 字節(jié)以內(nèi),但是可以通過編輯 include/config.h 和修改 BLCKSZ 而改變。要使用大于 8K 的字段,你還可以使用大對(duì)象接口。

行不會(huì)折疊 8k 的邊界,所以 5k 的行將需要 8k 存儲(chǔ)空間。

表和數(shù)據(jù)庫尺寸沒有限制。有許多數(shù)據(jù)庫有幾十G字節(jié)大,可能還有幾百G字節(jié)的數(shù)據(jù)庫。

4.7)存儲(chǔ)一個(gè)典型的平面文件里的數(shù)據(jù)需要多少磁盤空間?
一個(gè) Postgres 數(shù)據(jù)庫可能需要大約相當(dāng)于在一個(gè)平面文件里存儲(chǔ)相同數(shù)據(jù)的6.5倍的磁盤空間。

假設(shè)一個(gè)文件有 300,000 行,每行有兩個(gè)整數(shù)。平面文件是 2.4MB。而包含這些數(shù)據(jù)的 PostgreSQL 數(shù)據(jù)庫文件的大小預(yù)計(jì)可達(dá) 14MB: 

    36 bytes: each row header (approximate)(每行的頭,估計(jì)值)
   + 8 bytes: two int fields @ 4 bytes each(兩個(gè)整數(shù)字段,每個(gè)4字節(jié))
   + 4 bytes: pointer on page to tuple(頁面里指向記錄的指針)
   ----------------------------------------
    48 bytes per row(每行 48 字節(jié))

   The data page size in PostgreSQL is 8192 bytes (8 KB), so:(PostgreSQL 里的數(shù)據(jù)頁面的尺寸是 8K,因此:)

   8192 bytes per page
   -------------------   =  171 rows per database page (rounded up)(圓整后 117行/數(shù)據(jù)庫頁)
     48 bytes per row

   300000 data rows
   --------------------  =  1755 database pages(1755數(shù)據(jù)庫頁面)
      171 rows per page

1755 database pages * 8192 bytes per page  =  14,376,960 bytes (14MB)

索引沒有這么多額外的東西,但是還是包含被索引的數(shù)據(jù),所以他們可能也很大。

4.8) 我如何查看一個(gè)數(shù)據(jù)庫里面定義了那些索引或者操作?
psql 有許多反斜杠命令用于顯示這些信息。用 /? 看看都有那些。

同樣可以試試文件 pgsql/src/tutorial/syscat.source。它演示了許多從數(shù)據(jù)庫系統(tǒng)表里獲取信息需要的 SELECT。

4.9) 我的查詢很慢或者沒有利用索引。為什么?
PostgreSQL 并不自動(dòng)維護(hù)統(tǒng)計(jì)數(shù)據(jù)。我們必須進(jìn)行一次顯式的 VACUUM 調(diào)用來更新統(tǒng)計(jì)數(shù)據(jù)。在統(tǒng)計(jì)數(shù)據(jù)更新之后,優(yōu)化器就知道表里面有多少數(shù)據(jù)行,因而就可以更好的判斷是否應(yīng)該使用索引。要注意當(dāng)表很小的時(shí)候優(yōu)化器并不使用索引,因?yàn)檫@時(shí)候一次順序掃描會(huì)更快。

對(duì)于字段相關(guān)的優(yōu)化統(tǒng)計(jì),使用 VACUUM ANALYZE。VACUUM ANALYZE 對(duì)于復(fù)雜的多聯(lián)合查詢是非常重要的,因?yàn)檫@樣優(yōu)化器可以計(jì)算從每個(gè)表里面返回的行的數(shù)目,然后選擇合適的聯(lián)合順序。后端本身并不跟蹤字段統(tǒng)計(jì),因而必須周期的運(yùn)行 VACUUM ANALYZE 以便收集這些信息。

索引通常不用于 ORDER BY 操作:對(duì)一個(gè)大表的一次順序掃描然后跟著一個(gè)顯式的排序比對(duì)所有記錄的索引掃描要快,因?yàn)榍罢叩拇疟P訪問更少。

當(dāng)使用模糊操作符,比如 LIKE 或 ~,只有在搜索的開始是掛在字串的開頭部分時(shí)才用得到索引。因而要使用索引,LIKE 搜索不應(yīng)該以 % 開頭,而~(規(guī)則表達(dá)式搜索)應(yīng)該以^ 開頭。 

4.10) 我如何才能看到查詢優(yōu)化器是怎樣計(jì)算我的查詢的?
參考 EXPLAIN 手冊(cè)頁。

4.11) R-tree 索引是什么?
r-tree 索引用于索引空間數(shù)據(jù)。一個(gè)哈希索引無法處理范圍搜索。而 B-tree 索引只能處理一維的范圍搜索。R-tree 索引可以處理多維數(shù)據(jù)。例如,如果可以在一個(gè)類型為 point 的字段上建立一個(gè) R-tree 索引,那么系統(tǒng)在回答類似 select all points within a bounding rectangle (選擇在一個(gè)長方形范圍內(nèi)的所有點(diǎn))這樣的查詢時(shí)有更高的效率。

描述最初的 R-Tree 的設(shè)計(jì)的規(guī)范里面寫到:

Guttman, A. "R-Trees: A Dynamic Index Structure for Spatial Searching." Proc of the 1984 ACM SIGMOD Int'l Conf on Mgmt of Data, 45-57.

你還可以在 Stonebraker 的 "Readings in Database Systems" 找到這篇文章。

建立 R-Trees 可以處理多邊形和方形。理論上說,R-trees 可以擴(kuò)展為處理更多維數(shù)。不過在實(shí)踐上,擴(kuò)展 R-trees 需要一定的工作量,而我們目前沒有如何做的文檔。

4.12) 什么是基因查詢優(yōu)化(Genetic Query Optimization)?
PostgreSQL 里面的 GEQO 模塊試圖使用一種叫基因算法( Genetic Algorithm (GA))解決聯(lián)合許多表的查詢優(yōu)化問題。它允許通過非窮盡搜索處理大的聯(lián)合查詢。

更多信息請(qǐng)參考文檔。

4.13) 我怎樣做規(guī)則表達(dá)式搜索和大小寫無關(guān)搜索?
操作符 ~ 處理規(guī)則表達(dá)式匹配,而 ~* 處理大小寫無關(guān)的規(guī)則表達(dá)式匹配。LIKE 操作符里面沒有大小寫無關(guān)的用法,不過你可以通過下面的用法獲得大小寫無關(guān)的 LIKE:

WHERE lower(textfield) LIKE lower(pattern)

4.14) 在一個(gè)查詢里,我怎樣檢測一個(gè)字段是否為 NULL?
你用 IS NULL 和 IS NOT NULL 測試這個(gè)字段。

4.15) 各種字符類型之間有什么不同?
Type            Internal Name   Notes
--------------------------------------------------
"char"          char            1 character
CHAR(#)         bpchar          blank padded to the specified fixed length
VARCHAR(#)      varchar         size specifies maximum length, no padding
TEXT            text            length limited only by maximum row length
BYTEA           bytea           variable-length array of bytes

在查看系統(tǒng)表和在一些錯(cuò)誤信息里你將看到內(nèi)部名稱。

上面最后四種類型是"varlena"(變長)類型(也就是說,開頭的四個(gè)字節(jié)是長度,后面跟著數(shù)據(jù))。char(#) 分配最多個(gè)數(shù)字節(jié),不管在數(shù)據(jù)域里面有多少數(shù)據(jù)。 text,varchar(#),和 bytea 都在磁盤上有變長的長度,因此,使用它們有一點(diǎn)點(diǎn)的性能損失。準(zhǔn)確地說,性能損失發(fā)生在第一個(gè)這種類型的字段后對(duì)所有其他字段的訪問的時(shí)候。

4.16.1) 我怎樣創(chuàng)建一個(gè)序列號(hào)/自動(dòng)遞增的字段?
PostgreSQL 支持 SERIAL 數(shù)據(jù)類型。它在字段上自動(dòng)創(chuàng)建一個(gè)序列和索引。例如,這樣... 

CREATE TABLE person ( 
id   SERIAL, 
name TEXT 
);

...會(huì)自動(dòng)轉(zhuǎn)換為這樣... 

CREATE SEQUENCE person_id_seq;
CREATE TABLE person ( 
id   INT4 NOT NULL DEFAULT nextval('person_id_seq'),
name TEXT 
);
CREATE UNIQUE INDEX person_id_key ON person ( id );

參考 create_sequence 手冊(cè)頁獲取關(guān)于序列的更多信息。你還可以用每行的 oid 字段作為一個(gè)唯一值。不過,如果你需要傾倒和重載數(shù)據(jù)庫,你需要使用 pg_dump 的 -o 選項(xiàng)或者 COPY WITH OIDS 選項(xiàng)以保留 oid。

更多信息,參閱 Bruce Momjian 的 行計(jì)數(shù) 章節(jié)。

4.16.2) 我如何獲得一個(gè)插入后生成的序列號(hào)( SERIAL )的值?
可能實(shí)現(xiàn)這個(gè)要求的最簡單的方法是:在插入之前先用函數(shù) nextval() 從序列對(duì)象里檢索出下一個(gè) SERIAL 值,然后再顯式插入。利用 4.16.1 里的例子表,這樣做看起來象下面這樣:

$newSerialID = nextval('person_id_seq');
INSERT INTO person (id, name) VALUES ($newSerialID, 'Blaise Pascal');

你還能獲得存儲(chǔ)在 $newSerialID 里面的新值,可以用于其他查詢(例如,作為 person 表的外鍵)。要注意自動(dòng)創(chuàng)建的 SEQUENCE 對(duì)象的名稱將會(huì)是命名為 
__seq,這里 table 和 serialcolumn 分別是你的表的名稱和你的 SERIAL 字段的名稱。

類似的,在 SERIAL 對(duì)象缺省插入后你可以用函數(shù) currval() 檢索剛賦值的 SERIAL 值,例如,

INSERT INTO person (name) VALUES ('Blaise Pascal');
$newID = currval('person_id_seq');

最后,你可以使用從 INSERT 語句返回的 oid 查找缺省值,盡管這可能是最缺乏移植性的方法。在 perl 里,使用帶有 Edmund Mergl 的 DBD::Pg 模塊的 DBI,oid 值可以通過 $sth->execute() 后的 $sth->{pg_oid_status} 獲得。

4.16.3) 使用 currval() 和 nextval() 會(huì)導(dǎo)致一個(gè)與其他并行后端進(jìn)程之間的一個(gè)競爭條件嗎?
不會(huì)。這個(gè)問題由后端處理。

4.17) 什么是 oid?什么是 tid?
Oid 是 PostgreSQL 的唯一行標(biāo)識(shí)。PostgreSQL 里創(chuàng)建的每一行都獲得一個(gè)唯一的 oid。所有在 initdb 過程中創(chuàng)建的 oid 都小于 16384 (來自 backend/access/transam.h)。所有用戶創(chuàng)建的 oid 都大于或等于這個(gè)值。缺省時(shí),所有這些 oid 不僅在一個(gè)表,一個(gè)數(shù)據(jù)庫里面唯一,而且在整個(gè) PostgreSQL 安裝里也是唯一的。

PostgreSQL 在它的內(nèi)部系統(tǒng)表里使用 oid 在表之間聯(lián)接行。這些 oid 可以用于標(biāo)識(shí)特定的用戶行以及用在聯(lián)合里。我們建議你使用字段類型 oid 存儲(chǔ) oid 值。參閱 sql(l) 手冊(cè)頁查找其他內(nèi)部字段。你可以在 oid 字段上創(chuàng)建一個(gè)索引以獲取快速訪問。

Oid 從被所有數(shù)據(jù)庫使用的某個(gè)區(qū)域里賦值給所有新行。如果你想把 oid 該成別的值,或者你想做一份表的帶著原始 oid 的拷貝,你可以做到:

        CREATE TABLE new_table(old_oid oid, mycol int);
        SELECT INTO new SELECT old_oid, mycol FROM old;
        COPY new TO '/tmp/pgtable';
        DELETE FROM new;
        COPY new WITH OIDS FROM '/tmp/pgtable';


Tid 用于標(biāo)識(shí)帶著數(shù)據(jù)塊和偏移量值的特定的物理行。Tid 在每行的更改或者重載后被改變。它們被索引記錄用于指引物理行。

4.18) 里 PostgreSQL 使用的一些術(shù)語的含義是什么?
一些源代碼和一些舊一點(diǎn)的文檔使用一些有更常用用法的術(shù)語。下面是其中一部分:

table, relation, class 
row, record, tuple 
column, field, attribute 
retrieve, select 
replace, update 
append, insert 
oid, serial value 
portal, cursor 
range variable, table name, table alias 
4.19) 為什么我收到錯(cuò)誤 "FATAL: palloc failure: memory exhausted?"
這很可能是你系統(tǒng)的虛擬內(nèi)存用光了,或者你的內(nèi)核對(duì)這樣的資源有較底的限制值。在啟動(dòng) postmaster 之前試試下面的命令:

ulimit -d 65536
limit datasize 64m

取決于你用的 shell,上面命令只有一條能成功,但是它將把你的進(jìn)程數(shù)據(jù)段設(shè)置得比較高,因而也許能讓查詢能夠運(yùn)行完成。這條命令應(yīng)用于當(dāng)前進(jìn)程,以及所有在這條命令運(yùn)行后創(chuàng)建的子進(jìn)程。如果你碰到了因?yàn)楹蠖诉\(yùn)行返回了太多數(shù)據(jù)的客戶端 SQL 的問題,試著先運(yùn)行這些命令再運(yùn)行客戶端。

4.20) 我如何才能知道我運(yùn)行的 PostgreSQL 的版本?
從 psql 里,鍵入 select version();

4.21) 為什么我的大對(duì)象操作收到invalid large obj descriptor(非法大對(duì)象描述符)。?
你需要在任何操作大對(duì)象的周圍放上 BEGIN WORK 和 COMMIT,也就是說,包圍 lo_open ... lo_close。

目前 PostgreSQL 強(qiáng)制這樣的規(guī)則:在事務(wù)提交時(shí)關(guān)閉大對(duì)象句柄,這樣,如果你沒有處于一個(gè)事務(wù)里面,就會(huì)是緊跟在一個(gè) lo_open 命令完成的后面。所以對(duì)這個(gè)句柄做任何事情的企圖都會(huì)導(dǎo)致一個(gè) invalid large obj descriptor。所以,如果你沒有使用一個(gè)事務(wù),以前能工作的代碼(至少是大多數(shù)時(shí)間)將會(huì)生成這么一個(gè)錯(cuò)誤信息。

如果你使用客戶端接口,如 ODBC,你可能需要 set auto-commit off。

4.22) 我如何創(chuàng)建一個(gè)缺省值是當(dāng)前時(shí)間的字段?

下面的方法總可以工作:


CREATE TABLE test (x int, modtime timestamp default now() );

在版本 7.0 或更新,你可以使用:


create table test (x int, modtime timestamp default 'now');

4.23) 為什么我的使用 IN 的子查詢這么慢?
目前,我們通過為外層查詢的每一行順序掃描子查詢的結(jié)果來聯(lián)合子查詢和外層查詢。可以用 EXISTS 替換 IN 來繞開這個(gè)限制。例如,把:


SELECT *
FROM tab
WHERE col1 IN (SELECT col2 FROM TAB2)

改為: 


SELECT *
FROM tab
WHERE EXISTS (SELECT col2 FROM TAB2 WHERE col1 = col2)

我們希望在未來的版本里修補(bǔ)這個(gè)限制。


--------------------------------------------------------------------------------

擴(kuò)展 PostgreSQL
5.1) 我寫了一個(gè)用戶定義函數(shù)。當(dāng)我在psql 里運(yùn)行它時(shí),為什么會(huì)導(dǎo)致內(nèi)核傾倒?
問題可能出在很多方面。首先試著在一個(gè)獨(dú)立的測試程序里面測試你的用戶定義函數(shù)。

5.2) 消息:NOTICE:PortalHeapMemoryFree: 0x402251d0 not in alloc set! 是什么意思?
你正用 pfree 釋放一些不是 palloc 分配的東西。不要混用 malloc/free 和 palloc/pfree。

5.3) 我如何能給 PostgreSQL 貢獻(xiàn)一些挺不錯(cuò)的新類型和函數(shù)?
把你的擴(kuò)展發(fā)送到 pgsql-hackers 郵件列表,它們最終會(huì)放到 contrib/ 子目錄里面。

5.4) 我怎樣寫一個(gè)返回一條記錄的 C 函數(shù)?
解決這個(gè)問題需要很高的技巧,作者本人從來沒有試過,盡管理論上是可能的。

5.5) 我修改了源代碼。為什么重新編譯后沒有看到改變?
Makefiles 對(duì)包含文件沒有正確的依賴性規(guī)則。你必須做一次 make clean 然后是另一次 make。你必須做一次 make clean 然后做另一次 make。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 天水市| 萍乡市| 华坪县| 娄烦县| 孟连| 丽江市| 临湘市| 邵阳县| 鹤峰县| 教育| 象山县| 双鸭山市| 高密市| 临江市| 滨州市| 马尔康县| 南郑县| 大关县| 沅江市| 临海市| 文水县| 玉龙| 治多县| 通海县| 南充市| 荥阳市| 巴马| 五指山市| 财经| 象州县| 中宁县| 浦江县| 密云县| 南开区| 延长县| 凤庆县| 静乐县| 田林县| 蚌埠市| 彭阳县| 永新县|