से MSDN :
" आरोही या अवरोही कुंजी कॉलम पर आरोहण या अवरोही कुंजी कॉलम पर ऑपरेशंस ऑवर डालें
, जैसे कि IDENTITY या रियल-टाइम टाइमस्टैम्प कॉलम, क्वेरी ऑप्टिमाइज़र की तुलना में अधिक लगातार आँकड़ों के अपडेट की आवश्यकता हो सकती है। ऑपरेशंस को नए मानों को आरोही या अवरोही कॉलम में जोड़ें। । आँकड़े अद्यतन को ट्रिगर करने के लिए जोड़ी गई पंक्तियों की संख्या बहुत कम हो सकती है। यदि आंकड़े अद्यतित नहीं हैं और सबसे हाल ही में जोड़ी गई पंक्तियों से चुनिंदा क्वेरीज़ हैं, तो वर्तमान आँकड़ों में इन नए मूल्यों के लिए कार्डिनैलिटी अनुमान नहीं होगा। यह गलत कार्डिनलिटी अनुमान और धीमी क्वेरी प्रदर्शन के परिणामस्वरूप।
उदाहरण के लिए, एक क्वेरी जो सबसे हालिया बिक्री आदेश तिथियों में से चयन करती है, उसमें त्रुटिपूर्ण कार्डिनैलिटी का अनुमान गलत होगा, यदि हाल ही के बिक्री ऑर्डर तारीखों के लिए कार्डिनैलिटी अनुमानों को शामिल करने के लिए आंकड़े अपडेट नहीं किए गए हैं।
रखरखाव संचालन के
बाद, डेटा के वितरण को बदलने वाली रखरखाव प्रक्रियाओं को करने के बाद आंकड़ों को अपडेट करने पर विचार करें, जैसे कि तालिका को छोटा करना या बड़ी प्रतिशत पंक्तियों का बल्क इंसर्ट करना। यह क्वेरी प्रोसेसिंग में भविष्य की देरी से बच सकता है जबकि प्रश्न स्वचालित सांख्यिकी अपडेट की प्रतीक्षा करते हैं। "
आप अपने सिस्टम पर समय-समय पर "EXEC sp_updatestats" का उपयोग कर सकते हैं (कुछ समय निर्धारित करें) या सभी वस्तुओं पर फ़ंक्शन STATS_DATE का उपयोग करें और देखें कि उनके आँकड़े वास्तव में पिछली बार कब अपडेट किए गए थे और यदि तब से बहुत अधिक था, तो UPDATE का उपयोग करें उस विशेष वस्तु के लिए सांख्यिकी। मेरे अनुभव में, यहां तक कि स्वचालित आंकड़ों के सक्षम होने के बावजूद, हम अभी भी समय-समय पर आँकड़े अपडेट करने के लिए मजबूर होते हैं, क्योंकि उन कार्यों के कारण जो स्वचालित अपडेट को ट्रिगर नहीं करते थे।
मेरे व्यक्तिगत कोड को जोड़ने के लिए (साप्ताहिक नौकरी में इस्तेमाल किया जाता है जो आंकड़े अपडेट के लिए गतिशील बयान बनाता है):
select distinct
'update statistics [' + stats.SchemaName + '].[' + stats.TableName + ']'
+ case when stats.RowCnt > 50000 then ' with sample 30 percent;'
else
';' end
as UpdateStatement
from (
select
ss.name SchemaName,
so.name TableName,
so.id ObjectId,
st.name AS StatsName,
STATS_DATE(st.object_id, st.stats_id) AS LastStatisticsUpdateDate
, si.RowModCtr
, (select case si2.RowCnt when 0 then 1 else si2.RowCnt end from sysindexes si2 where si2.id = si.id and si2.indid in (0,1)) RowCnt
from sys.stats st
join sysindexes si on st.object_id = si.id and st.stats_id = si.indid
join sysobjects so on so.id = si.id and so.xtype = 'U' --user table
join sys.schemas ss on ss.schema_id = so.uid
) stats
where cast(stats.RowModCtr as float)/cast(stats.RowCnt as FLOAT)*100 >= 10 --more than 10% of the rows have changed
or ( --update statistics that were not updated for more than 3 months (and rows no > 0)
datediff(month, stats.LastStatisticsUpdateDate, getdate()) >= 3
and stats.RowCnt > 0
)
यहां मुझे वे सभी ऑब्जेक्ट मिलते हैं जहां 3 से अधिक महीनों के लिए अपडेट नहीं किए गए थे या पिछले आंकड़ों के अपडेट के बाद इसमें 10% से अधिक पंक्तियां थीं।
where col=(cast @var...)
) और@var
हो सकते हैं'%'
। मुझे सिर्फ एक या दो सप्ताह पहले यह विरासत में मिला है, और इसे तब तक मूल रूप से काम करने की आवश्यकता है जब तक इसे प्रतिस्थापित नहीं किया जाता है। लिंक के लिए धन्यवाद, मैं इसे एक चक्कर दूंगा।