UnUsed Index
این اسکریپت لیستی از ایندکسهایی را فراهم میکند که در پایگاه داده عملاً مورد استفاده قرار نمیگیرند. ایندکسها میتوانند به صورت غیرضروری بار کاری سیستم را افزایش دهند و اگر یک ایندکس مورد استفاده قرار نگیرد اما بهروزرسانی شود، این امر باعث ایجاد بار اضافی روی پایگاه داده خواهد شد. در این اسکریپت به بررسی مواردی مثل جستجوها (seeks)، اسکنها (scans) و جستجوهای دقیق (lookups) پرداخته میشود. اگر هر سه مقدار صفر باشند و تعداد بهروزرسانیهای کاربر (User Updates) بیشتر از صفر باشد، این نشاندهنده آن است که منابع برای بهروزرسانی ایندکس مصرف میشوند اما بهرهای از آن برده نمیشود.
یک نکته مهم این است که دادههای مرتبط با ایندکسها از طریق Dynamic Management Views (DMVs) استخراج میشوند و این اطلاعات با هر بار راهاندازی مجدد SQL Server پاک میشوند. بنابراین، بهتر است اطمینان حاصل کنید که سرور SQL شما حداقل برای یک ماه به صورت مداوم در حال اجرا بوده تا دادههای کافی برای تحلیل جمعآوری شده باشد. همچنین، توصیه میشود همیشه کدهای حذف و بازسازی ایندکسها را ذخیره کنید، زیرا ممکن است در آینده به آن ایندکس نیاز پیدا کنید.
به یاد داشته باشید که قبل از اعمال هر گونه تغییر در ساختار ایندکسها، حتماً این تغییرات را ابتدا در محیط توسعه (Dev) تست کنید تا از بروز مشکلات احتمالی در محیط اصلی (Production) جلوگیری شود
-- Unused Index Script 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 and dm_ius.user_seeks = 0 and dm_ius.user_scans = 0 and dm_ius.user_lookups = 0 ORDER BY dm_ius.user_updates desc GO