2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 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',因此搜尋速度等同於任何其他簡單的索引查詢。因此,當檢索速度比插入和更新速度更重要時,表示式上的索引非常有用。

提交更正

如果您在文件中看到任何不正確、不符合您對特定功能的使用經驗或需要進一步澄清的內容,請使用 此表單 報告文件問題。