2016-05-17 4 views
0

POSTGRESQLでクエリを高速化しようとしていました。列pricevatを持つitemテーブルがあります。私は価格が含まれているアイテムを選択したいと考えています。関数のインデックスはどのようにクエリを高速化しますか?

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

EXPLAINは、いくつかのコストを返さ - およそ8000

それはより速く作るために、私は同じこと(価格*(1つの+ VAT/100.0を計算する関数のprice_vat(価格、バットを)作成しました))。私が(price*(1+VAT/100.0))price_vat(price,vat)に置き換えたとき、実行コストはわずかに上がった(約9000)。

だから、私は、クエリEXPLAIN SELECT * FROM item WHERE price_vat(price,vat)>xを実行すると、それははるかに低コスト(元の約66%)を返し、今INDEX

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

を作成しました。

すべての行の関数を計算し、どこかに格納しますか?はいの場合、一部のレコードでVATを変更するとどうなりますか? VATまたはPRICEが変更されるたびにINDEXを作成するトリガーを作成する必要がありますか?

答えて

1

式にインデックスを作成すると、Postgresはすべての行の式を「マテリアライズ」する必要があります。つまり、行の式が計算されます。

リレーショナルデータベースの魔法は、データが更新されてもデータが正確であるということです。行を更新するには、式を再計算してインデックスを調整する必要があります。

これは、式のインデックス(または他のデータベースの計算された列)が他のインデックスよりも複雑な理由です。しかし、それらは同じビルディングブロックを使用し、単一列のインデックスも頻繁に更新のために調整する必要があります。

関連する問題