2012-01-11 59 views
3

我的存儲過程,做這樣的事情:執行計劃對查詢使用臨時表

SELECT Id 
INTO #temp 
FROM table 
WHERE ... 

DELETE FROM #temp 
INNER JOIN table2 ON a=b 
WHERE ... 

但它運行緩慢。當我嘗試查看執行計劃時,我無法做到,因爲SQL Server Management Studio顯示「Msg 208,Level 16,State 0,Line 31無效的對象名稱」#temp'「。

有沒有什麼方法可以查看這樣的腳本的執行計劃(或執行細節(不是計劃))?

+0

HTTP前使用此語句:// www.sql-server-performance.com/2007/temp-tables-vs-variables/ – 2012-01-11 16:34:37

+0

@BassamMehanni - 該鏈接包含錯誤。爲了允許語句回滾,表格變量的記錄與'#temp'表格相同。 – 2012-01-11 16:45:50

回答

4

SET SHOWPLAN_TEXT ON(或點擊顯示預計的執行計劃是SSMS)創建了一個計劃,而不是執行SQL

因爲這創造了#TEMP

SELECT Id 
INTO #temp 
FROM table 
WHERE ... 

這將失敗

DELETE FROM #temp 
INNER JOIN table2 ON a=b 
WHERE ... 

所以,解決辦法是把它添加到頂部(或做通過SSMS等效)

SET SHOWPLAN_TEXT OFF 
GO 

SET STATISTICS PROFILE ON 
GO 
+0

您的解決方案在SSMS中爲我工作。 – CamHart 2015-07-10 19:32:48

1

用於生成預計執行計劃的優化程序不執行T-SQL。它通過algebrizer運行語句,前面概述的過程負責驗證數據庫對象的名稱。

由於查詢尚未執行,臨時表尚不存在。這是錯誤的原因。解決這個(和測試執行計劃)


的一種方法是之前創建#temp表和存儲過程中作出的一個insert into代替select ... into

2

它應該讓你看到第一個聲明的估計執行計劃罰款。

對於第二條語句,您需要首先創建並填充#temp表(人口是重要的,這樣它才能顯示將用於正確行數的計劃)。

(或者你當然可以只打開SSMS中的「包括實際的執行計劃」選項並運行,如果你沒有特別想看到估計的計劃整件事)

1

您可以運行查詢

SET STATISTICS PROFILE ON 
    SELECT Id 
    INTO #temp 
    FROM table 
    WHERE ... 

    DELETE FROM #temp 
    INNER JOIN table2 ON a=b 
    WHERE ...