簡體   English   中英

在存儲過程中緩存動態SQL

[英]Caching dynamic sql in stored procedure

我在存儲過程中有動態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 CustomerID=@CustID'

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


 END
 GO

是的,此查詢計划將被緩存。 您可以通過運行代碼然后立即運行此查詢來查看此信息:

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()創建一個新表,因此您每次都會獲得一個單獨的計划。

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

存儲過程計划緩存在內存中而不是磁盤中的事實意味着在服務器重新啟動或重復使用率較低時,它會從緩存中掉出來。 如果該過程所依賴的數據發生足夠的變化以致使統計信息無效,它也可能會從緩存中掉出來。 這將導致SQL Server使計划無效。

您可以檢查通過以下查詢創建的執行計划:

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

暫無
暫無

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

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