簡體   English   中英

性能/空間SQL:選擇@variable或#temp

[英]performance/space sql: select into a @variable or into a #temp

我的存儲過程給我這個錯誤:

無法為數據庫“ tempdb”中的對象“ dbo.Large Object Storage System對象:422213818384384”分配空間,因為“ PRIMARY”文件組已滿。

在我的查詢中,我使用了很多臨時表。 我在想:

什么是更好的性能/空間明智的選擇? SELECT INTO使用臨時表或表變量之間有區別嗎?

一個例子:

select * 
into #temp1 from myTable

select * 
into #temp2 from #temp1

--then add some columns on temp2 and do some joins with temp1

@temp1@temp2使用同一SELECT / JOIN會更好嗎?

正如其他人所說,就空間和性能而言,兩者實際上沒有區別。 有一個誤解,認為表變量存儲在RAM中,這是不正確的。 兩者都在tempdb空間中分配。

您的錯誤消息表明tempdb使用的文件已用完分配的空間,這可能需要解決,tempdb空間用完可能是一個嚴重的問題。

一般的經驗法則是,首先避免創建不必要的對象(即臨時表/臨時數據集),並讓SQL Server以最簡單的方式盡最大可能優化查詢。

如果創建兩個臨時表而沒有看到數據/查詢,那將產生兩倍的數據量,因此可能會使您的問題變得更糟。

從發布的內容來看,應該避免使用臨時表/表變量,而應使用普通查詢。 您可以子查詢或公用表表達式來控制查詢的復雜性。

是的,盡管表變量和臨時表都使用TempDb,但它們是不同的。

選擇表變量和臨時表的基本經驗法則是,在處理較少數據量時應選擇表變量。 表變量不涉及事務,鎖定和日志記錄,因此它們相對較快( 通常適合少於100行

除此之外,臨時表還允許您在其上建立索引,就像臨時表(TempDb)上的普通表一樣。不要創建太多臨時表,因為TempDb除了處理用戶定義的臨時表外,還必須執行其他各種操作對象。 因此,在您的情況下,您可以選擇具有適當索引的物理表。 我相信,您正在處理大量的blob對象,在兩種情況下(即表變量和temp表)都使用TempDb。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM