我經常使用臨時表來簡化數據加載(更簡單的調試,更簡潔的選擇語句等)。如果性能要求,我會創建一個物理表等。SQL Server臨時表的性能開銷
我最近注意到,我自動將臨時表聲明爲全局(## temp_load),而不是本地(#temp_table)。我不知道爲什麼,但這是我多年來的習慣。我從來沒有需要表是全球性的,但我很好奇,如果有創造他們作爲全球性的額外開銷。我應該努力改變我的習慣。
是否有額外的風險使其成爲全球?
我經常使用臨時表來簡化數據加載(更簡單的調試,更簡潔的選擇語句等)。如果性能要求,我會創建一個物理表等。SQL Server臨時表的性能開銷
我最近注意到,我自動將臨時表聲明爲全局(## temp_load),而不是本地(#temp_table)。我不知道爲什麼,但這是我多年來的習慣。我從來沒有需要表是全球性的,但我很好奇,如果有創造他們作爲全球性的額外開銷。我應該努力改變我的習慣。
是否有額外的風險使其成爲全球?
非全局臨時表幾乎保證永遠不會發生碰撞。
全局臨時表與物化表類似,因爲每個服務器的名稱必須是唯一的。
通常,只有在必要時才使用##GLOBAL_TEMP
表。
否則,如果你正在寫,可能我跑一次同時多一個進程,該特效將與不可預知的方式互相作用,使得它極難解決 - Instance 1
可以改變的數據被用於由Instance 2
導致Instance 3
也會產生不正確的結果。
我對臨時表的個人的看法是,當我只使用它們:
我強調了最後一顆子彈,因爲這是主要的原因,我儘量減少臨時表的使用:
如果你有一個長期運行的進程,並使用臨時表來存儲中間數據集,以及什麼東西死說90%的方式,你必須完全重新啓動如果該數據大部分時間不在物化表中。
我的一些進程在數十億行數據上運行了幾天,所以我對從頭開始重新啓動並不感興趣。
有一些真棒點。碰撞問題在我寫作我的問題時發生。謝謝! –
我實際上還沒有爲全局##臨時表找到一個很好的用例。這是一個修辭問題,但爲什麼不創建一個永久表,然後放下它?如果有任何事情死亡,您將獲得相同的併發限制而不會丟失表。我想,你可能會爭辯說這是好還是壞,就像你可以說槍傷比弩傷更好或更差一樣。 –
我認爲物理表有額外的開銷(日誌記錄,緩存)與臨時表。這是錯誤的嗎?我通常爲小型(ish)數據集使用臨時表。我主要是數據倉庫(每天900萬條事實記錄)以及我的源代碼陰影和分期都是物理的。我通常使用臨時表進行一些簡單的查找並支持連接。 –