GB | BIG5
|
| 首頁 > 數據庫 > 其它 > 正文 |
 |
| PostgreSQL7.0手冊-用戶手冊-7. 索引和鍵字 |
| 編譯:何偉平 laser@zhengmai.com.cn (2001-04-21 21:25:54) |
第七章. 索引和鍵字
鍵字
部分索引
索引主要用來提高數據庫性能。它們應該定義在那些常用做重復查詢的資格條件的表的列(或者表的字段)上。對索引的不當使用會導致性能的下降,因為更新和插入時間在索引出現時都增加了。
索引還可以用強制表的主鍵的唯一性。當定義一個索引為 UNIQUE,那將不允許多行具有相同的索引字段。這裡的目的是保証數據完整性,而不是改善性能,因此上面的關不當使用的話並不適用。
可以定義兩種類型的索引:
對值索引(value index),索引的鍵字域聲明為字段名;如果索引訪問模式支持多字段索引,可以聲明多個字段。
對 函數索引(functional index),它是定義在一個函數的結果上的,這個用戶定義函數對某一個表的一個或多個字段進行操作。這是一個單字段索引(也就是說,函數結果),即使該函數使用多一個輸入字段。函數索引可以用獲得對那些基操作符的數據的快速訪問,這些數據通常需要做一些轉換,轉換成基本數據類型來使用。
Postgres 為從索引提供 btree,rtree 和 hash(散列)訪問模式。btree 訪問模式是一個 Lehman-Yao 高並發 btrees 的實現。rtree 訪問模式用 Guttman 的二分算法實現了標準的 rtrees。hash(散列)訪問模式是 Litwin 的線性散列的一個實現。我們單獨的列出這些所用的算法是要表明所有這些訪問模式都是完全動態的並且不必進行周期性的優化(例如,象靜態散列算法常見的那樣)。
當一個索引了的字段涉及到使用: <,<=,=,>=,> 之一進行比較時, Postgres 的查詢優化器將考慮在掃描中使用 btree 索引。
當一個索引了的字段涉及到使用: <<,&<,&>,>>,@,~=,&& 之一進行比較時,Postgres 的查詢優化器將考慮在掃描中使用 rtree 索引。
當一個索引了的字段涉及到使用 = 進行比較時,Postgres 的查詢優化器將考慮在掃描中使用散列(hash)索引。
目前,只有 btree 訪問模式支持多字段索引。缺省最多可以聲明 16 的關鍵字(這個限制可以在制作 Postgres 時改變)。
可以為某個索引的每個字段聲明一個操作符表(operator class)。這個操作符表標識該索引用該字段要使用的操作符。例如,一個在4字節整數上的 btree 索引將使用 int4_ops 表;這個操作符表包括用4字節整數的比較函數。實際上,該字段類型的缺省操作符通常就足夠了。擁有操作符表的原因是:對某些數據類型,可能存在多一個有意義的順序。例如,我們可能想排序兩個復數,既可能通過絕對值,也可能通過實數部分。我們可以通過為該數據類型定義兩個操作符表,然在建立索引時選擇合適的一個來實現這個目的。同樣還有一些有特殊用途的操作符表:
操作符表 box_ops 和 bigbox_ops 都支持對 box 數據類型的 rtree 索引。兩者的區別是 bigbox_ops 把方形的坐標按比例縮小,以避免在對非常大的浮點數坐標做乘法,加法和減法時出現浮點例外。如果你的方形所在的范圍的大小是 20,000 單位的平面或更大,你應該用 bigbox_ops。
int24_ops 操作符表在為 int2 類型的數據構建索引並且與查詢資格條件裡的 int4 數據做比較時很有用。類似的,int42_ops 支持對要和查詢裡的 int2 數據做比較的 int4 數據進行索引。
下面的查詢顯示所有定義了的操作符表:
SELECT am.amname AS acc_name,
opc.opcname AS ops_name,
opr.oprname AS ops_comp
FROM pg_am am, pg_amop amop,
pg_opclass opc, pg_operator opr
WHERE amop.amopid = am.oid AND
amop.amopclaid = opc.oid AND
amop.amopopr = opr.oid
ORDER BY acc_name, ops_name, ops_comp
使用 DROP INDEX 刪除一個索引。
關鍵字
作者:由 Herouth Maoz 寫作。這些最早出現在 1998-03-02 用戶郵件列表裡關"主鍵(PRIMARY KEY)和唯一約束(UNIQUE constraints)有什異同"問題的解答.
Subject: Re: [QUESTIONS] PRIMARY KEY | UNIQUE
What's the difference between:(下面兩者有何區別?)
PRIMARY KEY(fields,...) and
UNIQUE (fields,...)
- Is this an alias?(這是別名嗎?)
- If PRIMARY KEY is already unique, then why(如果 PRIMARY KEY 已經唯一,)
is there another kind of key named UNIQUE?(那為什有另外一個名為 UNIQUE 類型的鍵字?)
主鍵是用標識某特定行的字段.例如,身份証(社會安全號)標識一個人.
一個簡單的由字段組成的 UNIQUE 與行標識毫無關系.它只是一個完整性約束.例如,我收集了一些互聯網鏈接.每一個互聯網鏈接用一個唯一的數字標識,也就是主鍵,這個鍵用表中。
但是,我的應用要求每套集合還要有一個唯一的名稱.因為這樣做的話一個想更改一個互聯網鏈接集合的"人"就可以找出該集合.畢竟,如果你有兩個集合都叫"生命科學",一個被標識成24433,另一個是29882,而24433那個是你要找的,這樣找要比從擁有唯一集合名稱的組中找難得多.
所以,用戶用名稱來選擇集合.因此,對這個數據庫我們確信名稱是唯一的.但是數據庫中沒有其他表與鏈接集合表通過鏈接集合名稱相關.因此這樣做很效率很底.
另外,盡管是唯一的,組名稱實際上並不定義集合!例如,如果某人決定將集合名從"生命科學"改為"生物學",該集合仍然是同一集合,只是名字不同而已.只要名稱仍然是唯一的即可.
所以:
主鍵:
用標識某行而且與之相關.
是不可能(或很難)更新.
不應該允許空(NULL).
唯一域/字段:
用作為訪問某行的可選手段.
只要唯一就可以更新.
可以為空(NULLs).
那為什標準 SQL 語法裡沒有非唯一鍵的顯式定義呢?這是因為索引是與具體實現相關的.SQL 不定義實現,只定義數據庫內數據間的關系, Postgres的確允許非唯一索引,但是用增強 SQL 鍵字的索引總是唯一的.
因此,你可以通過任何表中的列的組合來查詢該表,不管你是否在這些列上建立了索引.索引只是每個 RDBMS 的實現提供給你的一個工具,以便令常用的查詢可以更有效的進行.有些 RDBMS 可能會給你另外一些工具,例如在主存裡保留一個鍵值.它們有一些特殊的命令,例如
CREATE MEMSTORE ON
|
 |
★ 樊強制作 歡迎分享 ★ |
|