2015-05-28 30 views
3

我在postgres數據庫上工作,我將使用關係表和jsonb表(可以對其進行索引)的組合。PostgreSQL上的CTE和臨時索引

我已經被使用了很多CTE查詢的插入或更新數據從臨時表中選擇,如:

WITH information as (
    select fieldA, fieldB, fieldC from tableA 
) 
insert (fieldA, fieldB, fieldC) 
SELECT inf.fieldA, inf.fieldB, inf.fieldC 
from information inf 

嗯,我想知道是否有可能在這種創建臨時索引表,如果是,是否有可能在jsonb類型fieds中創建索引? (考慮到這個臨時表)

回答

7

很確定沒有辦法在CTE上創建索引,因爲它基本上只是一個子查詢,而不是表 - 它不會保存在任何地方的內存中,只是滾動到查詢計劃中需要。

但是,您可以改爲Create Temp Table information As,然後對其進行索引,只需對查詢進行很少的更改。

您也可以索引物化視圖,但是如果您有下面的臨時數據,只需創建另一個臨時表可能最有意義。

+0

我會尋找如何使用這個,非常感謝! –

+3

不幸的是,PostgreSQL目前暫時無法索引CTE條款。其他數據庫產品可以這樣做,這可能是一個巨大的性能勝利。沒有根本的原因,我們不能這樣做,但是在PostgreSQL中它會很複雜和具有侵入性,因爲規劃器是統計和目錄驅動的;我們必須創建「可能的索引」路徑,然後創建按需生成實際索引的計劃節點。 –

+0

@CraigRinger Huh,我認爲在任何CTE的實現中都沒有任何意義。原來我的回答只是偶然的! – IMSoP

2

否在查詢過程中,您無法在查詢的某些部分上創建索引。

CTE(公用表表達式),也稱爲子查詢因子分解。該概念允許優化器爲複雜查詢生成執行計劃,同時允許它通過將其置於臨時空間而不是重新執行相同步驟來減少子查詢的重複。將它放在單個查詢中會生成一個大的步驟列表,這些步驟全部作爲常規查詢執行,而不是作爲過程執行。它可以用作視圖並在內存中存儲執行計劃。
不允許索引的部分選擇是需要調用索引,然後必須重新優化主查詢或更糟糕的是,執行計劃必須留出空間來猜測哪一步執行。 由於我們已經有了可以編制索引的臨時表,我相信它可以保持乾淨,以便將此索引活動保留在執行計劃之外。構建一個臨時表,對其進行索引,然後當您運行查詢時,它將擁有新近優化的執行計劃。此外,臨時表可以在您的過程期間持續存在,在查詢完成後刪除臨時數據。

但是你仍然可以在CTE中使用臨時表,所以它不是全部或沒有。