我们在数据库性能方面遇到问题,并且我在.NET Profilers方面具有丰富的经验,并且总是在应用程序上执行分析,但是就像很多开发人员一样,我现在要等到很晚(出现问题时)才能开始分析并尝试收集有关如何解决此问题的数据。
这可能不会只是“帮助我是DB IDIOT”帖子的一站式回答,而是寻找个人指导,建议和有关如何查找问题的经验的任何指导。
至于我们使用SQL 2005进行的设置,我在生产中的访问权限非常有限,只能通过门户界面运行SQL数据库引擎优化顾问和SQL事件探查器,我可以复制和粘贴,仅此而已。我想做的关键一件事是获得生产查询和调用的真实快照,以便我可以在较低的环境中将它们加载到调整引擎中,这样我就可以尝试钉住数据库,以便从引擎调整中获得建议。顾问。
该脚本可用于确定您是否选择了正确的索引。您需要查看索引用于查找的频率,并将其与索引更新的频率进行比较。寻求性能是以更新性能为代价的。更糟糕的是,当索引频繁更新时,会导致索引碎片化,并且统计信息过时。
您还应该将range_scan_count与singleton_lookup_count进行比较。在单例查找之前,最好进行范围扫描。单例查找可能是索引查找和键查找操作的原因。也就是说,对于在索引搜索中找到的每一行,sql都会在聚簇索引中查找数据页,这可以说成千上万,但不能用于数百万行。
CREATE PROCEDURE [ADMIN].[spIndexCostBenefit] @dbname [nvarchar](75) WITH EXECUTE AS CALLER AS --set @dbname='Chess' declare @dbid nvarchar(5) declare @sql nvarchar(2000) select @dbid = convert(nvarchar(5),db_id(@dbname)) set @sql=N'select ''object'' = object_name(iu.object_id, iu.database_id) , i.name ,''user reads'' = iu.user_seeks + iu.user_scans + iu.user_lookups ,''system reads'' = iu.system_seeks + iu.system_scans + iu.system_lookups ,''user writes'' = iu.user_updates ,''system writes'' = iu.system_updates from '+ @dbname + '.sys.dm_db_index_usage_stats iu ,' + @dbname + '.sys.indexes i where iu.database_id = ' + @dbid + ' and iu.index_id=i.index_id and iu.object_id=i.object_id and (iu.user_seeks + iu.user_scans + iu.user_lookups)<iu.user_updates order by ''user reads'' desc' exec sp_executesql @sql set @sql=N'SELECT ''object'' = object_name(o.object_id, o.database_id), o.index_id, ''usage_reads'' = user_seeks + user_scans + user_lookups, ''operational_reads'' = range_scan_count + singleton_lookup_count, range_scan_count, singleton_lookup_count, ''usage writes'' = user_updates, ''operational_leaf_writes'' = leaf_insert_count + leaf_update_count + leaf_delete_count, leaf_insert_count, leaf_update_count, leaf_delete_count, ''operational_leaf_page_splits'' = leaf_allocation_count, ''operational_nonleaf_writes'' = nonleaf_insert_count + nonleaf_update_count + nonleaf_delete_count, ''operational_nonleaf_page_splits'' = nonleaf_allocation_count FROM ' + @dbname + '.sys.dm_db_index_operational_stats(' + @dbid + ', NULL, NULL, NULL) o, ' + @dbname + '.sys.dm_db_index_usage_stats u WHERE u.object_id = o.object_id AND u.index_id = o.index_id ORDER BY operational_reads DESC, operational_leaf_writes, operational_nonleaf_writes' exec sp_executesql @sql GO