支援的版本:目前 (17) / 16 / 15 / 14 / 13
開發版本:devel
不支援的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4

11.7. 表達式索引 #

索引欄位不一定只是底層資料表的一個欄位,它可以是從資料表的一個或多個欄位計算出來的函式或純量表達式。此功能對於根據計算結果快速存取資料表非常有用。

例如,不區分大小寫比較的常見方法是使用 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 命令的語法通常要求在索引表達式周圍加上括號,如第二個範例所示。當表達式僅為函式呼叫時,可以省略括號,如第一個範例所示。

維護索引表達式相對昂貴,因為必須為每個列插入和非 HOT 更新計算衍生的表達式。但是,在索引搜尋期間不會重新計算索引表達式,因為它們已儲存在索引中。在上面的兩個範例中,系統將查詢視為 WHERE indexedcolumn = 'constant',因此搜尋速度與任何其他簡單索引查詢相當。因此,當檢索速度比插入和更新速度更重要時,表達式索引很有用。

提交更正

如果您在文件中發現任何不正確、與特定功能的經驗不符或需要進一步澄清的地方,請使用此表單來報告文件問題。