GB | BIG5
|
| 首頁 > 數據庫 > 其它 > 正文 |
 |
| PostgreSQL 常見問題(FAQ) |
| 何偉平 (laser@zhengmai.com.cn) (2001-04-21 18:27:29) |
最近更新:2000 年 三月二十一日 星期二 16:09:11 EST
目前維護人員:Bruce Momjian (pgman@candle.pha.pa.us)
中文版維護人員:何偉平 (laser@zhengmai.com.cn)
本文檔的最新版本可以在 postgreSQL Web 站點上看到,http://www.PostgreSQL.org。
Linux 相關的問題在 http://www.PostgreSQL.org/docs/faq-linux.html 裡回答。
Irix 相關的問題在 http://www.PostgreSQL.org/docs/faq-irix.html 裡回答。
HPUX 相關的問題在 http://www.PostgreSQL.org/docs/faq-hpux.shtml 裡回答。
--------------------------------------------------------------------------------
常見問題
1.1) PostgreSQL 是什?
1.2) PostgreSQL 的版權是什?
1.3) PostgreSQL 運行在什 Unix 平台上?
1.4) 可用的非unix平台有那些?
1.5) 我在那裡能得到 PostgreSQL?
1.6) 我從那裡能得到對 PostgreSQL 的支持?
1.7) PostgreSQL 最新的版本是什?
1.8) 可獲得的 PostgreSQL 的文檔有那些?
1.9) 我如何了解已知的臭虫或缺失的特性?
1.10) 我應該怎樣學習 SQL ?
1.11) PostgreSQL 是 Y2K 兼容的嗎?
1.12) 我應該怎樣加入開發隊伍?
1.13) 我應該怎樣提交一個臭虫報告?
1.14) PostgreSQL 和其他 DBMS 比起來如何?
用戶客戶端問題
2.1) 有 PostgreSQL 的 ODBC 驅動程序?
2.2) 有什工具可以把 PostgreSQL 用 Web 頁面?
2.3) PostgreSQL 擁有圖形用戶界面嗎?有報表生成器嗎?有嵌入的查詢語言接口嗎?
2.4) 我們可以用什語言和 PostgreSQL 打交道?
管理員問題
3.1) 為什 initdb 會失敗?
3.2) 我怎樣能把 PostgreSQL 裝在 /usr/local/pgsql 以外的地方?
3.3) 當我運行 postmaster 時,我收到Bad System Call(系統調用錯)或者內核傾倒消息。為什?
3.4) 當我試圖運行 postmaster 時,我收到 IpcMemoryCreate errors3 消息。為什?
3.5) 當我試圖運行 postmaster 時,我收到 IpcSemaphoreCreate 錯誤。為什?
3.6) 我如何禁止其他主機訪問我的 PostgreSQL 數據庫
3.7) 為什我無法從其他機器上聯接到我的數據庫來?
3.8) 為什我不能以 root 用戶身份訪問數據庫?
3.9) 為什在並行訪問表時,我的所有(數據庫)服務器都崩潰了?
3.10) 我怎樣調節數據庫引擎以獲得更好的性能?
3.11) PostgreSQL 裡可以獲得什樣的調試特性?
3.12) 當我試圖聯接時收到'Sorry, too many clients' 消息。這是為什?
3.13) 我的數據庫目錄裡面的 pg_psort.XXX 文件是什?
3.14) 我如何設置一個 pg_group?
操作問題
4.1) 系統看起來被逗號,小數點和日期格式弄糊塗了。
4.2) 二進制遊標和普通遊標之間準確的區別是什?
4.3) 我如何只 select (選取)一個查詢的頭幾行?
4.4) 我如何獲取一個表的列表,或者是其他我能在 psql 裡看到的東西?
4.5) 你怎樣從一個表裡面刪除一個列?
4.6) 一行,一個表,一個庫的最大尺寸是多少?
4.7) 存儲一個典型的平面文件裡的數據需要多少磁盤空間?
4.8) 我如何查看一個數據庫裡面定義了那些索引或者操作?
4.9) 我的查詢很慢或者沒有利用索引。為什?
4.10) 我如何才能看到查詢優化器是怎樣計算我的查詢的?
4.11) R-tree 索引是什?
4.12) 什是基因查詢優化(Genetic Query Optimization)?
4.13) 我怎樣做規則表達式搜索和大小寫無關搜索?
4.14) 在一個查詢裡,我怎樣檢測一個字段是否為 NULL?
4.15) 各種字符類型之間有什不同?
4.16.1) 我怎樣創建一個序列號/自動遞增的字段?
4.16.2) 我如何獲得一個插入的序列號的值?
4.16.3) 使用 currval() 和 nextval() 會導致一個與其他並行端進程之間的一個競爭條件嗎?
4.17) 什是 oid?什是 tid?
4.18) 裡 PostgreSQL 使用的一些術語的含義是什?
4.19) 為什我收到錯誤 "FATAL: palloc failure: memory exhausted?"
4.20) 我如何才能知道我運行的 PostgreSQL 的版本?
4.21) 為什我的大對象操作收到invalid large obj descriptor(非法大對象描述符)。?
4.22) 我如何創建一個缺省值是當前時間的字段?
4.23) 為什我的使用 IN 的子查詢這慢?
擴展 PostgreSQL
5.1) 我寫了一個用戶定義函數。當我在psql 裡運行它時,為什會導致內核傾倒?
5.2) 消息:NOTICE:PortalHeapMemoryFree: 0x402251d0 not in alloc set! 是什意思?
5.3) 我如何能給 PostgreSQL 貢獻一些挺不錯的新類型和函數?
5.4) 我怎樣寫一個返回一條記錄的 C 函數?
5.5) 我修改了源代碼。為什重新編譯沒有看到改變?
--------------------------------------------------------------------------------
常見問題
1.1) PostgreSQL是什?
PostgreSQL 是一個 POSTGRES 數據庫管理系統的增強版,是一個下一代 DBMS 的研究原型。PostgreSQL 在保持 POSTGRES 的強大的數據模型和豐富的數據類型的基礎上,用一個擴展了的 SQL 的子集取代了原先的 PostQuel 查詢語言。PostgreSQL 是自由的並且所有源代碼都可以獲得。
PostgreSQL 的開發是由一個互聯網相聯的開發人員隊伍進行的,他們都參加 PostgreSQL 開發郵件列表。目前的協調人是 Marc G. Fournier (scrappy@postgreSQL.org)。(如何加入參閱下文)。這個隊伍現在負責 PostgreSQL 所有目前的和未來的開發。
PostgreSQL 1.01 的作者是 Andrew Yu 和 Jolly Chen。還有許多其他人為移植,測試,調試和增強代碼做了大量貢獻。PostgreSQL 起源的最初的 Postgres 的代碼,是在加州大學伯克利分校的 Michael Stonebraker 教授的指導下,由許多研究生,本科生和編程職員完成的。
這個軟件最初在伯克利的名字是 Postgres。在 1995 年,當增加了 SQL 功能,它的名字改成 Postgres95。在 1996年末,這個名字改為 PostgreSQL。
1.2) PostgreSQL 的版權是什?
PostgreSQL 受下面的版權約束。
PostgreSQL 數據庫管理系統
(PostgreSQL Data Base Management System)
部分版權(c)1996-2000,PostgreSQL,Inc 部分版權(c)1994-6 加州大學董事
(Portions copyright (c) 1996-2000, PostgreSQL, Inc 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.3) PostgreSQL 運行在什平台上?
作者們在下面這些平台上編譯和測試了 PostgreSQL (其中有些平台的編譯要求使用 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 發展來的 OS (NetBSD,FreeBSD)
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 平台有那些?
把 libpq C 庫,psql,和其他接口和二進制編譯成可以在 MS Windows 平台上運行是可能的。這種情況下,客戶端在 MS Windows 上運行,並且通過 TCP/IP 與一個運行在我們支持的 Unix 平台上的服務器進行通訊。
在發布包裡面有一個 win31.mak 文件用制作 Win32 的 libpq 庫和 psql。
數據庫服務器現在可以通過使用 Cygnus Unix/NT 移植庫在 Windows NT 上面運行。參閱發布包裡的 pgsql/doc/README.NT 文件。
還有一個 web 頁在 http://www.freebsd.org/~kevlo/postgres/portNT.html。另外還有一個使用 U/Win 的移植在 http://surya.wipro.com/uwin/ported.html.
1.5) 我在那裡可以得到 PostgreSQL?
PostgreSQL 的主匿名 ftp 站在 ftp://ftp.postgreSQL.org/pub
鏡像站可以參考我們網站的主頁。
1.6) 我從那裡能得到對 PostgreSQL 的支持?
加州大學伯克利分校不對 PostgreSQL 提供任何官方支持。它是通過志願者的行動維護的。
主要的郵件列表是:pgsql-general@postgreSQL.org。可以在那裡討論有關 PostgreSQL 的問題。要加入列表,發一封郵件內容(不是主題行)為
subscribe
end
的郵件到 pgsql-general-request@postgreSQL.org。
還可以獲取摘要列表。要加入這個列表,發郵件到:pgsql-general-digest-request@postgreSQL.org,其內容為:
subscribe
end
每當主列表達到大約 30k 的消息內容時,摘要就發送給這個列表的成員。
還可以參加臭虫郵件列表。要加入這個列表,發送一個郵件到 bugs-request@postgreSQL.org,內容為:
subscribe
end
還可以參加開發人員郵件列表。要加入這個列表,發送一個郵件到 hackers-request@postgreSQL.org,內容為:
subscribe
end
其他的關 PostgreSQL 郵件列表和其他信息可以在 PostgreSQL 的 WWW 主頁找到:
http://postgreSQL.org
在 EFNet 裡還有一個 IRC 頻道,頻道 #PostgreSQL。我用 unix 命令irc -c '#PostgreSQL' "$USER" irc.phoenix.net
PostgreSQL 的商業支持可以在 http://www.pgsql.com/ 獲得。
1.7) PostgreSQL 最新的版本是什?
PostgreSQL 最新的版本是版本 7.0。
我們計劃每四個月發布一個主要版本。
1.8) 可獲得的 PostgreSQL 文檔有那些?
在發布包裡有一些手冊,手冊頁和一些小的測試例子。參見 /doc 目錄。(譯注:應為 $PGHOME/doc)。你還可以在線瀏覽PostgreSQL 的手冊,在 http://www.postgresql.org/docs/postgres.。
psql 有一些很好的 \d 命令,顯示關類型,操作符,函數,聚集等的信息。
web 站包含更多的文檔。
1.9) 我如何了解已知的臭虫和缺失的特性?
PostgreSQL 支持一個擴展了的 SQL-92 的子集。參閱我們的 TODO,獲取一個已知臭虫,缺失特性和未來計劃的列表。
1.10) 我應該怎樣學習 SQL?
在 http://w3.one.net/~jhoffman/sqltut.htm 和 http://ourworld.compuserve.com/homepages/Graeme_Birchall/HTM_COOK.HTM. 有一個很好的教程。
另一個是 "Teach Yourself SQL in 21 Days, Second Edition"(21天學會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) 我應該怎樣加入開發隊伍?
首先,下載最新的源代碼和閱讀我們 web 站上的 PostgreSQL 開發者文檔。第二,加入 pgsql-hackers 和 pgsql-patches 郵件列表。第三,向 pgsql-patches 提交高質量的補丁程序。
現在大概有十幾個人有 PostgreSQL CVS 歸檔 COMMIT 的權限。他們都已經提交了非常多高質量的補丁了,以至現有的提交人很難跟上節奏,並且我們相信他們提交的補丁都是高質量的。
1.13) 我怎樣提交一個臭虫報告?
填充"bug-template"(臭虫模板)文件然發送到:bugs@postgreSQL.org
同樣也要看看我們的 ftp 站點 ftp://ftp.postgreSQL.org/pub,看有沒有更新的 PostgreSQL 版本或補丁。
1.14) PostgreSQL 和其他 DBMS 比起來如何?
評價軟件有好幾種方法:特性,性能,可靠性和價格。
特性
PostgreSQL 擁有大型商用 DBMS 裡大多數特性,例如:事務,子查詢,觸發器,視圖和復雜的鎖定等。我們還有一些它們沒有的特性,如用戶定義類型,繼承,規則和多版本並行控制以減少鎖的爭用等。我們還沒有外鍵參考完整或外部聯合(foreign key referential integrity or outer joins),不過正在準備在下一個版本增加這些特性。
性能
PostgreSQL 在兩種模式下運行。通常的 fsync (同步)模式把每個完成的事務都沖洗到磁盤上,以保証如果 OS 崩潰了或者在下幾秒鐘出現掉電的情況下,你的所有數據都安全地存放在磁盤上。這種模式下,我們比大多數商用數據庫都慢,部分原因是因為那些數據庫缺省狀態下很少這樣保守地向磁盤沖洗數據。在 no-fsync (非同步)模式下,我們一般都比商用數據庫快,盡管在這種模式下,一個 OS 的崩潰將導致數據損壞。我們正在建設一種中間模式,這種模式比完全同步(fsync)模式的性能損失小,而且將保証在OS 崩潰情況下的 30 秒內的數據完整。這種模式可以由數據庫管理員選擇。
與 MySQL 或更輕便的數據庫系統比較,我們在 insert/update 時慢,因為我們有額外的事務處理。當然 MySQL 不具有我們在上面的特性段裡給出的任何特性。我們的主要方向是靈活性和特性,盡管我們通過優化和源碼分析不斷地改進性能。
我們通過創建一個 Unix 進程處理每個用戶的聯接。端進程共享數據緩沖區和鎖信息。在多 CPU 的條件下,多個端很容易運行在不同的 CPU 上。
可靠性
我們知道 DBMS 必須是可靠的,否則它就一點用都沒有。我們努力做到發布經過認真測試的,穩定的臭虫最少的代碼。每個版本至少有一個月的 beta 測試,並且我們的發布歷史顯示我們可以提供穩定的,牢固的,可用生產使用的版本。我們相信在這方面我們與其他的數據庫軟件是相當的。
支持
我們的郵件列表提供一個非常大的開發人員和用戶的組以幫助解決所碰到的任何問題。我們不能保証肯定能解決問題,相比之下,商用 DBMS 也並不是總能夠提供解決方法。直接與開發人員,用戶群,手冊和源程序接觸令 PostgreSQL 的支持比其他 DBMS 還要好。還有一些商業性的預包裝的支持,可以給提供給那些需要的人。(參閱支持 FAQ 條款。)
價格
我們對任何用途都免費,包括商用和非商用目的。你可以不加限制地向你的產品裡加入我們的代碼,除了那些我們在上面的版權聲明裡聲明的 BSD 風格的版權外。
--------------------------------------------------------------------------------
用戶客戶問題
2.1) 有 PostgreSQL 的 ODBC 驅動?
有兩個 ODBC 驅動可以獲得,PostODBC 和 OpenLink ODBC.
在發布版本裡面包含。關它的更多信息可以從:http://www.insightdist.com/psqlodbc 獲得。
OpenLink ODBC 可以從 http://www.openlinksw.com 獲得。它與他們的標準 ODBC 客戶端軟件兼容,因而你可以在任何他們支持的客戶端平台(Win, Mac, Unix, VMS)上使用 PostgreSQL ODBC。
他們可能將這個產品銷售給那些需要商業支持的用戶,但是總是有一個 freeware (自由軟件)的版本可以得到。請詢問 postgres95@openlink.co.uk。
2.2) 有什工具可以把 PostgreSQL 用 Web 頁面?
一個介紹以數據庫為台的 Web 頁面在:http://www.webtools.com。
還有一個在:http://www.phone.net/home/mwm/hotlist/。
對 web 集成,PHP 是一個極好的接口。它在:http://www.php.net
PHP 很適合用簡單任務,但對更復雜的任務,可以使用 perl 接口和 CGI.pm。
一個以 WDB 為基礎,使用 perl 的 WWW 網關可以從 http://www.eol.ists.ca/~dunlop/wdb-p95 下載。
2.3) PostgreSQL 擁有圖形用戶界面嗎?有報表生成器嗎?有嵌入的查詢語言接口嗎?
我們有一個叫 pgaccess 的很好的圖形用戶接口,它是做為發布版本的一部分發布的。Pgaccess 還有一個報表生成器。它的網頁在 http://www.flex.ro/pgaccess
我們還有 ecpg,它是一個用 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 會失敗?
檢查一下,確保你的路徑裡沒有任何以前版本的二進制文件(如果你看到消息 WARN:heap_modifytuple: repl is \ 9,那就是這個問題。)
檢查一下,看看你有沒有正確設置路徑。
檢查一下,看看 postgres 用戶是否擁有正確的文件
3.2) 我怎樣能把 PostgreSQL 裝在 /usr/local/pgsql 以外的地方?
最簡單的方法是在運行 configure 的時候聲明 --prefix 選項。如果你忘記這做了,你可以編輯 Makefile.global 並相應地修改 POSTGRESDIR,或者創建一個 Makefile.custom 並且在那裡定義 POSTGRESDIR。
3.3) 當我運行 postmaster 時,我收到Bad System Call (系統調用錯)或內核傾倒。為什?
這可能是很多方面的問題,但首先應該檢查你在內核裡配置安裝了 system V (系統 V)擴展。PostgreSQL 需要內核支持共享內存和信號燈。
3.4) 當我試圖運行 postmaster 時,我收到 IpcMemoryCreate 錯誤。為什?
你要是沒有在內核裡正確配置共享內存,要是你需要擴大你的內核的可用共享內存。你需要的共享內存具體的數量取決你的體系結構和你配置你的 postmaster 運行時使用的緩沖區和端進程數目。對大多數系統,使用缺省緩沖區和進程數目時,你最少需要~1MB。
3.5) 當我試圖運行 postmaster 時,我收到 IpcSemaphoreCreate 錯誤。為什?
如果錯誤信息是 IpcSemaphoreCreate: semget failed (No space left on device),那原因是你的內核沒有配置足夠的信號燈資源。Postgres 的每個潛在的端進程都需要一些信號燈。一個臨時的解決方法是以比較少的端數量(參數)啟動 postmaster。使用開關 -N 帶一個少缺省值 32 的參數運行 postmaster。更長久的解決方法是加大你的內核的 SEMMNS 和 SEMMNI 參數。
如果錯誤信息是其他的什東西,你可能就根本沒有在內核裡面配置信號燈支持。
3.6) 我如何禁止其他主機訪問我的 PostgreSQL 數據庫?
缺省時,PostgreSQL 只允許通過 unix 域套接字來自本機的聯接。除非你使用 -i 開關啟動 postmaster,並且通過對應的編輯 $PGDATA/pg_hba.conf 文件打開了主機為基礎( host-based )的認証,否則其他機器是不能與你的機器聯接的。這樣將允許 TCP/IP 聯接。
3.7) 為什我無法從其他機器上聯接到我的數據庫來?
缺省的配置只允許從本地利用 unix 域套接字與數據庫聯接。要打開 TCP/IP 聯接,確信你是帶著 -i 開關運行 postmaster 的,並且相應的向文件 pgsql/data/pg_hba.conf 裡增加了一些恰當的主機記錄。參考 pg_hba.conf 手冊頁。
3.8) 為什我不能以 root 用戶身份訪問數據庫?
你不應以用戶標識(user id)0 (root)創建數據庫。他們將不能訪問數據庫。這是一種安全預防措施,以避免任何用戶都能動態地把對象模塊與數據庫進行引擎鏈接。
3.9) 為什在並行訪問表時,我的所有(數據庫)服務器都崩潰了?
這個問題可能是因為內核沒有配置成支持信號燈引起的。
3.10) 我怎樣調節數據庫引擎以獲得更好的性能?
當然,索引可以加速查詢。EXPLAIN 命令允許你觀察 PostgreSQL 如何解釋你的查詢,以及使用了哪個索引。
如果你正處理一堆 INSERT,考慮使用 COPY 命令以大批量的方式進行。這樣做比單獨一個 INSERTS 快得多。第二,沒有處 BEGIN WORK/COMMIT 事務塊之間的語句被認為處它們自身的事務裡面。試著在一個事務塊裡面處理更多的語句。這樣可以減少事務帶來的過荷。同樣,在做大量的數據改變時考慮刪除和重建索引。
還有幾件調節的方法可以使用。你可以通過帶 -o -F 選項運行 postmaster 關閉 fsync()。這樣將避免每次事務調用 fsync() 把數據沖刷到磁盤上。
你還可以使用 postmaster -B 選項增加端進程使用的共享內存緩沖的數目。如果你把這個參數設置得太高,postmaster 可能無法啟動,因為你已經超過了你的內核在共享內存空間上的限制。每個緩沖區是 8K 並且缺省 64 個緩沖區。
你還可以使用端的 -S 選項來增加每個端用臨時排序用的最大內存數量。-S 值是以千字節計的,缺省是 512 (也就是說,512K)。把這個數目搞得太大也不是個好主意,因為你可能在一個查詢激活多個並行排序時用光內存。
你還可以使用 CLUSTER 命令來把一個基本表裡的數據按照索引的匹配進行分組。參閱 cluster(l) 的手冊頁獲取更多細節。
3.11) PostgreSQL 裡可以獲得什樣的調試特性?
PostgreSQL 有幾個特性用報告狀態信息,這些信息可能對調試用途很有幫助。
首先,通過附帶 --enable-cassert 選項運行 configure,有很多 assert() 監控端的過程和在發生某些未曾預料的現象時停止程序運行。
postmaster 和 postgres 都有一些可用的選項。首先,當你啟動 postmaster 時,確保你把標準輸出和標準錯誤定向到了一個日志文件裡去了,象:
cd /usr/local/pgsql
./bin/postmaster >server.log 2>&1 &
這樣將在 PostgreSQL 頂級目錄下輸出一個 server.log 文件。這個文件包含服務器碰到的問題和錯誤的有用信息。postmaster 有一個 -d 選項,該選項允許我們獲得更多的細節匯報。-d 選項接受一個數字標明調試級別。需要警告的是高的調試級別可能會生成巨大的日志文件。
你實際上可以直接在命令行上運行 postgres 端,然直接鍵入你的 SQL 語句。我們只推薦在調試的時候這幹。請注意這時一個新行結束一個查詢,而不是一個分號。如果你帶著調試符號編譯,你可以使用一個調試器觀看發生了什事情。因為端沒有由 postmaster 啟動的,它不是在一個典型的環境裡運行而且鎖定/端交互問題可能不能復現。有些調試器可以附加到一個已運行的端上;那是在一個正常的多端環境下診斷問題的最方便的方法。
postgres 程序有 -s,-A,和 -t 選項可能在調試和性能測量的時候非常有用。
你還可以帶構形文件編譯端,以便觀察什函數佔據著執行時間。端構形文件將放在 pgsql/data/base/dbname 目錄下。客戶端構形文件將放在客戶端當前目錄下。
3.12) 當我試圖聯接時收到'Sorry, too many clients' 消息。這是為什?
你需要增大 postmaster 關它可以啟動的並發端進程數目的限制。
在 Postgres 6.5 及以上版本,缺省限制是 32 進程。你可以通過帶著適當的 -N 值開關啟動 postmaster 增加這個數目。缺省配置下你最大可以把 -N 設置為 1024;如果你需要更多端進程,增大 include/config.h 裡的 MAXBACKENDS 值然重新制作。如果你願意,你可以在配置的時候設置 -N 的缺省值:使用 configure 的 --with-maxbackends 開關。
要注意如果你把 -N 設置為大 32,你必須同樣增大 -B,超過它缺省的 64;-B 必須最少是 -N 的兩倍,而且為了更好的性能可能要比那個數字要大。對大數目的端進程,你可能還會發現你還需要增加許多 Unix 內核配置參數值。要檢查的東西包括共享內存塊的最大尺寸,SHMMAX,信號燈的最大數目,SEMMNS 和 SEMMNI,最大的進程數,NPROC,單用戶最大進程數,MAXUPRC,以及打開文件的最大數目,NFILE 和 NINODE。Postgres 對允許的端進程數有限制的原因是為了確保你的系統不會用光資源。
在 Postgres 早 6.5 的版本,最大端數目缺省是 64,並且對它的修改首先需要修改 include/storage/sinvaladt.h 裡的 MaxBackendId 常量,然重新制作。
3.13) 我的數據庫目錄裡面的 pg_tempNNN.NN 文件是什?
這些是查詢執行器生成的臨時文件。例如,如果需要為滿足 ORDER BY 條件做排序,並且排序需要比端的 -S 參數給出的更多的空間,那就會創建一個臨時文件保存多出來的數據。
臨時文件應該自動消失,不過如果在排序過程中端崩潰了就可能不能自動消失了。如果目前沒有什事務在運行,把 pg_tempNNN.NN 文件刪除是安全的。
3.14)我如何設置一個 pg_group?
目前,我們建立一個用戶組還沒有簡單的接口。你不得不顯式的 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:組名稱。這是一個名稱並且應該完全由字母和數字組成。不要包含下劃線和其他標點。
grosysid:組 id,這是一個 int4。應該在所有組中唯一。
grolist:屬這個組的 pg_user id 的列表。這是一個 int4[]。
--------------------------------------------------------------------------------
操作問題
4.1) 系統看起來被逗號,小數點和日期格式弄糊塗了。
檢查你的本地化(locale)配置。PostgreSQL 使用用戶的本地化配置運行 postmaster 進程。可以用 postgres 和 psql SET 命令控制日期格式。根據你的操作環境設置那些值。
4.2) 二進制遊標和普通遊標之間準確的區別是什?
參閱 DECLARE 手冊頁獲取信息。
4.3)我如何只 SELECT (選取)一個查詢的頭幾行?
參閱 FETCH 手冊頁,或者使用 SELECT ... LIMIT....
即使你只需要開頭的幾行,也會涉及到整個查詢。試著使用帶有 ORDER BY 的查詢。如果有一個索引與 ORDER BY 匹配,PostgreSQL 可能就只計算要求的頭幾條記錄,否則將對整個查詢進行計算直到生成需要的行。
4.4) 我如何獲取一個表的列表,或者是其他我能在 psql 裡看到的東西?
你可以閱讀 psql 的源代碼,文件 pgsql/src/bin/psql/psql.c。它包括為生成 psql 的反斜槓命令的輸出的 SQL 命令。你還可以帶著 -E 選項啟動 psql,這樣它將打印出執行你給出的命令所用的查詢。
4.5) 你怎樣從一個表裡面刪除一個列?
我們不支持 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) 一行,一個表,一個庫的最大尺寸是多少?
行被限制在 8K 字節以內,但是可以通過編輯 include/config.h 和修改 BLCKSZ 而改變。要使用大 8K 的字段,你還可以使用大對象接口。
行不會折疊 8k 的邊界,所以 5k 的行將需要 8k 存儲空間。
表和數據庫尺寸沒有限制。有許多數據庫有幾十G字節大,可能還有幾百G字節的數據庫。
4.7)存儲一個典型的平面文件裡的數據需要多少磁盤空間?
一個 Postgres 數據庫可能需要大約相當在一個平面文件裡存儲相同數據的6.5倍的磁盤空間。
假設一個文件有 300,000 行,每行有兩個整數。平面文件是 2.4MB。而包含這些數據的 PostgreSQL 數據庫文件的大小預計可達 14MB:
36 bytes: each row header (approximate)(每行的頭,估計值)
+ 8 bytes: two int fields @ 4 bytes each(兩個整數字段,每個4字節)
+ 4 bytes: pointer on page to tuple(頁面裡指向記錄的指針)
----------------------------------------
48 bytes per row(每行 48 字節)
The data page size in PostgreSQL is 8192 bytes (8 KB), so:(PostgreSQL 裡的數據頁面的尺寸是 8K,因此:)
8192 bytes per page
------------------- = 171 rows per database page (rounded up)(圓整 117行/數據庫頁)
48 bytes per row
300000 data rows
-------------------- = 1755 database pages(1755數據庫頁面)
171 rows per page
1755 database pages * 8192 bytes per page = 14,376,960 bytes (14MB)
索引沒有這多額外的東西,但是還是包含被索引的數據,所以他們可能也很大。
4.8) 我如何查看一個數據庫裡面定義了那些索引或者操作?
psql 有許多反斜槓命令用顯示這些信息。用 \? 看看都有那些。
同樣可以試試文件 pgsql/src/tutorial/syscat.source。它演示了許多從數據庫系統表裡獲取信息需要的 SELECT。
4.9) 我的查詢很慢或者沒有利用索引。為什?
PostgreSQL 並不自動維護統計數據。我們必須進行一次顯式的 VACUUM 調用來更新統計數據。在統計數據更新之,優化器就知道表裡面有多少數據行,因而就可以更好的判斷是否應該使用索引。要注意當表很小的時候優化器並不使用索引,因為這時候一次順序掃描會更快。
對字段相關的優化統計,使用 VACUUM ANALYZE。VACUUM ANALYZE 對復雜的多聯合查詢是非常重要的,因為這樣優化器可以計算從每個表裡面返回的行的數目,然選擇合適的聯合順序。端本身並不跟蹤字段統計,因而必須周期的運行 VACUUM ANALYZE 以便收集這些信息。
索引通常不用 ORDER BY 操作:對一個大表的一次順序掃描然跟著一個顯式的排序比對所有記錄的索引掃描要快,因為前者的磁盤訪問更少。
當使用模糊操作符,比如 LIKE 或 ~,只有在搜索的開始是掛在字串的開頭部分時才用得到索引。因而要使用索引,LIKE 搜索不應該以 % 開頭,而~(規則表達式搜索)應該以^ 開頭。
4.10) 我如何才能看到查詢優化器是怎樣計算我的查詢的?
參考 EXPLAIN 手冊頁。
4.11) R-tree 索引是什?
r-tree 索引用索引空間數據。一個哈希索引無法處理范圍搜索。而 B-tree 索引只能處理一維的范圍搜索。R-tree 索引可以處理多維數據。例如,如果可以在一個類型為 point 的字段上建立一個 R-tree 索引,那系統在回答類似 select all points within a bounding rectangle (選擇在一個長方形范圍內的所有點)這樣的查詢時有更高的效率。
描述最初的 R-Tree 的設計的規范裡面寫到:
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 可以擴展為處理更多維數。不過在實踐上,擴展 R-trees 需要一定的工作量,而我們目前沒有如何做的文檔。
4.12) 什是基因查詢優化(Genetic Query Optimization)?
PostgreSQL 裡面的 GEQO 模塊試圖使用一種叫基因算法( Genetic Algorithm (GA))解決聯合許多表的查詢優化問題。它允許通過非窮盡搜索處理大的聯合查詢。
更多信息請參考文檔。
4.13) 我怎樣做規則表達式搜索和大小寫無關搜索?
操作符 ~ 處理規則表達式匹配,而 ~* 處理大小寫無關的規則表達式匹配。LIKE 操作符裡面沒有大小寫無關的用法,不過你可以通過下面的用法獲得大小寫無關的 LIKE:
WHERE lower(textfield) LIKE lower(pattern)
4.14) 在一個查詢裡,我怎樣檢測一個字段是否為 NULL?
你用 IS NULL 和 IS NOT NULL 測試這個字段。
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
在查看系統表和在一些錯誤信息裡你將看到內部名稱。
上面最四種類型是"varlena"(變長)類型(也就是說,開頭的四個字節是長度,面跟著數據)。char(#) 分配最多個數字節,不管在數據域裡面有多少數據。 text,varchar(#),和 bytea 都在磁盤上有變長的長度,因此,使用它們有一點點的性能損失。準確地說,性能損失發生在第一個這種類型的字段對所有其他字段的訪問的時候。
4.16.1) 我怎樣創建一個序列號/自動遞增的字段?
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 UNIQUE INDEX person_id_key ON person ( id );
參考 create_sequence 手冊頁獲取關序列的更多信息。你還可以用每行的 oid 字段作為一個唯一值。不過,如果你需要傾倒和重載數據庫,你需要使用 pg_dump 的 -o 選項或者 COPY WITH OIDS 選項以保留 oid。
更多信息,參閱 Bruce Momjian 的 行計數 章節。
4.16.2) 我如何獲得一個插入生成的序列號( SERIAL )的值?
可能實現這個要求的最簡單的方法是:在插入之前先用函數 nextval() 從序列對象裡檢索出下一個 SERIAL 值,然再顯式插入。利用 4.16.1 裡的例子表,這樣做看起來象下面這樣:
$newSerialID = nextval('person_id_seq');
INSERT INTO person (id, name) VALUES ($newSerialID, 'Blaise Pascal');
你還能獲得存儲在 $newSerialID 裡面的新值,可以用其他查詢(例如,作為 person 表的外鍵)。要注意自動創建的 SEQUENCE 對象的名稱將會是命名為 __seq,這裡 table 和 serialcolumn 分別是你的表的名稱和你的 SERIAL 字段的名稱。
類似的,在 SERIAL 對象缺省插入你可以用函數 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() 會導致一個與其他並行端進程之間的一個競爭條件嗎?
不會。這個問題由端處理。
4.17) 什是 oid?什是 tid?
Oid 是 PostgreSQL 的唯一行標識。PostgreSQL 裡創建的每一行都獲得一個唯一的 oid。所有在 initdb 過程中創建的 oid 都小 16384 (來自 backend/access/transam.h)。所有用戶創建的 oid 都大或等這個值。缺省時,所有這些 oid 不僅在一個表,一個數據庫裡面唯一,而且在整個 PostgreSQL 安裝裡也是唯一的。
PostgreSQL 在它的內部系統表裡使用 oid 在表之間聯接行。這些 oid 可以用標識特定的用戶行以及用在聯合裡。我們建議你使用字段類型 oid 存儲 oid 值。參閱 sql(l) 手冊頁查找其他內部字段。你可以在 oid 字段上創建一個索引以獲取快速訪問。
Oid 從被所有數據庫使用的某個區域裡賦值給所有新行。如果你想把 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 用標識帶著數據塊和偏移量值的特定的物理行。Tid 在每行的更改或者重載被改變。它們被索引記錄用指引物理行。
4.18) 裡 PostgreSQL 使用的一些術語的含義是什?
一些源代碼和一些舊一點的文檔使用一些有更常用用法的術語。下面是其中一部分:
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) 為什我收到錯誤 "FATAL: palloc failure: memory exhausted?"
這很可能是你系統的虛擬內存用光了,或者你的內核對這樣的資源有較底的限制值。在啟動 postmaster 之前試試下面的命令:
ulimit -d 65536
limit datasize 64m
取決你用的 shell,上面命令只有一條能成功,但是它將把你的進程數據段設置得比較高,因而也許能讓查詢能夠運行完成。這條命令應用當前進程,以及所有在這條命令運行創建的子進程。如果你碰到了因為端運行返回了太多數據的客戶端 SQL 的問題,試著先運行這些命令再運行客戶端。
4.20) 我如何才能知道我運行的 PostgreSQL 的版本?
從 psql 裡,鍵入 select version();
4.21) 為什我的大對象操作收到invalid large obj descriptor(非法大對象描述符)。?
你需要在任何操作大對象的周圍放上 BEGIN WORK 和 COMMIT,也就是說,包圍 lo_open ... lo_close。
目前 PostgreSQL 強制這樣的規則:在事務提交時關閉大對象句柄,這樣,如果你沒有處一個事務裡面,就會是緊跟在一個 lo_open 命令完成的面。所以對這個句柄做任何事情的企圖都會導致一個 invalid large obj descriptor。所以,如果你沒有使用一個事務,以前能工作的代碼(至少是大多數時間)將會生成這一個錯誤信息。
如果你使用客戶端接口,如 ODBC,你可能需要 set auto-commit off。
4.22) 我如何創建一個缺省值是當前時間的字段?
下面的方法總可以工作:
CREATE TABLE test (x int, modtime timestamp default now() );
在版本 7.0 或更新,你可以使用:
create table test (x int, modtime timestamp default 'now');
4.23) 為什我的使用 IN 的子查詢這慢?
目前,我們通過為外層查詢的每一行順序掃描子查詢的結果來聯合子查詢和外層查詢。可以用 EXISTS 替換 IN 來繞開這個限制。例如,把:
SELECT *
FROM tab
WHERE col1 IN (SELECT col2 FROM TAB2)
改為:
SELECT *
FROM tab
WHERE EXISTS (SELECT col2 FROM TAB2 WHERE col1 = col2)
我們希望在未來的版本裡修補這個限制。
--------------------------------------------------------------------------------
擴展 PostgreSQL
5.1) 我寫了一個用戶定義函數。當我在psql 裡運行它時,為什會導致內核傾倒?
問題可能出在很多方面。首先試著在一個獨立的測試程序裡面測試你的用戶定義函數。
5.2) 消息:NOTICE:PortalHeapMemoryFree: 0x402251d0 not in alloc set! 是什意思?
你正用 pfree 釋放一些不是 palloc 分配的東西。不要混用 malloc/free 和 palloc/pfree。
5.3) 我如何能給 PostgreSQL 貢獻一些挺不錯的新類型和函數?
把你的擴展發送到 pgsql-hackers 郵件列表,它們最終會放到 contrib/ 子目錄裡面。
5.4) 我怎樣寫一個返回一條記錄的 C 函數?
解決這個問題需要很高的技巧,作者本人從來沒有試過,盡管理論上是可能的。
5.5) 我修改了源代碼。為什重新編譯沒有看到改變?
Makefiles 對包含文件沒有正確的依賴性規則。你必須做一次 make clean 然是另一次 make。你必須做一次 make clean 然做另一次 make。
(http://www.fanqiang.com)
進入【UNIX論壇】
|
| 相關文章 |
|
===閩=== |
|
|
 |
★ 樊強制作 歡迎分享 ★ |
|