函数索引如何使查询更快?

时间:2016-05-17 15:27:33

标签: sql database postgresql indexing

我试图在POSTGRESQL中更快地查询。有一个item表格,其中包含price列和vat列。我想选择价格包括增值税的物品,比如说x

SELECT * FROM item WHERE (price*(1+VAT/100.0))>x

EXPLAIN返还了一些费用 - 大约8000.

为了加快速度,我创建了一个函数price_vat(price,vat)来计算相同的东西(价格*(1 + VAT / 100.0))。当我将(price*(1+VAT/100.0))替换为price_vat(price,vat)时,执行成本略有提高(约为9000)。

所以我创建了INDEX

CREATE INDEX price_vat_index on item (price_vat(price,vat));

现在,当我运行查询EXPLAIN SELECT * FROM item WHERE price_vat(price,vat)>x时,它返回的成本要低得多(约占原始成本的66%)。

它是否计算所有行的函数并将它们存储在某个地方?如果是,如果我在某些记录中更改增值税怎么办?我是否必须创建一个触发器,每次INDEXVAT更改时创建PRICE

1 个答案:

答案 0 :(得分:1)

当您在表达式上创建索引时,Postgres需要“实现”所有行的表达式。也就是说,计算行的表达式。

关系数据库的神奇之处在于,即使数据更新,数据仍然准确无误。行的更新需要重新计算表达式并调整索引。

这就是表达式(或其他数据库中的计算列)的索引比其他索引更复杂的原因。但是,它们使用相同的构建块,并且通常还必须调整单列上的索引以进行更新。