索引列不必只是底層表中的一個列,它也可以是表中一個或多個列計算出的函式或標量表達式。此功能對於基於計算結果快速訪問表非常有用。
例如,執行不區分大小寫比較的常用方法是使用 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'
,因此搜尋速度等同於任何其他簡單的索引查詢。因此,當檢索速度比插入和更新速度更重要時,表示式上的索引非常有用。
如果您在文件中看到任何不正確、不符合您對特定功能的使用經驗或需要進一步澄清的內容,請使用 此表單 報告文件問題。