Mise en cache dynamic SQL dans la procédure stockée

J'ai SQL dynamic dans la procédure stockée qui crée la table dynamic et insère des données. Ma question est, ce plan de requête sera mis en cache.

Voici un exemple simple de la façon dont je construis actuellement le SQL dynamic à l'intérieur de la procédure stockée.

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 

Oui, ce plan de requête sera mis en cache. Vous pouvez le voir en exécutant votre code, puis en exécutant immédiatement cette requête:

 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()) 

Puisque vous créez une nouvelle table chaque fois en fonction de NEWID (), vous obtiendrez un plan distinct à chaque fois.

Oui, le plan d'exécution sera créé et mis en cache en memory (pas sur le disque) lors de la première exécution. Comme vous créez une nouvelle table pour chaque requête, je ne pense pas que le plan sera réutilisé, mais je n'ai pas testé cela.

Le fait que le plan de procédure stocké soit mis en cache en memory et non sur le disque signifie qu'il tombera hors du cache au redémarrage d'un server ou en raison d'une faible réutilisation. Il peut également tomber en cache si datatables dont dépend la procédure sont suffisamment modifiées pour que les statistics soient invalidées. Cela provoque SQL Server pour invalider le plan.

Vous pouvez vérifier le plan d'exécution créé avec la requête suivante:

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