2016-05-17 64 views
0

我試圖讓我的查詢更快在POSTGRESQL。有一個item表,其中列pricevat。我想選擇價格高於的商品,比如說,x函數索引如何使查詢更快?

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

EXPLAIN返回一定的成本 - 約8000

爲了使其更快,我創建了一個功能price_vat(價格,增值稅),該計算同樣的事情(價格×(1+增值稅/ 100.0 ))。當我用price_vat(price,vat)代替(price*(1+VAT/100.0))時,執行成本略有提高(約9000)。

所以我創建了一個INDEX

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

現在,當我運行查詢EXPLAIN SELECT * FROM item WHERE price_vat(price,vat)>x返回成本要低得多(原來的約66%)。

它計算所有行上的函數並將它們存儲在某處?如果是的話,如果我在某些記錄中更改VAT,該怎麼辦?我必須創建一個觸發器,它每次創建INDEXVATPRICE被更改?

回答

1

當您在表達式上創建索引時,Postgres需要「實現」所有行的表達式。也就是說,表達式是爲行計算的。

關係數據庫的神奇之處在於即使數據更新時數據仍然準確無誤。一行中的更新需要重新計算表達式並調整索引。

這就是爲什麼表達式(或其他數據庫中的計算列)的索引比其他索引稍微複雜一些。但是,它們使用相同的構建塊,單列上的索引也經常需要針對更新進行調整。