麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 數據庫 > PostgreSQL > 正文

PostgreSQL 常見問題(FAQ)

2019-09-08 23:32:57
字體:
來源:轉載
供稿:網友
最近更新:2000 年 三月二十一日 星期二 16:09:11 EST

目前維護人員:Bruce Momjian ([email protected])
中文版維護人員:何偉平 ([email protected]


本文檔的最新版本可以在 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 ([email protected])。(如何加入參閱下文)。這個隊伍現在負責 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 提供任何官方支持。它是通過志愿者的行動維護的。

主要的郵件列表是:[email protected]。可以在那里討論有關 PostgreSQL 的問題。要加入列表,發一封郵件內容(不是主題行)為

subscribe
end

的郵件到 [email protected]

還可以獲取摘要列表。要加入這個列表,發郵件到:[email protected],其內容為:

subscribe
end

每當主列表達到大約 30k 的消息內容時,摘要就發送給這個列表的成員。

還可以參加臭蟲郵件列表。要加入這個列表,發送一個郵件到 [email protected],內容為:

subscribe
end

還可以參加開發人員郵件列表。要加入這個列表,發送一個郵件到 [email protected],內容為:

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"(臭蟲模板)文件然后發送到:[email protected]

同樣也要看看我們的 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 (自由軟件)的版本可以得到。請詢問 [email protected]

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。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 毛片视频网站 | 欧美aaaaaaaa | 毛片大全在线观看 | 日本中文字幕电影在线观看 | 国产精品久久久久久久久久 | 国产激情精品一区二区三区 | 久久久aa | 高清成人在线 | 国产99久久久国产精品下药 | 久久国产中文 | 色阁五月 | 一级网站| 黑人一区二区三区四区五区 | 国产精品视频自拍 | 日韩精品hd | 99久久精品免费 | 亚洲午夜免费电影 | 国产一区在线观看视频 | 国内精品久久久久久影视8 嫩草影院在线观看网站成人 | 91精品国产91久久久久久蜜臀 | 国产成人精品免费视频大全办公室 | 免费在线观看国产 | 久久久久夜色精品国产老牛91 | 神马视频我不卡 | 男人的天堂色偷偷 | 中文字幕欧美亚洲 | 青青操精品 | 特级黄色影院 | 国产精品999在线观看 | 久久精品久久精品久久精品 | 国产精品麻豆一区二区三区 | 国产流白浆高潮在线观看 | 国产精品久久久久影院老司 | 欧美性生交zzzzzxxxxx | 国产精品自拍啪啪 | 爱性久久久久久久 | 精品一区二区在线播放 | 国产成人高清在线 | 免费久久精品 | 久久艹综合 | 一级电影免费在线观看 |