索引欄位不一定只是底層資料表的一個欄位,它可以是從資料表的一個或多個欄位計算出來的函式或純量表達式。此功能對於根據計算結果快速存取資料表非常有用。
例如,不區分大小寫比較的常見方法是使用 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'
,因此搜尋速度與任何其他簡單索引查詢相當。因此,當檢索速度比插入和更新速度更重要時,表達式索引很有用。
如果您在文件中發現任何不正確、與特定功能的經驗不符或需要進一步澄清的地方,請使用此表單來報告文件問題。