मैं SQL सर्वर क्वेरी कैश को कैसे साफ़ कर सकता हूँ?


199

मुझे SQL Server 2005 के खिलाफ एक सरल क्वेरी चल रही है

SELECT * 
FROM Table 
WHERE Col = 'someval'

पहली बार जब मैं क्वेरी निष्पादित कर सकता हूं > 15 secs। बाद में निष्पादित वापस आ रहे हैं < 1 sec

मैं किसी भी कैश्ड परिणाम का उपयोग न करने के लिए SQL Server 2005 कैसे प्राप्त कर सकता हूं? मैंने दौड़ने की कोशिश की है

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

लेकिन ऐसा लगता है कि क्वेरी की गति (अभी भी < 1 sec) पर कोई प्रभाव नहीं है ।


DUPLICATE: stackoverflow.com/questions/1856966/… लेकिन बेहतर
Faiz

जवाबों:


259

यहाँ कुछ अच्छी व्याख्या है। इसे देखें।

http://www.mssqltips.com/tip.asp?tip=1360

CHECKPOINT; 
GO 
DBCC DROPCLEANBUFFERS; 
GO

जुड़े हुए लेख से:

यदि सभी प्रदर्शन परीक्षण SQL सर्वर में किए जाते हैं, तो सबसे अच्छा तरीका यह हो सकता है कि आप CHECKPOINT जारी करें और फिर DBCC DROPCLEANBUFFERS कमांड जारी करें। हालाँकि CHECKPOINT प्रक्रिया SQL सर्वर में एक स्वचालित आंतरिक प्रणाली प्रक्रिया है और यह नियमित रूप से होती है, लेकिन वर्तमान डेटाबेस के लिए सभी गंदे पृष्ठ लिखने और बफ़र्स को साफ़ करने के लिए यह आदेश जारी करना महत्वपूर्ण है। फिर बफर बफ़र से सभी बफ़र्स को निकालने के लिए DBCC DROPCLEANBUFFERS कमांड निष्पादित किया जा सकता है।


14
एक मैस्ट में DBCC FREEPROCCACHE
जारिक

1
Dropcleanbuffers का उपयोग करते समय यह उन सभी के लिए है जो डेटाबेस से जुड़ा है या केवल उस उपयोगकर्ता के लिए है?
क्रिष नोबेल

1
@ क्रिस: DBCC DROPCLEANBUFFERS, बफर पूल से सभी स्वच्छ बफ़र्स को निकालता है। क्वेरी निष्पादन ट्यूनिंग में यह आवश्यक चरण है और किसी को इसे लाइव SQL सर्वर पर उपयोग नहीं करना चाहिए।
सायर

यह SQL सर्वर के लिए अच्छी तरह से काम करता है, लेकिन कृपया ध्यान दें कि यह SQL Azure में काम नहीं करता है - मैंने SQL Azure परिदृश्य को संभालने के लिए नीचे एक वैकल्पिक समाधान पोस्ट किया है।
MSC

1
अच्छा, यह एकमात्र ऐसा आदेश है जो वास्तव में काम करता है, कई अन्य की कोशिश की और काम नहीं किया।
गेब्रियल रोड्रिगेज

15

योजना कैश साफ़ करने के लिए आठ अलग-अलग तरीके

1. पूरे उदाहरण के लिए प्लान कैश से सभी तत्वों को निकालें

DBCC FREEPROCCACHE;

प्लान कैश को सावधानी से साफ़ करने के लिए इसका उपयोग करें। उदाहरण के लिए, योजना कैश को मुक्त करना, कैश से पुन: उपयोग किए जाने के बजाय पुन: संकलित की जाने वाली संग्रहीत प्रक्रिया है। यह क्वेरी प्रदर्शन में अचानक, अस्थायी कमी का कारण बन सकता है।

2. पूरे उदाहरण के लिए प्लान कैश फ्लश करें और नियमित रूप से पूरा होने वाले संदेश को दबाएं

"DBCC निष्पादन पूर्ण। यदि DBCC ने त्रुटि संदेश मुद्रित किया है, तो अपने सिस्टम व्यवस्थापक से संपर्क करें।"

DBCC FREEPROCCACHE WITH NO_INFOMSGS;

3. पूरे उदाहरण के लिए तदर्थ और तैयार योजना कैश फ्लश करें

DBCC FREESYSTEMCACHE ('SQL Plans');

4. एक संसाधन पूल के लिए तदर्थ और तैयार योजना कैश फ्लश करें

DBCC FREESYSTEMCACHE ('SQL Plans', 'LimitedIOPool');

5. एक संसाधन पूल के लिए पूरी योजना कैश फ्लश करें

DBCC FREEPROCCACHE ('LimitedIOPool');

6. प्लान डेटाबेस से सभी तत्वों को एक डेटाबेस के लिए निकालें (SQL Azure में काम नहीं करता है)

-- Get DBID from one database name first
DECLARE @intDBID INT;
SET @intDBID = (SELECT [dbid] 
                FROM master.dbo.sysdatabases 
                WHERE name = N'AdventureWorks2014');

DBCC FLUSHPROCINDB (@intDBID);

वर्तमान डेटाबेस के लिए स्पष्ट योजना कैश

USE AdventureWorks2014;
GO
-- New in SQL Server 2016 and SQL Azure
ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE;

8. कैश से एक क्वेरी प्लान निकालें

USE AdventureWorks2014;
GO

-- Run a stored procedure or query
EXEC dbo.uspGetEmployeeManagers 9;

-- Find the plan handle for that query 
-- OPTION (RECOMPILE) keeps this query from going into the plan cache
SELECT cp.plan_handle, cp.objtype, cp.usecounts, 
DB_NAME(st.dbid) AS [DatabaseName]
FROM sys.dm_exec_cached_plans AS cp CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS st 
WHERE OBJECT_NAME (st.objectid)
LIKE N'%uspGetEmployeeManagers%' OPTION (RECOMPILE); 

-- Remove the specific query plan from the cache using the plan handle from the above query 
DBCC FREEPROCCACHE (0x050011007A2CC30E204991F30200000001000000000000000000000000000000000000000000000000000000);
 

सोर्स 1 2 3


9

हालांकि सवाल अभी थोड़ा पुराना है, फिर भी यह मदद कर सकता है। मैं ऐसे ही मुद्दों पर चल रहा हूं और नीचे दिए गए विकल्प का उपयोग करने से मुझे मदद मिली है। सुनिश्चित नहीं है कि यह एक स्थायी समाधान है, लेकिन यह अभी के लिए इसे ठीक कर रहा है।

OPTION (OPTIMIZE FOR UNKNOWN)

फिर आपकी क्वेरी इस तरह होगी

select * from Table where Col = 'someval' OPTION (OPTIMIZE FOR UNKNOWN)

1
कीवर्ड 'विकल्प' के पास गलत सिंटैक्स। या 'सिंटेक' के पास गलत सिंटैक्स।
पब्रम्स 17

1
@pabrams ये आपके प्रश्न के बाद (जैसे के हिस्से के रूप में) पर जाएँ:select * from Table where Col = 'someval' OPTION (OPTIMIZE FOR UNKNOWN)
मार्क Avenius

1
बस ABSOLUTELY सुनिश्चित करें कि आप अनजाने में कुछ इस तरह से उत्पादन कोड में नहीं छोड़ते हैं - क्योंकि इससे सड़क के नीचे MAJOR मुद्दे हो सकते हैं।
माइकल के। कैंपबेल

4
UNKNOWN का विकल्प कैश की गई योजनाओं को अनदेखा नहीं करता है । इसके बजाय, एक योजना बनाते समय यह SQL सर्वर को "औसत वितरण मान, किसी भी [स्वत:] पैरामीटराइजेशन से स्वतंत्र" चुनने के लिए निर्देश देता है कि किस योजना को बनाने के लिए - यह उन योजनाओं में परिणाम देता है जो गैर-समान आंकड़ों में अधिक सुसंगत हो सकते हैं। एक विकल्प (RECOMPILE) एक नई योजना बनाता है , लेकिन अन्यथा डेटा कैश को साफ / जारी नहीं करता है - यह आमतौर पर योजना पुनर्जनन और योजना कैशिंग लागतों की कीमत पर अधिक आदर्श योजनाएं उत्पन्न करता है।
user2864740

6
EXEC sys.sp_configure N'max server memory (MB)', N'2147483646'
GO
RECONFIGURE WITH OVERRIDE
GO

सर्वर मेमोरी के लिए आप जो मूल्य निर्दिष्ट करते हैं, वह महत्वपूर्ण नहीं है, जब तक कि वह वर्तमान से भिन्न होता है।

Btw, वह चीज जो स्पीडअप का कारण बनती है वह क्वेरी कैश नहीं है, बल्कि डेटा कैश है।


3

नोट है कि न तो DBCC DROPCLEANBUFFERS;है और न हीDBCC FREEPROCCACHE; SQL Azure / SQL डेटा वेयरहाउस में तो समर्थित है ।

हालाँकि, यदि आपको SQL Azure में योजना कैश को रीसेट करने की आवश्यकता है, तो आप क्वेरी में किसी एक तालिका को बदल सकते हैं (उदाहरण के लिए, बस फिर एक कॉलम निकालें), यह कैश से योजना को हटाने का दुष्प्रभाव होगा ।

मैं व्यक्तिगत रूप से कैश्ड योजनाओं से निपटने के लिए बिना क्वेरी प्रदर्शन के परीक्षण के एक तरीके के रूप में ऐसा करता हूं।

यहाँ SQL Azure प्रक्रिया कैश के बारे में अधिक जानकारी


यह मेरे लिए काम नहीं करता था, फिर योजना अपरिवर्तित थी। कृपया यहाँ देखें stackoverflow.com/questions/46987785/…
Meneghino
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.