部分索引用途之一:并不要求索引被用于查询。其思想是在一个表的子集上创建一个唯一索引,如下例所示。这对那些满足索引谓词的行强制了唯一性,而对那些不满足的行则没有影响。
假设我们有一个描述测试结果的表。我们希望保证其中对于一个给定的主题和目标组合只有一个“成功”项,但其中可能会有任意多个“不成功”项。实现它的方式是:
CREATE TABLE tests (
subject text,
target text,
success boolean,
...
);
CREATE UNIQUE INDEX tests_success_constraint ON tests (subject, target)
WHERE success;
当有少数成功测试和很多不成功测试时这是一种特别有效的方法。
通过使用部分索引子句只处理空列值,该索引只允许索引列中有一个空值,并且用一个表达式索引子句来索引 true 来替代 null:
CREATE UNIQUE INDEX tests_target_one_null ON tests ((target IS NULL)) WHERE target IS NULL;
同时,部分索引也可以被用来重载系统的查询规划选择。同样,具有特殊分布的数据集可能导致系统在它并不需要索引的时候选择使用索引。在此种情况下可以被建立,这样它将不会被那些无关的查询所用。通常,GBase 8c会对索引使用做出合理的选择(例如,它会在检索公值时避开索引,这样前面的例子只能节约索引尺寸,它并非是避免索引使用所必需的),非常不正确的规划选择则需要作为故障报告。