我试图在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%)。
它是否计算所有行的函数并将它们存储在某个地方?如果是,如果我在某些记录中更改增值税怎么办?我是否必须创建一个触发器,每次INDEX
或VAT
更改时创建PRICE
?
答案 0 :(得分:1)
当您在表达式上创建索引时,Postgres需要“实现”所有行的表达式。也就是说,计算行的表达式。
关系数据库的神奇之处在于,即使数据更新,数据仍然准确无误。行的更新需要重新计算表达式并调整索引。
这就是表达式(或其他数据库中的计算列)的索引比其他索引更复杂的原因。但是,它们使用相同的构建块,并且通常还必须调整单列上的索引以进行更新。