2010-02-12 12 views
6

मुझे काम पर एक बहुत ही विशेष प्रदर्शन समस्या है!छवि फ़ील्ड के साथ SQL सर्वर तालिका में प्रदर्शन को बेहतर बनाने के लिए कैसे?

सिस्टम में हम एक टेबल का उपयोग कर रहे हैं जिसमें वर्तमान वर्कफ़्लो प्रक्रिया के बारे में जानकारी है। फ़ील्ड में से एक में स्प्रैडशीट होती है जिसमें प्रक्रिया के बारे में मेटाडेटा होता है (मुझसे पूछें क्यों नहीं !! और नहीं, मैं इसे बदल नहीं सकता !!)

समस्या यह है कि यह स्प्रेडशीट एक IMAGE फ़ील्ड में संग्रहीत है एक SQL सर्वर 2005 (SQL 2000 संगतता के साथ डेटाबेस सेट के भीतर)।

SELECT TOP 100 * 
    FROM OFFENDING_TABLE 

क्वेरी विश्लेषक में डेटा पुनः प्राप्त करने में 30 सेकंड लेता है:

इस तालिका में वर्तमान में 22K + लाइनों और इस तरह यह भी एक सरल प्रश्न है।

मैं SQL 2005 की संगतता को अपडेट करने के बारे में सोच रहा हूं (एक बार जब मुझे सूचित किया गया कि ऐप इसे संभाल सकता है)।

दूसरी बात जो मैं सोच रहा हूं वह कॉलम के डेटा प्रकार को varbinary(max) में बदलना है, लेकिन मुझे नहीं पता कि यह करने से एप्लिकेशन को प्रभावित होगा या नहीं।

एक और बात है कि मैं विचार कर रहा हूँ sp_tableoption उपयोग करने के लिए के रूप में यह वर्तमान में 0 है 1 को large value types out of row स्थापित करने के लिए है, लेकिन मैं कोई जानकारी नहीं है, तो यह करके प्रदर्शन में सुधार होगा।

क्या कोई इस परिदृश्य में प्रदर्शन को बेहतर बनाने के बारे में जानता है?


स्पष्ट करने के लिए संपादित

मेरे समस्या मैं क्या आवेदन एसक्यूएल सर्वर के लिए पूछता है पर कोई नियंत्रण नहीं है, और मैं (अनुप्रयोग एक .NET 1.1 वेबसाइट है उस पर कुछ प्रतिबिंब था कि है) और यह कुछ आंतरिक सामानों के लिए अपमानजनक क्षेत्र का उपयोग करता है जो मुझे नहीं पता कि यह क्या है।

मुझे इस तालिका के समग्र प्रदर्शन में सुधार करने की आवश्यकता है।

उत्तर

4

मैं तुम्हें अपमानजनक तालिका लेआउट स्वास्थ्य पर गौर की सलाह देते हैं:

select * from sys.dm_db_index_physical_stats(
     db_id(), object_id('offending_table'), null, null, detailed); 

हालात avg_fragmentation_in_percent, PAGE_COUNT, avg_page_space_used_in_percent, record_count और ghost_record_count हैं देखने के लिए भी। उच्च विखंडन, या भूत रिकॉर्ड की एक उच्च संख्या, या एक कम पेज इस्तेमाल किया प्रतिशत की तरह cues समस्याओं का संकेत है और चीजें खरोंच से सिर्फ सूचकांक के पुनर्निर्माण से काफ़ी सुधार किया जा सकता:

ALTER INDEX ALL ON offending_table REBUILD; 

(यानी तालिका।) मैं यह कह रहा हूं कि आप टेबल और न ही ऐप बदल सकते हैं। यदि आप टेबल और ऐप को बदलने में सक्षम होंगे, तो आपको जो सलाह मिलती है वह अच्छी सलाह है ('*' का उपयोग न करें, डब्ल्यू/ओए स्थिति का चयन न करें, नए वर्बिनरी (अधिकतम) प्रकार इत्यादि का उपयोग करें) ।

मैं प्रदर्शन काउंटर में औसत पृष्ठ जीवनकाल को भी देख सकता हूं ताकि यह समझ सके कि सिस्टम मेमोरी भूखा है या नहीं। लक्षणों के आपके वर्णन से सिस्टम आईओ बाध्य दिखता है जो मुझे लगता है कि वहां थोड़ा पेज कैशिंग चल रहा है, और अधिक रैम मदद कर सकता है, साथ ही साथ एक तेज़ आईओ सबटाइम भी। एक एसक्यूएल 2008 सिस्टम पर मैं पृष्ठ पर संपीड़न मोड़ने का भी सुझाव दूंगा, लेकिन 2005 में आप नहीं कर सकते।
और, बस यह सुनिश्चित करने के लिए, सुनिश्चित करें कि प्रश्न स्वयं ऐप से विवाद से अवरुद्ध नहीं हैं, यानी। क्वेरी पंक्ति लॉक के लिए प्रतीक्षा करने वाले 30 सेकंड में से 9 0% खर्च नहीं करती है। क्वेरी चल रही है, जबकि sys.dm_exec_requests पर, प्रतीक्षा_टाइम, wait_type और प्रतीक्षा_resource देखें। क्या यह PAGEIOLATCH_XX है? या यह एक ताला है? साथ ही, आपके सर्वर में sys.dm_os_wait_stats कैसा है, शीर्ष प्रतीक्षा कारण क्या हैं?

1

एक छोटा सा जवाब केवल कई पंक्तियों के खिलाफ चयन करना है जब फ़ील्ड लौटाए गए अपमानजनक छवि फ़ील्ड, यानी कोई चयन * शामिल नहीं है। यदि आप छवि फ़ील्ड का मान चाहते हैं, तो इसे केस-दर-मामले आधार पर पुनर्प्राप्त करें।

0

पंक्ति विकल्प से बड़े मूल्य प्रकारों को सेट करना निश्चित रूप से प्रदर्शन में सहायता करना चाहिए। पंक्ति का आकार काफी छोटा होगा, SQL सर्वर तालिका को प्राप्त करने के लिए बहुत कम भौतिक पढ़ सकता है।

2

सबसे पहले - कभी भी SELECT * उत्पादन कोड में रिपोर्ट न करें - रिपोर्टिंग या नहीं।

आप तीन बुनियादी विकल्प हैं:

  • कदम ब्लॉब एक ​​अलग तालिका अगर यह हमेशा की जरूरत नहीं है में बाहर क्षेत्र; शायद नहीं व्यावहारिक के बाद से आप का उल्लेख आप केवल उन क्षेत्रों है कि तुम सच की जरूरत है चुनने के लिए अपने SELECT बयानों के साथ स्कीमा

  • अधिक सावधान रहना नहीं बदल सकते हैं - और छोड़ देते हैं ब्लॉब क्षेत्र

  • देखें कि आप अपनी क्वेरी सीमित कर सकते हैं WHERE खंड शामिल करने के लिए और क्वेरी योजना को अनुकूलित करने के लिए एक तरीका खोजें (यदि आप कर सकते हैं)

मेज पर एक उपयुक्त सूचकांक जोड़ने कोई जादू है स्विच "इसे तेज़ बनाने के" - लेकिन आप आपकी क्वेरी का अनुकूलन करने या अपने तालिका लेआउट को अनुकूलित कर सकते हैं। दोनों मदद करते हैं। यदि आप कुछ भी नहीं बदल सकते हैं - न तो तालिका लेआउट, न ही कोई अनुक्रमणिका जोड़ें, न ही प्रश्नों को बदलें, आपको कुछ भी अनुकूलित करने में कठिनाई होगी, मुझे डर है ....

बस फ़ील्ड को बदलना वर्बिनरी (MAX) कुछ भी नहीं बदलेगा - डेटा प्रकार बदलने से अपेक्षाकृत कोई प्रदर्शन सुधार अपेक्षित नहीं होगा।

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