অব্যবহৃত সূচীগুলি কীভাবে সন্ধান করবেন?


11

আমি একটি ডেটা গুদামে কাজ করছি। আমার কাছে 200M রেকর্ড সহ টেবিল রয়েছে। এর মধ্যে কয়েকটি টেবিলের প্রায় 20+ সূচী রয়েছে (সেগুলি প্রথম স্থানে তৈরি করার কারণটি আমি সরবরাহ করতে পারি না)। এটি এই সূচকগুলি বজায় রাখার কাজটিকে অত্যন্ত বেদনাদায়ক করে তুলছে এবং পারফরম্যান্স এবং রান টাইম উভয় ক্ষেত্রেই ডাব্লুএইচ আমদানি কাজের সরাসরি প্রভাব ফেলবে।

প্রতিটি টেবিলে আমি কীভাবে সর্বনিম্ন ব্যবহৃত সূচকগুলি খুঁজে পেতে পারি? (এগুলি থেকে মুক্তি পেতে)


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 টি সূচকের বেশি নয়, 20 টেবিলের জন্য স্থির / historicalতিহাসিক / সংরক্ষণাগারযুক্ত ডেটা যা ঘন ঘন পরিবর্তন হবে না।

আপনার যদি এখনও আমদানির গতির সমস্যা হয় তবে এমন একটি সময় থাকে যখন ডাটাবেসটি সক্রিয়ভাবে অনুসন্ধান করা হয় না (সম্ভবত এটি অফিসের সময়ের বাইরে)। সূচক বাদ দেওয়া, ডেটা আমদানি করা এবং তারপরে সূচকগুলি পুনরায় প্রয়োগ করা সুবিধাজনক হতে পারে। (পরিসংখ্যান অবশ্যই পুনরায় সেট করা হবে)) এর কারণ হ'ল প্রতিটি রেকর্ড প্রবেশের সাথে সাথে সূচি (এস) আপডেট করা হবে, পৃষ্ঠাগুলি পুনরায় সাজানো হবে এবং এতে সময় এবং ডিস্ক 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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.