2014-05-03 8 views
5

SQL सर्वर में, संग्रहीत प्रक्रिया निष्पादन योजनाओं को कैश किया जाता है लेकिन निष्पादन योजना को कभी कैश नहीं किया जाता है। क्या यह सच है? यदि हां, SQL सर्वर क्यों निष्पादन योजनाओं को कैश नहीं करता है?क्या SQL सर्वर कैश निष्पादन योजना दृश्य है?

यदि कोई अनुकूलक निष्पादन योजना बनाने में लंबा समय ले रहा है, तो क्या क्वेरी को एक दृश्य में लपेटना उपयोगी है?

+0

ऐसा हो सकता है कि दृश्य की योजना को स्टोर करना बहुत उपयोगी नहीं है क्योंकि आपको अभ्यास में दृश्य पर हमेशा एक ऑपरेशन करने की आवश्यकता होती है। उस ऑपरेशन की योजना कैश की गई है। इसमें दृश्य क्वेरी का संभावित परिवर्तन शामिल है। – user2672165

+0

आपको यह गलत जानकारी कहाँ से मिली? एक दृश्य पर एक 'चयन' वास्तव में एक चुनिंदा क्वेरी के अंत में है, और किसी भी अन्य क्वेरी की तरह, यह निष्पादन योजना ** कैश किया जाएगा ** - यह विज्ञापन-प्रसार क्वेरी या संग्रहित प्रक्रिया के अंदर से कोई क्वेरी से अलग नहीं है ..... एक क्वेरी एक क्वेरी है जो SQL सर्वर में एक क्वेरी है, और सभी निष्पादन योजनाओं को कैश किया जाता है (कैश से निष्कासित होने तक) –

+0

@marc_s: मुझे लगता है कि सवाल यह है कि दृश्य डीडीएल एसक्यूएल कैश किया गया है या नहीं। – user2672165

उत्तर

7

किसी दृश्य के लिए निष्पादन योजना जैसी कोई चीज़ नहीं है (सबसे अच्छा, एक पार्स पेड़ कैश किया जाता है)। व्यू को हमेशा बाहरी क्वेरी के हिस्से के रूप में अनुकूलित किया जाता है (कुछ हद तक सरलीकृत, दृश्य का पाठ बाहरी क्वेरी के पाठ के साथ विलय किया जाता है और फिर अनुकूलित किया जाता है)।

किसी व्यू का उपयोग कर क्वेरी की निष्पादन योजना कैश की जाएगी या नहीं, किसी अन्य क्वेरी के समान कारकों पर निर्भर करती है।

3

एक दृश्य कभी निष्पादित नहीं किया जाता है। जब इसे किसी क्वेरी के हिस्से के रूप में उपयोग किया जाता है तो यह क्वेरी प्लान में उल्लिखित होता है जैसे कि आपने अपनी परिभाषा को टेक्स्ट-पेस्ट किया था। क्वेरी ऑप्टिमाइज़र विचारों के बारे में कुछ नहीं जानता (अनुक्रमित दृश्यों को छोड़कर)।

दृश्य परिभाषा को रेखांकित करने के बाद सभी सामान्य कैशिंग नियम लागू होते हैं। दूसरे शब्दों में क्वेरी सामान्य रूप से कैश की जाती है।

+1

अगर हम डीओबी से 'चयन * करते हैं।VeiwName' यह इस क्वेरी के लिए एक योजना तैयार करेगा, और यदि हम एक ही प्रश्न को फिर से निष्पादित करेंगे तो क्या यह पहली निष्पादन के लिए बनाई गई निष्पादन योजना का पुन: उपयोग नहीं करेगा? –

+2

दृश्य स्वयं निष्पादित नहीं किया गया है - सत्य - लेकिन किसी भी दृश्य पर किसी भी 'चयन' को अंततः अंतर्निहित तालिका (ओं) पर एक नियमित 'SELECT' क्वेरी' में परिणाम मिलता है और 'SELECT' क्वेरी में निष्पादन योजना होगी और वह योजना होगी कैश किया गया, बस किसी भी अन्य निष्पादन योजना की तरह ..... –

+2

@ एम। एली निश्चित रूप से इसे कैश किया जाएगा। किसी दृश्य का उपयोग किसी भी तरह से एक क्वेरी विशेष नहीं बनाता है। सामान्य कैशिंग नियम लागू होते हैं। – usr

6

यहाँ मेरी निष्कर्षों में से कुछ

कि तालिका

CREATE VIEW vw_Test_View 
AS 
SELECT ID, SUM(Value) AS Total 
FROM Test_Table 
GROUP BY ID 
GO 

Clear_Chached योजनाओं पर टेस्ट तालिका

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 

देखें हैं

-- 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 था कार्य योजना लागू करके देख सकते हैं एक बार संकलित और एक ही क्वेरी के दूसरे निष्पादन पर पुन: उपयोग किया।

यह एक विचार है, योजना को छेड़छाड़ की गई थी और इसे बाद में निष्पादन पर पुन: उपयोग किया गया था। उम्मीद है कि यह स्पष्टीकरण मदद करता है। धन्यवाद।

+0

+1 ठंड कठिन तथ्यों के लिए। – alan

+2

यह भ्रामक लगता है। निष्पादन खेल "दृश्य से सामान चुनें" और _that_ कैश किया गया है। लेकिन दृश्य के लिए निष्पादन योजना के बारे में क्या है (जो एक अलग "टेबल से चयन सामग्री" है)? – jcollum

संबंधित मुद्दे