2016-12-16 110 views
2

我想創建一個臨時表,以便能夠將它加入到幾個表中,因爲將這些表與建議的臨時表的內容連接需要很多時間(獲取臨時表的內容非常耗時。反覆重複需要越來越多的時間)。當我的需求完成時,我正在放下臨時桌子。 我想知道這些臨時表是否會在其他客戶端會話中可見(我的要求是僅使它們對當前客戶端會話可見)。我正在使用postgresql。如果你能提出更好的解決方案,我想這很好。postgresql中的臨時表是否在所有客戶端會話中都可見?

+1

你有兩個很好的答案,但也要記住,在postgresql中臨時表是非常非常少用的。總是有更好的方法 – e4c5

+0

您能否提出建議我可以採取哪些其他方法?我嘗試使用CTE,但CTE中的數據沒有存儲,因此它們不會提高性能(在某些情況下,就像我的一樣,它們可以表現惡化)。 –

+0

如果您遇到性能問題,請閱讀[postgresql-performance](http://stackoverflow.com/tags/postgresql-performance/info),然後提出一個新問題,其中包含標記info –

回答

0

請認真閱讀the documentation

臨時表只在當前會話中可見,並在數據庫會話結束時自動刪除。

如果您指定ON COMMIT,臨時表將在當前事務結束時自動刪除。

如果您需要在臨時表上使用良好的表統計信息,則必須顯式調用ANALYZE,因爲這些統計信息不會自動收集。

+0

感謝您的反應Launrenz.Actually我很困惑,這些會議真的指的是什麼。這些數據庫會話或客戶端會話是否因爲數據庫會話可以跨越多個客戶端會話,並且如果該表對於每個客戶端(而不是數據庫客戶端)的整個數據庫會話都是可見的,那麼這對我來說並不好。 –

+0

這是一個數據庫會話。如果您使用某種連接池,則必須在完成後顯式刪除臨時表,或者在單個事務中完成您的工作,並在臨時表中使用「ON COMMIT」。 –

2

PostgreSQL然後是你的數據庫。臨時表比標準做得更好。來自the docs

儘管CREATE TEMPORARY TABLE的語法類似於SQL標準的語法,但效果並不相同。在標準中,臨時表只定義一次,並在需要它們的每個會話中自動存在(以空內容開始)。 PostgreSQL改爲要求每個會話爲要使用的每個臨時表發出自己的CREATE TEMPORARY TABLE命令。這允許不同的會話使用相同的臨時表名稱用於不同的目的,而標準的方法限制給定的臨時表名稱的所有實例具有相同的表結構。

+0

感謝Evan的迴應。實際上,我對這些會話真正引用的內容感到困惑。自從數據庫會話可以跨越多個客戶端會話並且如果該表對於每個客戶端的整個數據庫會話都是可見的,那麼這些數據庫會話或客戶端會話不是數據庫客戶端),它對我來說並不好。 –

+1

沒有客戶端會話的概念。只有數據庫會話。如果*你的客戶端正在建立連接,這* *實際上可能會成爲問題。這是你考慮的事情。數據庫無法查看* your *客戶端會話的概念。 –

相關問題