Да.Конечно, это легко проверить самостоятельно:
- Создать процедуру
- Выполнить ее несколько раз
- Подтвердить, что она кэшируется, проверяя sys.dm_exec_cached_plans
- Измените процедуру
Строка в sys.dm_exec_cached_plans пропала
CREATE PROCEDURE dbo.blat AS SELECT 1;
GO
EXEC dbo.blat;
GO 5
SELECT COUNT(*)
FROM sys.dm_exec_cached_plans AS p
CROSS APPLY sys.dm_exec_sql_text(p.plan_handle) AS s
WHERE [sql].[text] LIKE '%dbo.blat%';
-----
1
ALTER PROCEDURE dbo.blat AS SELECT 22;
GO
SELECT COUNT(*) FROM sys.dm_exec_cached_plans AS p
CROSS APPLY sys.dm_exec_sql_text(p.plan_handle) AS s
WHERE [sql].[text] LIKE '%dbo.blat%';
-----
0
Но если ваша процедура имеет динамический SQL, основной Proc
план исчезнет, но дочерние планы (Adhoc
/ Prepared
) останутся.
CREATE PROCEDURE dbo.what
AS
BEGIN
DECLARE @sql nvarchar(max) = N'SELECT x FROM dbo.flange;';
EXEC sys.sp_executesql @sql;
END
GO
DBCC FREEPROCCACHE;
GO
EXEC dbo.what;
GO
SELECT objtype, c = COUNT(*)
FROM sys.db_exec_cached_plans AS p
CROSS APPLY sys.dm_exec_sql_text(p.plan_handle) AS t
WHERE t.text LIKE N'%flange%'
GROUP BY objtype;
GO
Результаты:
objtype c
------- ----
Adhoc 1
Proc 1
Теперь измените процедуру (но в такойто, что он все еще выдает тот же SQL):
ALTER PROCEDURE dbo.what
AS
BEGIN
SET NOCOUNT ON;
DECLARE @sql nvarchar(max) = N'SELECT id FROM dbo.flange2;';
EXEC sys.sp_executesql @sql;
END
GO
Приведенный выше запрос дает:
objtype c
------- ----
Adhoc 1
Конечно, это не постоянное состояние - другие запросы и другое давление памяти наСистема будет определять, как долго эти специальные запросы будут оставаться в кэше.