استخراج ایندکسهای پیشنهادی و گمشده دیتابیس با تحلیل DMV های SQL Server (Find Missing Indexes Using SQL Server Dynamic Management Views (DMVs))
موتور SQL Server به طور خودکار کوئریهای فاقد ایندکس مناسب را در حافظه خود ارزیابی میکند. این اسکریپت با تحلیل اطلاعات DMV، مهمترین ایندکسهای پیشنهادی را همراه با دستور آماده CREATE INDEX استخراج میکند.
Queries SQL Server DMVs to generate actionable CREATE INDEX statements for queries suffering from high cost due to missing indexes.
پیشنیازها و وابستگیها (Dependencies)
SQL Server 2012+ (Requires VIEW SERVER STATE permission)-- استخراج ایندکسهای به شدت مورد نیاز بر اساس کوئریهای اجرا شده
SELECT TOP 20
ROUND(s.avg_total_user_cost * s.avg_user_impact * (s.user_seeks + s.user_scans), 0) AS [ImpactScore],
s.user_seeks AS [UserSeeks],
s.avg_user_impact AS [AvgUserImpactPercent],
d.statement AS [TableName],
ISNULL(d.equality_columns, '') AS [EqualityColumns],
ISNULL(d.inequality_columns, '') AS [InequalityColumns],
ISNULL(d.included_columns, '') AS [IncludedColumns],
'CREATE NONCLUSTERED INDEX IX_' + OBJECT_NAME(d.object_id) + '_' + REPLACE(REPLACE(REPLACE(ISNULL(d.equality_columns,''),', ','_'),'[',''),']','') +
' ON ' + d.statement + ' (' + ISNULL(d.equality_columns,'') +
CASE WHEN d.equality_columns IS NOT NULL AND d.inequality_columns IS NOT NULL THEN ', ' ELSE '' END +
ISNULL(d.inequality_columns, '') + ')' +
ISNULL(' INCLUDE (' + d.included_columns + ')', '') AS [CreateIndexStatement]
FROM sys.dm_db_missing_index_groups g
JOIN sys.dm_db_missing_index_group_stats s ON s.group_handle = g.index_group_handle
JOIN sys.dm_db_missing_index_details d ON d.index_handle = g.index_handle
WHERE d.database_id = DB_ID()
ORDER BY [ImpactScore] DESC;
کد مکمل یا نمونه استفاده همراه (Companion / Setup Code)
مشاهده کد
-- بررسی ایندکسهای بدون استفاده که فقط بار نگهداری اضافه دارند (Unused Indexes)
SELECT
OBJECT_NAME(s.[object_id]) AS [Table],
i.name AS [Index],
s.user_updates AS [WriteOperations],
s.user_seeks + s.user_scans + s.user_lookups AS [ReadOperations]
FROM sys.dm_db_index_usage_stats s
JOIN sys.indexes i ON i.[object_id] = s.[object_id] AND i.index_id = s.index_id
WHERE s.database_id = DB_ID() AND OBJECTPROPERTY(s.[object_id], 'IsUserTable') = 1
ORDER BY [WriteOperations] DESC;
نکات کلیدی و ترفندها (Tips & Notes)
قبل از اعمال هر ایندکس پیشنهادی، همپوشانی آن با ایندکسهای فعلی را بسنجید تا از ایندکسگذاری بیش از حد (Over-indexing) روی جداول پرتراکنش جلوگیری شود.