क्या SQL Server 2008 के साथ एक इंडेक्स को मेमोरी में बने रहने के लिए बाध्य करने का कोई तरीका है?


10

मुझे कई लाखों पंक्तियों के साथ एक तालिका मिली है, जिसमें मुझे समय-समय पर कुछ प्रश्नों को चलाने की आवश्यकता है। पहली क्वेरी आमतौर पर काफी धीमी (लगभग 10s), और बाद की क्वेरी आमतौर पर तेजी से (लगभग 1s) होती है। कुछ घंटों के बाद, एक धीमी / फिर तेजी से चक्र फिर से शुरू होता है।

मैंने अपनी निष्पादन योजना में जांच की है कि सभी आवश्यक सूचकांक मौजूद थे और उचित रूप से उपयोग किए गए थे, और मुझे लगता है कि प्रदर्शन अंतर इस तथ्य के कारण है कि सूचकांक वास्तव में बाद के प्रश्नों के लिए स्मृति में हैं (मैं सही हूं, या अन्य हैं संभावित कारण?)

मैं अनुक्रमणिका के साथ-साथ कई अन्य प्रश्नों का भी उपयोग कर रहा हूं, लेकिन वे प्रश्न कम समय लेने वाले हैं और उनका प्रदर्शन कम महत्वपूर्ण है, इसलिए मैं चिंतित हूं कि उन सूचकांक वास्तव में मेरे महत्वपूर्ण सूचकांक को मेमोरी कैश से बाहर धकेल रहे हैं।

स्पष्ट 'अतिरिक्त रैम जोड़ें' फिक्स के अलावा, मैं डमी क्वेरियों को स्क्रिप्ट करने के बारे में सोच रहा हूं ताकि सूचकांक को वापस स्मृति में लाने के लिए हर घंटे चला जा सके।

क्या ऐसा करने का एक और अधिक सुरुचिपूर्ण तरीका है? SQLServer को संकेत देने के तरीके के समान है कि यदि केवल एक ही इंडेक्स को कैश रखने के लिए पर्याप्त मेमोरी है, तो यह एक होना चाहिए?

मुझे पता है कि आमतौर पर सबसे अच्छी बात यह है कि इस तरह की चीजों के संबंध में विच SQLServer को गड़बड़ाना नहीं है, लेकिन मेरी क्वेरी की असामान्य प्रकृति (बहुत कम ही चलती है, लेकिन समय-महत्वपूर्ण) मेरा मानना ​​है कि यह समझ में आता है (यदि संभव हो तो) ।

मैं यह जानने के लिए भी उत्सुक हूं कि क्या यह जानने का कोई तरीका है कि किसी निश्चित समय में कौन से इंडेक्स मेमोरी में कैश्ड हैं?

जवाबों:


13

वहाँ एक DBCC PINTABLEकमांड हुआ करता था, लेकिन मेरा मानना ​​है कि 6.5 या शायद 7.0 में काम करना बंद कर दिया। बयान शायद यह भी सुझाव देगा कि यदि आप इसे आज़माते हैं तो यह काम करता है, लेकिन यह सिर्फ रिटर्न देता है, यह वास्तव में एक नो-ऑप है।

दुर्भाग्य से वास्तव में किसी भी तरह से नियंत्रित करने का कोई तरीका नहीं है कि कौन से अनुक्रमित कैश में रखे गए हैं - सबसे अच्छा समाधान मैं उन तालिकाओं के लिए जानता हूं जो समय-समय पर गर्म होते हैं उन्हें मैन्युअल रूप से गर्म रखने के लिए है (जो आपने पहले ही अपने प्रश्न में वर्णित किया है)।

जिसके लिए अनुक्रमित स्मृति में हैं, आप एक मोटा विचार प्राप्त कर सकते हैं sys.sm_os_buffer_descriptors। मैंने इस बारे में एक टिप प्रकाशित की:

http://www.mssqltips.com/sqlservertip/2393/determine-sql-server-memory-use-by-database-and-object/


हम्म, उस स्क्रिप्ट के अनुसार, एक 75 एमबी टेबल बफर पूल के 900 एमबी पर कब्जा कर रहा है। क्या यह सामान्य / संभव है?
db2

1
@ db2 आपके पास कितने इंडेक्स हैं?
JNK

2
इसके अलावा यह कितना विखंडित है ... यह पृष्ठों को माप रहा है, डेटा को नहीं। आपके पृष्ठ अपेक्षाकृत खाली हो सकते हैं, और जो फुलाए गए माप में योगदान कर सकते हैं।
हारून बर्ट्रेंड

0

संकेत का उपयोग करने KEEPPLANऔर KEEPPLAN FIXED क्वेरी करने का प्रयास करें ।

KEEPPLAN क्वेरी के लिए अनुमानित recompile थ्रेशोल्ड को आराम करने के लिए क्वेरी ऑप्टिमाइज़र को मजबूर करता है।

KEEPFIXED PLAN क्वेरी ऑप्टिमाइज़र को आँकड़ों में परिवर्तन के कारण किसी क्वेरी को फिर से स्थापित करने के लिए मजबूर नहीं करता है। KEEPFIXED PLAN निर्दिष्ट करना सुनिश्चित करता है कि एक क्वेरी केवल तब ही पुन: संयोजित की जाएगी जब अंतर्निहित तालिकाओं के स्कीमा को बदल दिया जाता है या यदि sp_recompile को उन तालिकाओं के विरुद्ध निष्पादित किया जाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.