2013-02-19 32 views
2

比方說,我有一個表foo:,享有業績的影響和指數

CREATE TABLE FOO (
    FOO_ID INTEGER, 
    STATUS INTEGER, 
    RATING INTEGER, 
    PRIMARY KEY ("FOO_ID") 
) 

其中狀態可以是0到5之間,並且表充滿了行。

讓我們那麼說我創建的狀況的指標,另外在評價:

CREATE INDEX ON FOO (STATUS); 
CREATE INDEX ON FOO (RATING); 

現在,假設我有一個觀點:

CREATE VIEW FOO_THREE_VIEW AS 
    SELECT * 
    FROM FOO 
    WHERE STATUS = 3; 

我想在FOO記錄即:STATUS = 3RATING = 5。下面的查詢會給我的結果我想:

SELECT * FROM FOO WHERE STATUS = 3 AND RATING = 5; 

但是,下面的查詢也會給我我想要的結果:

SELECT * FROM FOO_THREE_VIEW WHERE RATING = 5; 

兩個查詢,是否有性能差異? 第一個查詢是否受益於這兩個索引?第二個查詢是否受益於這兩個索引?我無法在視圖上創建索引來幫助改善性能,對嗎?如果在兩列上都有索引,如CREATE INDEX ON FOO (STATUS, RATING)而不是兩個單獨的索引,那麼兩者的性能如何變化?

我明白這個問題可以是一個通用的SQL問題,但是當需要規範時,我想知道它在PostgreSQL中的具體工作方式。

回答

3

不會有表現(在這種情況下也執行)區別。將使用哪個索引取決於數據和統計信息,只需使用EXPLAIN來檢查數據庫首選哪個索引。在所描述的情況下,2列的索引將是最合適的。

您不能在視圖上創建索引,因爲PostgreSQL將視圖作爲普通的SQL語句對待和存儲。在內部對查看執行查詢時,查詢在計劃開始前會被重寫和轉換。您可以閱讀更多關於PostgreSQL如何處理您的請求in the docs。這將改變爲Materialized Views,目前正在積極開發。

此外,您總是可以使用EXPLAIN ANALYZE來檢查如何這個或那個查詢將被處理,並比較有和沒有涉及視圖的情況下的執行計劃。