Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

बड़ी तालिकाओं पर SQL सर्वर क्वेरी प्रदर्शन में सुधार करें

सरल उत्तर:नहीं। आप क्लस्टर्ड इंडेक्स पर 50% फिल फैक्टर के साथ 238 कॉलम टेबल पर तदर्थ प्रश्नों की सहायता नहीं कर सकते।

विस्तृत उत्तर:

जैसा कि मैंने इस विषय पर अन्य उत्तरों में कहा है, इंडेक्स डिज़ाइन कला और विज्ञान दोनों है और इस पर विचार करने के लिए बहुत सारे कारक हैं कि कुछ, यदि कोई हैं, तो कठिन और तेज़ नियम हैं। आपको विचार करने की आवश्यकता है:डीएमएल ऑपरेशंस बनाम सेलेक्ट्स, डिस्क सबसिस्टम, टेबल पर अन्य इंडेक्स / ट्रिगर्स की मात्रा, टेबल के भीतर डेटा का वितरण, SARGable WHERE स्थितियों का उपयोग करने वाले प्रश्न हैं, और कई अन्य चीजें जो मुझे ठीक से याद भी नहीं हैं अब।

मैं कह सकता हूं कि इस विषय पर प्रश्नों के लिए कोई मदद नहीं दी जा सकती है, बिना टेबल, उसके इंडेक्स, ट्रिगर्स आदि को समझे। 99% अंक) मैं कुछ सुझाव दे सकता हूं।

सबसे पहले, यदि तालिका परिभाषा सटीक है (238 कॉलम, 50% भरें फैक्टर) तो आप यहां बाकी उत्तरों/सलाह को काफी हद तक अनदेखा कर सकते हैं;-)। यहां कम-से-राजनीतिक होने के लिए खेद है, लेकिन गंभीरता से, यह बारीकियों को जाने बिना एक जंगली हंस का पीछा है। और अब जब हम तालिका की परिभाषा देखते हैं तो यह काफी स्पष्ट हो जाता है कि एक साधारण क्वेरी में इतना समय क्यों लगेगा, भले ही परीक्षण क्वेरी (अपडेट #1) इतनी जल्दी चले।

यहां मुख्य समस्या (और कई खराब-प्रदर्शन स्थितियों में) खराब डेटा मॉडलिंग है। 238 कॉलम प्रतिबंधित नहीं हैं जैसे 999 इंडेक्स होना प्रतिबंधित नहीं है, लेकिन यह भी आमतौर पर बहुत बुद्धिमान नहीं है।

सिफारिशें:

  1. सबसे पहले, इस तालिका को वास्तव में फिर से तैयार करने की आवश्यकता है। यदि यह डेटा वेयरहाउस टेबल है तो हो सकता है, लेकिन यदि नहीं तो इन क्षेत्रों को वास्तव में कई तालिकाओं में विभाजित करने की आवश्यकता है, जिनमें सभी एक ही पीके हो सकते हैं। आपके पास एक मास्टर रिकॉर्ड टेबल होगी और चाइल्ड टेबल सामान्य रूप से संबंधित विशेषताओं के आधार पर केवल निर्भर जानकारी होती है और उन तालिकाओं का पीके मास्टर टेबल के पीके के समान होता है और इसलिए मास्टर टेबल पर भी एफके होता है। मास्टर और सभी चाइल्ड टेबल के बीच एक-से-एक संबंध होगा।
  2. ANSI_PADDING OFF का उपयोग परेशान करने वाला है, समय के साथ विभिन्न कॉलम जोड़ने के कारण तालिका के भीतर असंगत का उल्लेख नहीं करना। सुनिश्चित नहीं है कि आप इसे अभी ठीक कर सकते हैं, लेकिन आदर्श रूप से आपके पास हमेशा ANSI_PADDING ON होगा। , या कम से कम सभी ALTER TABLE . में एक ही सेटिंग रखें बयान।
  3. 2 अतिरिक्त फ़ाइल समूह बनाने पर विचार करें:तालिकाएँ और अनुक्रमणिकाएँ। अपनी सामग्री को PRIMARY . में न डालना सबसे अच्छा है जैसा कि वह जगह है जहाँ SQL सर्वर अपने सभी डेटा और मेटा-डेटा को आपकी वस्तुओं के बारे में संग्रहीत करता है। आप [Tables] पर अपना टेबल और क्लस्टर इंडेक्स (जैसा कि टेबल के लिए डेटा है) बनाते हैं और [Indexes] . पर सभी गैर-संकुल अनुक्रमणिकाएं
  4. भरण कारक को 50% से बढ़ाएँ। यह कम संख्या संभवतः आपके डेटा स्थान की तुलना में आपकी अनुक्रमणिका स्थान बड़ी है। अनुक्रमणिका का पुनर्निर्माण करने से आपके डेटा के लिए उपयोग किए गए अधिकतम 4k (कुल 8k पृष्ठ आकार में से) डेटा पृष्ठों को फिर से बनाया जाएगा ताकि आपकी तालिका एक विस्तृत क्षेत्र में फैली हो।
  5. यदि अधिकांश या सभी क्वेरी में WHERE में "ER101_ORG_CODE" है कंडीशन, फिर उसे क्लस्टर्ड इंडेक्स के अग्रणी कॉलम में ले जाने पर विचार करें। यह मानते हुए कि इसका उपयोग "ER101_ORD_NBR" से अधिक बार किया जाता है। अगर "ER101_ORD_NBR" का अधिक बार उपयोग किया जाता है तो इसे रखें। ऐसा लगता है, यह मानते हुए कि फ़ील्ड नामों का अर्थ "OrganizationCode" और "OrderNumber" है, कि "OrgCode" एक बेहतर समूह है जिसमें इसके भीतर कई "OrderNumbers" हो सकते हैं।
  6. मामूली बिंदु, लेकिन यदि "ER101_ORG_CODE" में हमेशा 2 वर्ण हों, तो CHAR(2) का उपयोग करें VARCHAR(2) . के बजाय क्योंकि यह पंक्ति शीर्षलेख में एक बाइट बचाएगा जो परिवर्तनीय चौड़ाई आकारों को ट्रैक करता है और लाखों पंक्तियों को जोड़ता है।
  7. जैसा कि यहां अन्य लोगों ने उल्लेख किया है, SELECT * . का उपयोग करके प्रदर्शन को नुकसान पहुंचाएगा। न केवल इसके कारण SQL सर्वर को सभी कॉलम वापस करने की आवश्यकता होती है और इसलिए आपके अन्य इंडेक्स की परवाह किए बिना क्लस्टर्ड इंडेक्स स्कैन करने की अधिक संभावना होती है, बल्कि तालिका परिभाषा पर जाने और अनुवाद करने के लिए SQL सर्वर समय भी लगता है * कोड> सभी कॉलम नामों में। यह थोड़ा होना चाहिए SELECT . में सभी 238 कॉलम नाम निर्दिष्ट करने के लिए तेज़ सूची हालांकि स्कैन समस्या में मदद नहीं करेगा। लेकिन क्या आपको कभी भी वास्तव में एक ही समय में सभी 238 स्तंभों की आवश्यकता है?

शुभकामनाएँ!

अपडेट करें
प्रश्न की पूर्णता के लिए "तदर्थ प्रश्नों के लिए एक बड़ी तालिका पर प्रदर्शन में सुधार कैसे करें", यह ध्यान दिया जाना चाहिए कि हालांकि यह इस विशिष्ट मामले के लिए मदद नहीं करेगा, अगर कोई SQL सर्वर 2012 का उपयोग कर रहा है (या उस समय आने पर नया) और यदि तालिका को अद्यतन नहीं किया जा रहा है, तो कॉलमस्टोर इंडेक्स का उपयोग करना एक विकल्प है। उस नई सुविधा के बारे में अधिक जानकारी के लिए, यहां देखें:http://msdn.microsoft.com/en-us/library/gg492088.aspx (मेरा मानना ​​है कि इन्हें SQL सर्वर 2014 में अद्यतन करने योग्य बनाया गया था)।

अपडेट 2
अतिरिक्त विचार हैं:

  • संकलित अनुक्रमणिका पर संपीड़न सक्षम करें। यह विकल्प SQL Server 2008 में उपलब्ध हुआ, लेकिन केवल एंटरप्राइज़ संस्करण-सुविधा के रूप में। हालाँकि, SQL सर्वर 2016 के अनुसार SP1 , डेटा संपीड़न सभी संस्करणों में उपलब्ध कराया गया था! कृपया पंक्ति और पृष्ठ संपीड़न के विवरण के लिए डेटा संपीड़न के लिए MSDN पृष्ठ देखें।
  • यदि आप डेटा संपीड़न का उपयोग नहीं कर सकते हैं, या यदि यह किसी विशेष तालिका के लिए अधिक लाभ प्रदान नहीं करेगा, तो यदि आपके पास एक निश्चित-लंबाई प्रकार का कॉलम है (INT , BIGINT , TINYINT , SMALLINT , CHAR , NCHAR , BINARY , DATETIME , SMALLDATETIME , MONEY , आदि) और 50% से अधिक पंक्तियाँ NULL . हैं , फिर SPARSE . को सक्षम करने पर विचार करें विकल्प जो SQL सर्वर 2008 में उपलब्ध हो गया। कृपया विवरण के लिए विरल कॉलम का उपयोग करने के लिए MSDN पृष्ठ देखें।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. संग्रहीत कार्यविधि परिणाम सेट के लिए स्तंभ परिभाषा पुनर्प्राप्त करें

  2. SQL सर्वर में एकाधिक पंक्तियों से टेक्स्ट को एक टेक्स्ट स्ट्रिंग में कैसे संयोजित करें

  3. T-SQL का उपयोग कर SQL सर्वर में किसी तालिका के लिए स्तंभ विशेषाधिकार प्राप्त करें:sp_column_privileges

  4. SQL सर्वर में विशिष्ट वर्ण के बाद एक स्ट्रिंग को कैसे विभाजित करें और इस मान को विशिष्ट कॉलम में अपडेट करें

  5. डिज़ाइन द्वारा शून्य SQL गतिरोध - कोई कोडिंग पैटर्न?