2011-08-17 168 views
1

我經常使用臨時表來簡化數據加載(更簡單的調試,更簡潔的選擇語句等)。如果性能要求,我會創建一個物理表等。SQL Server臨時表的性能開銷

我最近注意到,我自動將臨時表聲明爲全局(## temp_load),而不是本地(#temp_table)。我不知道爲什麼,但這是我多年來的習慣。我從來沒有需要表是全球性的,但我很好奇,如果有創造他們作爲全球性的額外開銷。我應該努力改變我的習慣。

是否有額外的風險使其成爲全球?

回答

2

非全局臨時表幾乎保證永遠不會發生碰撞。

全局臨時表與物化表類似,因爲每個服務器的名稱必須是唯一的。

通常,只有在必要時才使用##GLOBAL_TEMP表。

否則,如果你正在寫,可能我跑一次同時多一個進程,該特效將與不可預知的方式互相作用,使得它極難解決 - Instance 1可以改變的數據被用於由Instance 2導致Instance 3也會產生不正確的結果。

我對臨時表的個人的看法是,當我只使用它們:

  • 我有一箇中型到大型的結果集(超過100萬行)
  • 我需要索引的ResultSet
  • 我不需要用每一次的過程中反覆比結果集更
  • 我相信我不會需要恢復過程中的任何一點

我強調了最後一顆子彈,因爲這是主要的原因,我儘量減少臨時表的使用:

如果你有一個長期運行的進程,並使用臨時表來存儲中間數據集,以及什麼東西死說90%的方式,你必須完全重新啓動如果該數據大部分時間不在物化表中。

我的一些進程在數十億行數據上運行了幾天,所以我對從頭開始重新啓動並不感興趣。

+0

有一些真棒點。碰撞問題在我寫作我的問題時發生。謝謝! –

+1

我實際上還沒有爲全局##臨時表找到一個很好的用例。這是一個修辭問題,但爲什麼不創建一個永久表,然後放下它?如果有任何事情死亡,您將獲得相同的併發限制而不會丟失表。我想,你可能會爭辯說這是好還是壞,就像你可以說槍傷比弩傷更好或更差一樣。 –

+0

我認爲物理表有額外的開銷(日誌記錄,緩存)與臨時表。這是錯誤的嗎?我通常爲小型(ish)數據集使用臨時表。我主要是數據倉庫(每天900萬條事實記錄)以及我的源代碼陰影和分期都是物理的。我通常使用臨時表進行一些簡單的查找並支持連接。 –