Ecco alcuni dei miei risultati
prova Tabella
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
Visualizza su quel tavolo
CREATE VIEW vw_Test_View
AS
SELECT ID, SUM(Value) AS Total
FROM Test_Table
GROUP BY ID
GO
Clear_Chached Piani
-- Clear chache for any chached plans
-- (Warning do not execute this on Production server)
DBCC FREEPROCCACHE;
GO
Calling Vedi
-- Execute the same select from view twice
SELECT * FROM dbo.vw_Test_View
GO
SELECT * FROM dbo.vw_Test_View
GO
Piani Chached ispezione
-- 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 ║
╚═══════════╩═══════════════╩═════════╩════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
Conclusione
Come si può vedere il piano di esecuzione per la nostra SELECT * FROM View
era compilato una volta e riutilizzato alla seconda esecuzione della stessa query.
È un punto di vista, il piano era scollegato ed è stato riutilizzato in esecuzione successiva. Spero che questa spiegazione aiuti. Grazie.
È possibile che non sia molto utile archiviare il piano della vista perché è sempre necessario eseguire un'operazione sulla vista nella pratica. Il piano per quell'operazione è memorizzato nella cache. Ciò implica una possibile trasformazione della query di visualizzazione. – user2672165
Da dove ha preso questa disinformazione? Un 'SELECT' su una vista è davvero alla fine una query selezionata, e come qualsiasi altra query, il suo piano di esecuzione ** verrà memorizzato nella cache ** - non è diverso da una query ad-hoc o una query all'interno di una stored procedure ..... una query è una query è una query in SQL Server e tutti i piani di esecuzione sono memorizzati nella cache (fino a sfratto dalla cache) –
@marc_s: Penso che la domanda sia se la vista DDL SQL è memorizzata nella cache o meno. – user2672165