这是我的一些发现
测试表
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
在该表上查看
CREATE VIEW vw_Test_View
AS
SELECT ID, SUM(Value) AS Total
FROM Test_Table
GROUP BY ID
GO
Clear_Chached 计划
-- Clear chache for any chached plans
-- (Warning do not execute this on Production server)
DBCC FREEPROCCACHE;
GO
通话视图
-- Execute the same select from view twice
SELECT * FROM dbo.vw_Test_View
GO
SELECT * FROM dbo.vw_Test_View
GO
Chached 计划检查
-- 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 ║
╚═══════════╩═══════════════╩═════════╩════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
结论
如您所见,SELECT * FROM View 的执行计划被编译一次,并在第二次执行相同查询时重复使用。
这是一个视图,计划已被查明,并在后续执行中被重用。希望这个解释有帮助。谢谢你。