2014-05-03 6 views
5

In SQL Server, i piani di esecuzione delle stored procedure vengono memorizzati nella cache ma il piano di esecuzione della visualizzazione non viene mai memorizzato nella cache. È vero? In caso affermativo, perché SQL Server non memorizza nella cache i piani di esecuzione?Il piano di esecuzione della cache di SQL Server di una vista?

Se un ottimizzatore impiega molto tempo per creare un piano di esecuzione, è utile racchiudere la query in una vista?

+0

È 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

+0

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

+0

@marc_s: Penso che la domanda sia se la vista DDL SQL è memorizzata nella cache o meno. – user2672165

risposta

7

Non esiste un piano di esecuzione per una vista (nella migliore delle ipotesi, un albero di analisi viene memorizzato nella cache). La vista è sempre ottimizzata come parte della query esterna (in qualche modo semplificata, il testo della vista viene unito al testo della query esterna e quindi ottimizzato).

Un piano di esecuzione di una query che utilizza una vista essere memorizzato nella cache o meno dipende dagli stessi fattori di qualsiasi altra query.

3

Una vista non viene mai eseguita. Quando viene utilizzato come parte di una query, viene inserito nel piano di query come se aveste incollato il testo nella sua definizione. Query Optimizer non sa nulla delle viste (eccetto per le viste indicizzate).

Dopo l'inlining della definizione della vista si applicano tutte le normali regole di memorizzazione nella cache. In altre parole, la query viene normalmente memorizzata nella cache.

+1

Se eseguiamo un 'SELECT * FROM dbo.VeiwName' questo creerà un piano per questa query e se eseguiremo nuovamente la stessa query non riutilizzerà il piano di esecuzione creato per la prima esecuzione? –

+2

La vista non viene eseguita - true - ma qualsiasi 'SELECT' su una vista risulta in definitiva in una normale query' SELECT' sulle tabelle sottostanti e che la query 'SELECT' avrà un piano di esecuzione e tale piano sarà memorizzato nella cache, proprio come qualsiasi altro piano di esecuzione ..... –

+2

@ M.Ali ovviamente verrà memorizzato nella cache. L'utilizzo di una vista non rende una query speciale in alcun modo. Si applicano le solite regole di memorizzazione nella cache. – usr

6

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.

+0

+1 Per fatti rigidi e freddi. – alan

+2

Sembra fuorviante. La riproduzione dell'esecuzione è "seleziona elementi dalla vista" e _that_ è nella cache. Ma per quanto riguarda il piano di esecuzione per la vista stessa (che è un diverso "seleziona le cose dalle tabelle")? – jcollum