अप्रयुक्त इंडेक्स कैसे खोजें?


11

मैं एक डेटा वेयरहाउस पर काम कर रहा हूं। मेरे पास 200M तक के रिकॉर्ड हैं। इनमें से कुछ तालिकाओं में लगभग 20+ इंडेक्स होते हैं (मैं एक कारण नहीं बता सकता कि उन्हें पहले स्थान पर क्यों बनाया गया है)। यह इन सूचकांक को बनाए रखने के काम को बहुत दर्दनाक बना रहा है और प्रदर्शन और रन समय दोनों में DWH आयात की नौकरी पर सीधा प्रभाव पड़ता है।

मैं प्रत्येक तालिका पर कम से कम उपयोग किए गए अनुक्रमित कैसे पा सकता हूं? (इनसे छुटकारा पाने के लिए)


2
सिस्टम दृश्य sys.dm_db_index_usage_statsवह जानकारी प्रदान करता है।
नेनाद ज़िवकोविक

जवाबों:


10

इस स्क्रिप्ट को आज़माएं, इससे मुझे अतीत में मदद मिली है:

-- Unused Index Script
-- Original Author: Pinal Dave 
SELECT TOP 25
o.name AS ObjectName
, i.name AS IndexName
, i.index_id AS IndexID
, dm_ius.user_seeks AS UserSeek
, dm_ius.user_scans AS UserScans
, dm_ius.user_lookups AS UserLookups
, dm_ius.user_updates AS UserUpdates
, p.TableRows
, 'DROP INDEX ' + QUOTENAME(i.name)
+ ' ON ' + QUOTENAME(s.name) + '.'
+ QUOTENAME(OBJECT_NAME(dm_ius.OBJECT_ID)) AS 'drop statement'
FROM sys.dm_db_index_usage_stats dm_ius
INNER JOIN sys.indexes i ON i.index_id = dm_ius.index_id 
AND dm_ius.OBJECT_ID = i.OBJECT_ID
INNER JOIN sys.objects o ON dm_ius.OBJECT_ID = o.OBJECT_ID
INNER JOIN sys.schemas s ON o.schema_id = s.schema_id
INNER JOIN (SELECT SUM(p.rows) TableRows, p.index_id, p.OBJECT_ID
FROM sys.partitions p GROUP BY p.index_id, p.OBJECT_ID) p
ON p.index_id = dm_ius.index_id AND dm_ius.OBJECT_ID = p.OBJECT_ID
WHERE OBJECTPROPERTY(dm_ius.OBJECT_ID,'IsUserTable') = 1
AND dm_ius.database_id = DB_ID()
AND i.type_desc = 'nonclustered'
AND i.is_primary_key = 0
AND i.is_unique_constraint = 0
ORDER BY (dm_ius.user_seeks + dm_ius.user_scans + dm_ius.user_lookups) ASC

http://blog.sqlauthority.com/2011/01/04/sql-server-2008-unused-index-script-download/


10

मैंने पाया है कि ब्रेंट ओजर अनलिमिटेड की मुफ्त ब्लिट्जइंडेक्स स्क्रिप्ट (केेंद्र लिटिल द्वारा लिखित) अप्रयुक्त इंडेक्स को अलग करने का सबसे अच्छा तरीका है (साथ ही साथ अनुक्रमणिका जो कि जोड़े जाने के लिए फायदेमंद हैं, वे इंडेक्स जो अन्य इंडेक्स आदि के काम को दोहरा रहे हैं)

http://www.brentozar.com/blitzindex/

यह आपको बताएगा कि किसी भी इंडेक्स को कितनी बार पढ़ा गया है क्योंकि पिछली बार स्टेटिस्टिक काउंट्स रीसेट हो गए थे (या इंडेक्स बनाया गया था / फिर से बनाया गया था)।

मुझे लगता है कि ब्रेंट ओज़र को वेबकास्ट में यह कहते हुए याद आता है कि अंगूठे का एक अच्छा नियम एक तालिका के लिए 10 से अधिक अनुक्रमित नहीं है जिसे अक्सर पढ़ा जाता है, 20ish उन तालिकाओं के लिए जो स्थिर / ऐतिहासिक / संग्रहीत डेटा हैं जो अक्सर नहीं बदलेंगे।

यदि आप अभी भी आयात गति के साथ समस्या कर रहे हैं, तो एक समय है जब डेटाबेस को सक्रिय रूप से क्वेरी नहीं किया जा रहा है (शायद यह कार्यालय के समय से बाहर है)। यह सूचकांक को गिराने, डेटा को आयात करने और फिर सूचकांक को फिर से लागू करने के लिए फायदेमंद हो सकता है। (आंकड़े निश्चित रूप से रीसेट हो जाएंगे।) इसका कारण यह है कि सूचकांक (तों) को अपडेट किया जाएगा क्योंकि प्रत्येक रिकॉर्ड में जाता है, पृष्ठों को फिर से व्यवस्थित किया जाएगा और इसमें समय और डिस्क I / O लगता है। तालिका के एकल स्कैन के बाद अनुक्रमणिका का निर्माण करना ।

इंडेक्स के प्रकारों और इसमें शामिल आंकड़ों के आधार पर आपको कोई कठिन और तेज़ नियम प्रयोग नहीं करना पड़ सकता है। सूचकांक को नियमित रूप से समीक्षा की जानी चाहिए क्योंकि आवश्यकताएं / प्रश्न बदलते हैं।


1
मैंने इस स्क्रिप्ट को चलाया है, लेकिन काश इसकी व्याख्या करने के लिए एक सरल मार्गदर्शिका होती।
आयरिशचेयरमैन

0

इसे इस्तेमाल करे:

SELECT   OBJECT_NAME(S.[OBJECT_ID]) AS [OBJECT NAME], 
             I.[NAME] AS [INDEX NAME], 
             USER_SEEKS, 
             USER_SCANS, 
             USER_LOOKUPS, 
             USER_UPDATES 
    FROM     SYS.DM_DB_INDEX_USAGE_STATS AS S 
             INNER JOIN SYS.INDEXES AS I 
               ON I.[OBJECT_ID] = S.[OBJECT_ID] 
                  AND I.INDEX_ID = S.INDEX_ID 
    WHERE    OBJECTPROPERTY(S.[OBJECT_ID],'IsUserTable') = 1 

राज


0

मैंने राज की क्वेरी छोड़ने के लिए अंतिम उपयोग की तारीख और कोड जोड़ा है।

SELECT   OBJECT_NAME(S.[OBJECT_ID]) AS [OBJECT NAME], 
             I.[NAME] AS [INDEX NAME], type_desc,
             coalesce(last_user_seek,last_user_scan,last_user_lookup,last_system_scan,last_system_seek,last_system_lookup) as LastUsed,
             USER_SEEKS, 
             USER_SCANS, 
             USER_LOOKUPS, 
             USER_UPDATES ,
             last_user_seek,last_user_scan,last_user_lookup,last_system_scan,last_system_seek,last_system_lookup,
             'drop index ['+I.[NAME]+'] on ['+OBJECT_NAME(S.[OBJECT_ID])+'];' as DropStatement
    FROM     SYS.DM_DB_INDEX_USAGE_STATS AS S 
             INNER JOIN SYS.INDEXES AS I 
               ON I.[OBJECT_ID] = S.[OBJECT_ID] 
                  AND I.INDEX_ID = S.INDEX_ID 
    WHERE    OBJECTPROPERTY(S.[OBJECT_ID],'IsUserTable') = 1 
    order by type_desc,coalesce(last_user_seek,last_user_scan,last_user_lookup,last_system_scan,last_system_seek,last_system_lookup) desc
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.