PostgreSQL 的開發(fā)是由一個(gè)互聯(lián)網(wǎng)相聯(lián)的開發(fā)人員隊(duì)伍進(jìn)行的,他們都參加 PostgreSQL 開發(fā)郵件列表。目前的協(xié)調(diào)人是 Marc G. Fournier (scrappy@postgreSQL.org)。(如何加入?yún)㈤喯挛模_@個(gè)隊(duì)伍現(xiàn)在負(fù)責(zé) PostgreSQL 所有目前的和未來的開發(fā)。
PostgreSQL 1.01 的作者是 Andrew Yu 和 Jolly Chen。還有許多其他人為移植,測試,調(diào)試和增強(qiáng)代碼做了大量貢獻(xiàn)。PostgreSQL 起源的最初的 Postgres 的代碼,是在加州大學(xué)伯克利分校的 Michael Stonebraker 教授的指導(dǎo)下,由許多研究生,本科生和編程職員完成的。
(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.)
性能 PostgreSQL 在兩種模式下運(yùn)行。通常的 fsync (同步)模式把每個(gè)完成的事務(wù)都沖洗到磁盤上,以保證如果 OS 崩潰了或者在下幾秒鐘出現(xiàn)掉電的情況下,你的所有數(shù)據(jù)都安全地存放在磁盤上。這種模式下,我們比大多數(shù)商用數(shù)據(jù)庫都慢,部分原因是因?yàn)槟切?shù)據(jù)庫缺省狀態(tài)下很少這樣保守地向磁盤沖洗數(shù)據(jù)。在 no-fsync (非同步)模式下,我們一般都比商用數(shù)據(jù)庫快,盡管在這種模式下,一個(gè) OS 的崩潰將導(dǎo)致數(shù)據(jù)損壞。我們正在建設(shè)一種中間模式,這種模式比完全同步(fsync)模式的性能損失小,而且將保證在OS 崩潰情況下的 30 秒內(nèi)的數(shù)據(jù)完整。這種模式可以由數(shù)據(jù)庫管理員選擇。
與 MySQL 或更輕便的數(shù)據(jù)庫系統(tǒng)比較,我們?cè)凇nsert/update 時(shí)慢,因?yàn)槲覀冇蓄~外的事務(wù)處理。當(dāng)然 MySQL 不具有我們?cè)谏厦娴奶匦远卫锝o出的任何特性。我們的主要方向是靈活性和特性,盡管我們通過優(yōu)化和源碼分析不斷地改進(jìn)性能。
我們通過創(chuàng)建一個(gè) Unix 進(jìn)程處理每個(gè)用戶的聯(lián)接。后端進(jìn)程共享數(shù)據(jù)緩沖區(qū)和鎖信息。在多 CPU 的條件下,多個(gè)后端很容易運(yùn)行在不同的 CPU 上。
3.3) 當(dāng)我運(yùn)行 postmaster 時(shí),我收到Bad System Call (系統(tǒng)調(diào)用錯(cuò))或內(nèi)核傾倒。為什么? 這可能是很多方面的問題,但首先應(yīng)該檢查你在內(nèi)核里配置安裝了 system V (系統(tǒng) V)擴(kuò)展。PostgreSQL 需要內(nèi)核支持共享內(nèi)存和信號(hào)燈。
3.13) 我的數(shù)據(jù)庫目錄里面的 pg_tempNNN.NN 文件是什么? 這些是查詢執(zhí)行器生成的臨時(shí)文件。例如,如果需要為滿足 ORDER BY 條件做排序,并且排序需要比后端的 -S 參數(shù)給出的更多的空間,那么就會(huì)創(chuàng)建一個(gè)臨時(shí)文件保存多出來的數(shù)據(jù)。
jolly=> insert into pg_group (groname, grosysid, grolist) jolly=> values ('posthackers', '1234', '{5443, 8261}'); INSERT 548224 jolly=> grant insert on foo to group posthackers; CHANGE jolly=>
pg_group 里的字段是:
groname:組名稱。這是一個(gè)名稱并且應(yīng)該完全由字母和數(shù)字組成。不要包含下劃線和其他標(biāo)點(diǎn)。 grosysid:組 id,這是一個(gè) int4。應(yīng)該在所有組中唯一。 grolist:屬于這個(gè)組的 pg_user id 的列表。這是一個(gè) int4[]。
4.5) 你怎樣從一個(gè)表里面刪除一個(gè)列? 我們不支持 ALTER TABLE DROP COLUMN,但可以這樣做:
SELECT ... -- select all columns but the one you want to remove INTO TABLE new_table FROM old_table; DROP TABLE old_table; ALTER TABLE new_table RENAME TO old_table;
4.11) R-tree 索引是什么? r-tree 索引用于索引空間數(shù)據(jù)。一個(gè)哈希索引無法處理范圍搜索。而 B-tree 索引只能處理一維的范圍搜索。R-tree 索引可以處理多維數(shù)據(jù)。例如,如果可以在一個(gè)類型為 point 的字段上建立一個(gè) R-tree 索引,那么系統(tǒng)在回答類似 select all points within a bounding rectangle (選擇在一個(gè)長方形范圍內(nèi)的所有點(diǎn))這樣的查詢時(shí)有更高的效率。
描述最初的 R-Tree 的設(shè)計(jì)的規(guī)范里面寫到:
Guttman, A. "R-Trees: A Dynamic Index Structure for Spatial Searching." Proc of the 1984 ACM SIGMOD Int'l Conf on Mgmt of Data, 45-57.
你還可以在 Stonebraker 的 "Readings in Database Systems" 找到這篇文章。
4.14) 在一個(gè)查詢里,我怎樣檢測一個(gè)字段是否為 NULL? 你用 IS NULL 和 IS NOT NULL 測試這個(gè)字段。
4.15) 各種字符類型之間有什么不同? Type Internal Name Notes -------------------------------------------------- "char" char 1 character CHAR(#) bpchar blank padded to the specified fixed length VARCHAR(#) varchar size specifies maximum length, no padding TEXT text length limited only by maximum row length BYTEA bytea variable-length array of bytes
4.16.1) 我怎樣創(chuàng)建一個(gè)序列號(hào)/自動(dòng)遞增的字段? PostgreSQL 支持 SERIAL 數(shù)據(jù)類型。它在字段上自動(dòng)創(chuàng)建一個(gè)序列和索引。例如,這樣...
CREATE TABLE person ( id SERIAL, name TEXT );
...會(huì)自動(dòng)轉(zhuǎn)換為這樣...
CREATE SEQUENCE person_id_seq; CREATE TABLE person ( id INT4 NOT NULL DEFAULT nextval('person_id_seq'), name TEXT ); CREATE UNIQUE INDEX person_id_key ON person ( id );
參考 create_sequence 手冊(cè)頁獲取關(guān)于序列的更多信息。你還可以用每行的 oid 字段作為一個(gè)唯一值。不過,如果你需要傾倒和重載數(shù)據(jù)庫,你需要使用 pg_dump 的 -o 選項(xiàng)或者 COPY WITH OIDS 選項(xiàng)以保留 oid。
更多信息,參閱 Bruce Momjian 的 行計(jì)數(shù) 章節(jié)。
4.16.2) 我如何獲得一個(gè)插入后生成的序列號(hào)( SERIAL )的值? 可能實(shí)現(xiàn)這個(gè)要求的最簡單的方法是:在插入之前先用函數(shù) nextval() 從序列對(duì)象里檢索出下一個(gè) SERIAL 值,然后再顯式插入。利用 4.16.1 里的例子表,這樣做看起來象下面這樣:
$newSerialID = nextval('person_id_seq'); INSERT INTO person (id, name) VALUES ($newSerialID, 'Blaise Pascal');
你還能獲得存儲(chǔ)在 $newSerialID 里面的新值,可以用于其他查詢(例如,作為 person 表的外鍵)。要注意自動(dòng)創(chuàng)建的 SEQUENCE 對(duì)象的名稱將會(huì)是命名為
__seq,這里 table 和 serialcolumn 分別是你的表的名稱和你的 SERIAL 字段的名稱。
類似的,在 SERIAL 對(duì)象缺省插入后你可以用函數(shù) currval() 檢索剛賦值的 SERIAL 值,例如,
INSERT INTO person (name) VALUES ('Blaise Pascal'); $newID = currval('person_id_seq');
最后,你可以使用從 INSERT 語句返回的 oid 查找缺省值,盡管這可能是最缺乏移植性的方法。在 perl 里,使用帶有 Edmund Mergl 的 DBD::Pg 模塊的 DBI,oid 值可以通過 $sth->execute() 后的 $sth->{pg_oid_status} 獲得。
4.17) 什么是 oid?什么是 tid? Oid 是 PostgreSQL 的唯一行標(biāo)識(shí)。PostgreSQL 里創(chuàng)建的每一行都獲得一個(gè)唯一的 oid。所有在 initdb 過程中創(chuàng)建的 oid 都小于 16384 (來自 backend/access/transam.h)。所有用戶創(chuàng)建的 oid 都大于或等于這個(gè)值。缺省時(shí),所有這些 oid 不僅在一個(gè)表,一個(gè)數(shù)據(jù)庫里面唯一,而且在整個(gè) PostgreSQL 安裝里也是唯一的。
PostgreSQL 在它的內(nèi)部系統(tǒng)表里使用 oid 在表之間聯(lián)接行。這些 oid 可以用于標(biāo)識(shí)特定的用戶行以及用在聯(lián)合里。我們建議你使用字段類型 oid 存儲(chǔ) oid 值。參閱 sql(l) 手冊(cè)頁查找其他內(nèi)部字段。你可以在 oid 字段上創(chuàng)建一個(gè)索引以獲取快速訪問。
Oid 從被所有數(shù)據(jù)庫使用的某個(gè)區(qū)域里賦值給所有新行。如果你想把 oid 該成別的值,或者你想做一份表的帶著原始 oid 的拷貝,你可以做到:
CREATE TABLE new_table(old_oid oid, mycol int); SELECT INTO new SELECT old_oid, mycol FROM old; COPY new TO '/tmp/pgtable'; DELETE FROM new; COPY new WITH OIDS FROM '/tmp/pgtable';
Tid 用于標(biāo)識(shí)帶著數(shù)據(jù)塊和偏移量值的特定的物理行。Tid 在每行的更改或者重載后被改變。它們被索引記錄用于指引物理行。