GBase 8c
其他
文章

GBase 8c 部分索引-建立一个部分唯一索引

发表于2023-12-06 14:45:1644次浏览3个评论

部分索引用途之一:并不要求索引被用于查询。其思想是在一个表的子集上创建一个唯一索引,如下例所示。这对那些满足索引谓词的行强制了唯一性,而对那些不满足的行则没有影响。

假设我们有一个描述测试结果的表。我们希望保证其中对于一个给定的主题和目标组合只有一个“成功”项,但其中可能会有任意多个“不成功”项。实现它的方式是:

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会对索引使用做出合理的选择(例如,它会在检索公值时避开索引,这样前面的例子只能节约索引尺寸,它并非是避免索引使用所必需的),非常不正确的规划选择则需要作为故障报告。

评论

登录后才可以发表评论
崔哥发表于 9个月前
人生贵相知,何用金与钱
崔哥发表于 7个月前
秦帝防胡虏,关心倍可嗟。一人如有德,四海尽为家。往事乾坤在,荒基草木遮。至今徒者骨,犹自哭风沙。
用户头像
levvel发表于 1个月前
嗯,只能说不错!