| PostgreSQL 8.0.0 中文文件(轉譯自 PostgreSQL 中國 製作的簡體中文版本) | ||||
|---|---|---|---|---|
| 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 命令的語法通常要求在索引資料表達式周圍書寫圓括弧, 就像我們在第二個例子裡顯示的那樣。如果資料表達式只是一個函數調用,那麼可以省略, 就像我們在第一個例子裡顯示的那樣。
從維護角度來看,索引資料表達式相對費勁一些,因為在插入資料行或者更新資料行的時候, 都必須為每一行計算生成的資料表達式。因此,只有在查詢使用該索引非常頻繁的時候才使用資料表達式索引。