【问题标题】:How does index on function make query faster?函数索引如何使查询更快?
【发布时间】:2016-05-17 15:27:33
【问题描述】:

我试图在POSTGRESQL 中加快查询速度。有一个item 表,其中包含pricevat 列。我想选择价格包含增值税的商品,比如说,x

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

EXPLAIN 退回了一些费用 - 大约 8000。

为了让它更快,我创建了一个函数 price_vat(price,vat),它计算相同的东西 (price*(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%)。

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

【问题讨论】:

    标签: sql database postgresql indexing


    【解决方案1】:

    当您在表达式上创建索引时,Postgres 需要为所有行“具体化”该表达式。也就是说,表达式是针对行计算的。

    关系数据库的神奇之处在于,即使数据更新,数据也能保持准确。更新一行需要重新计算表达式并调整索引。

    这就是为什么表达式(或其他数据库中的计算列)上的索引比其他索引更复杂的原因。但是,它们使用相同的构建块,并且单列上的索引也经常需要针对更新进行调整。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-25
      • 2013-06-25
      • 2015-10-22
      • 1970-01-01
      • 1970-01-01
      • 2015-10-29
      • 1970-01-01
      • 2013-08-19
      相关资源
      最近更新 更多