| PostgreSQL 7.4 文檔 | ||||
|---|---|---|---|---|
| Prev | Fast Backward | Chapter 11. 索引 | Fast Forward | Next |
索引字段並非一定要是一個下層表的字段,而可以是一個函數或者從表中一個或多個字段計算出來的標量表達式。 這個特性對于快速訪問那些基于計算結果的表非常有用。
比如,做大小寫無關比較的常用方法是使用函數 lower︰
SELECT * FROM test1 WHERE lower(col1) = 'value';
如果我們在 lower(col1) 操作的結果上定義索引, 那麼這個查詢就可以使用索引︰
CREATE INDEX test1_lower_col1_idx ON test1 (lower(col1));
如果我們要把這個索引聲明為 UNIQUE,那麼它會禁止創建那種 col1 數值只是大小寫有區別的數據行, 以及 col1 數值完全相同的數據行。因此,在表達式上的索引可以用于強制那些無法定義為簡單唯一約束的約束。
另外一個例子是,如果我們經常使用下面這樣的查詢:
SELECT * FROM people WHERE (first_name || ' ' || last_name) = 'John Smith';
那麼我們就值得創建下面這樣的索引:
CREATE INDEX people_names ON people ((first_name || ' ' || last_name));
CREATE INDEX 命令的語法通常要求在索引表達式週圍書寫圓括弧, 就像我們在第二個例子裡顯示的那樣。如果表達式只是一個函數調用,那麼可以省略, 就像我們在第一個例子裡顯示的那樣。
從維護角度來看,索引表達式相對費勁一些,因為在插入數據行或者更新數據行的時候, 都必須為每一行計算生成的表達式。因此,只有在查詢使用該索引非常頻繁的時候才使用表達式索引。