2013-10-25 36 views
0

DATABASE

我有一個規範化的Postgres 9.1數據庫,並在其中寫了一些函數。其中一個函數"fn_SuperQuery"(param,param, ...)"返回SET OF RECORD,應該被認爲是一個視圖(接受參數)。這個函數有很多開銷,因爲它實際上創建了幾個臨時表,同時計算它自己的結果以獲得大數據集的性能。從PHP/AJAX訪問PostgreSQL 9.1臨時表

附註中,我曾經使用WITH(cte's)專門用於此查詢,但我需要能夠在某些列上添加索引以獲得更高效的聯接。

PHP

我使用PHP嚴格連接到數據庫,運行查詢,並將結果作爲JSON返回。每個查詢都以連接字符串開始,然後通過致電pg_close完成。

FRONTEND

我使用jQuery的.ajax函數來調用PHP文件,並接受結果。


我的問題是這樣的:

"fn_SuperQuery"(param,param, ...)"實際上是對其他幾個查詢的基礎。此應用程序的某些部分需要一次運行多個查詢,以便爲最終用戶生成所有必要的信息。許多這些查詢依靠"fn_SuperQuery"(param,param, ...)"輸出在運行此查詢的開銷實在是太高了,而事實上,如果有相同的參數,將返回相同的數據讓我覺得,這是愚蠢的,使用戶等待它運行兩次。

我想要做的是將"fn_SuperQuery"(param,param, ...)"的結果返回到臨時表中,然後運行其他需要其數據的查詢,然後放棄臨時表。

我明白PostgreSQL ... requires each session to issue its own CREATE TEMPORARY TABLE command for each temporary table to be used.如果我能得到兩個PHP文件連接到同一個數據庫會話,然後他們都應該能夠看到臨時表。

如何做到這一點任何想法? ......或者也許我還沒有考慮一種不同的方法?

回答

1

可以更好地將使用正常的表?這不會有太大的區別。您可以使用unlogged表格加快速度。

在9.3可能更好的選擇是使用物化視圖。

+0

把它放在一個「正常」表中將是反規範化,而不是一個選項。我會研究物化視圖;然而,我暫時只限於9.1。 – losthorse

+0

我的意思是創建新表,使用它,放下它。像臨時表。 – alexius

0

臨時表是會話私有。如果您想要在不同的會話中共享,請使用普通表(可能未記錄)。

如果您擔心非規範化,我首先要考慮的是將這些臨時正常表格存儲在一個單獨的模式中。這使您可以將非規格化(和工作集數據)分開以進行分析等,並避免使用非規格化表格污染剩餘的數據集。

或者你可以看看短的非規範化的其他手段。例如,如果數據在一段時間後不會更改,則可以定期爲不可更改的數據定期輸入彙總條目。這不是一種反規範化,因爲如果您需要在繼續打開某些報告形式的同時停止執行,它允許您清除舊的詳細記錄。