SQL Server是否缓存视图的执行计划?

Cos*_*sta 5 sql-server view database-performance

在SQL Server中,缓存存储过程执行计划,但从不缓存视图执行计划.真的吗?如果是,为什么SQL Server不缓存视图执行计划?

如果优化器花费很长时间来创建执行计划,那么将查询包装在视图中是否有帮助?

dea*_*ean 8

没有视图的执行计划(最好是缓存一个解析树).视图总是作为外部查询的一部分进行优化(稍微简化一下,视图文本与外部查询的文本合并然后进行优化).

使用视图的查询的执行计划是否会被缓存取决于与任何其他查询完全相同的因素.


M.A*_*Ali 6

以下是我的一些发现

测试表

CREATE TABLE Test_Table (ID INT  , Value INT)                
GO
INSERT INTO Test_Table 
VALUES 
(1, 100),
(2, 100),(2, 100),
(3, 100),(3, 100),(3, 100)
GO
Run Code Online (Sandbox Code Playgroud)

在那张桌子上查看

CREATE VIEW vw_Test_View
AS
SELECT ID, SUM(Value) AS Total 
FROM Test_Table
GROUP BY ID
GO
Run Code Online (Sandbox Code Playgroud)

Clear_Chached计划

-- Clear chache for any chached plans 
-- (Warning do not execute this on Production server)

DBCC FREEPROCCACHE;
GO
Run Code Online (Sandbox Code Playgroud)

调用视图

-- Execute the same select from view twice
SELECT * FROM dbo.vw_Test_View
GO
SELECT * FROM dbo.vw_Test_View
GO
Run Code Online (Sandbox Code Playgroud)

Chached Plans检查

-- Inspect Chached execution plans
SELECT UseCounts, Cacheobjtype, Objtype, [TEXT]
FROM sys.dm_exec_cached_plans 
CROSS APPLY sys.dm_exec_sql_text(plan_handle)
WHERE [TEXT] LIKE '%vw_Test%'
GO

????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
? UseCounts ? Cacheobjtype  ? Objtype ?                                                                                                            TEXT                                                                                                            ?
????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
?         1 ? Compiled Plan ? Adhoc   ? SELECT UseCounts, Cacheobjtype, Objtype, TEXT, query_plan  FROM sys.dm_exec_cached_plans   CROSS APPLY sys.dm_exec_sql_text(plan_handle)  CROSS APPLY sys.dm_exec_query_plan(plan_handle)  WHERE [TEXT] LIKE '%vw_Test%'   ?
?         2 ? Compiled Plan ? Adhoc   ? SELECT * FROM dbo.vw_Test_View                                                                                                                                                                                             ?
????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

结论

正如您所看到的,我们的执行计划SELECT * FROM View被编译一次,并在第二次执行同一查询时重用.

这是一种观点,计划被追逐,并在随后的执行中重复使用.希望这个解释有所帮助 谢谢.

  • 这似乎有误导性.执行游戏是"从视图中选择内容"并且_that_被缓存.但是视图本身的执行计划呢(这是一个不同的"从表中选择的东西")? (3认同)