2013-04-01 45 views
1

我在創建動態表並插入數據的存儲過程中有動態SQL。我的問題是,這個查詢計劃是否會被緩存。在存儲過程中緩存動態sql

這裏是一個簡單的例子,說明當前如何在存儲過程中構建動態SQL。

CREATE PROCEDURE [dbo].[GetOrders] 
@CustID AS INT 
AS 

BEGIN 

DECLARE @SQL NVARCHAR(MAX) 

DECLARE @TableName AS VARCHAR(500) 

    SET @TableName = CONVERT(VARCHAR(255), NEWID()) 

    SET @SQL = 'CREATE TABLE [dbo].[' + @TableName + '] 
(
    [OrderID] [int] NOT NULL 
) ' 

    EXEC sp_executesql @SQL 

    SET @SQL = 'insert [dbo].[' + @TableName + '](OrderID) 
      select OrderID from dbo.Orders where [email protected]' 

    EXEC sp_executesql @SQL, N'@CustID INT', @CustID = @CustID 


END 
GO 
+0

我不認爲它會緩存。另外,爲每個客戶創建一個新表格都是不明智的。 –

回答

1

是的,這個查詢計劃將被緩存。您可以通過運行代碼,然後立即運行該查詢看到:

SELECT * 
FROM sys.dm_exec_query_stats s 
CROSS APPLY sys.dm_exec_query_plan(s.plan_handle) qp 
WHERE creation_time >= DATEADD(SECOND, -10, GETDATE()) 

因爲要創建新表基於NEWID每次(),你每次都會得到一個獨立的計劃。

1

是的,執行計劃將在第一次執行時創建並緩存在內存中(而不是磁盤)。當您爲每個查詢創建一個新表時,我認爲該計劃不會被重用,但我沒有對此進行測試。

事實上,存儲過程計劃緩存在內存中而不是磁盤上意味着它將在服務器重新啓動或由於重新使用率低而從緩存中溢出。如果過程所依賴的數據發生變化足以導致統計信息失效,它也可能會脫離緩存。這會導致SQL Server使計劃失效。

您可以檢查與下面的查詢生成執行計劃:

SELECT sc.* 
FROM master.dbo.syscacheobjects AS sc 
WHERE sc.cacheobjtype = 'Executable Plan'