| 導購 | 订阅 | 在线投稿
分享
 
 
 

PostgreSQL常見問題(FAQ)

來源:互聯網網民  2008-05-18 21:58:28  評論

最近更新: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。

 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
  最近更新: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。
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 
 熱帖排行
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有