为了保证快速访问数据,SQLServer和其他关系数据库系统一样,使用索引来快速查找数据。SQLServer可以创建聚簇索引、非聚簇索引、XML索引和全文索引等不同类型的索引。拥有多个索引的好处是,如果有合适的索引,SQLServer可以快速访问数据。索引太多的坏处是SQLServer要维护这些索引,维护也是需要成本的,而且索引还需要额外的存储空间。因此,索引对于性能来说是一把双刃剑。接下来,让我们看看如何识别存在但未使用的索引,然后删除它们以减少存储需求。我们知道SQLServer2005增加了DMVs——DynamicManagementViews,它可以让你更深入地了解SQLServr中发生了什么,其中一些是用来查看索引是如何使用的,我们讨论两个DMVs,注意这些视图存储累积的数据,所以当SQLServer重置状态时,计数器会归0,所以在监控索引使用情况的时候要注意这些。DMV-sys.dm_db_index_operational_stats这个DMV允许你查看索引各个方面的插入、更新和删除,基本上它会显示在基于数据的修改方面维护索引所做的大量工作。如果您对表的查询返回所有列,输出可能会令人困惑,所以让我们关注一些列。对于其他列,请参阅在线图书SELECTOBJECT_NAME(A.[OBJECT_ID])AS[OBJECTNAME],I.[NAME]AS[INDEXNAME],A.LEAF_INSERT_COUNT,A.LEAF_UPDATE_COUNT,A.LEAF_DELETE_COUNTFROMSYS.DM_DB_INDEX_OPERATIONAL_STATS(db_id(),NULL,NULL,NULL)AINNERJOINSYS.INDEXESASIONI.[OBJECT_ID]=A.[IDB=A.INDEX_IDWHEREOBJECTPROPERTY(A.[OBJECT_ID],'IsUserTable')=1下面我们可以看到每个索引上发生的插入、更新和删除的次数,所以这表明SQLServer花费了大量的工作并且必须维护索引DMV–sys.dm_db_index_usage_stats这个DMV显示了索引在用户查询中被使用了多少次。其他专栏请参考联机丛书。SELECTOBJECT_NAME(S.[OBJECT_ID])AS[OBJECTNAME],I.[NAME]AS[INDEXNAME],USER_SEEKS,USER_SCANS,USER_LOOKUPS,USER_UPDATESFROMSYS.DM_DB_INDEX_USAGE_STATSASSINNERJOINSYS.INDEXESASIONI.[OBJECT_ID]=S.[OBJECT_ID]ANDI.INDEX_ID=S.INDEX_IDWHEREOBJECTPROPERTY(S.[OBJECT_ID],'IsUserTable')=1ANDS.database_id=DB_ID()我们使用了seeks,scans,lookupsandupdatesseekssearch是指在Index上进行了多少次IndexSeek,seek是最快的访问方式数据。scansscan是指对索引进行索引扫描的次数。Scan就是从多行数据中找出你想要的数据。应尽可能避免扫描。lookupslookup是指多少次查询所需的数据来自Clusteredindexorheapupdates是指多少次索引因数据更新而改变。根据上面的输出结果,我们关注第二个查询,可以看到这个索引没有发生seeks、scans和lookups,但是发生了updates,也就是说SQLServer在满足查询的时候并没有使用这个索引,但是它仍然需要维护它。请记住,当SQLServer重新启动时,需要从DMV获取这些数据。重置,为了确定应该保留或删除哪个索引,请确保您收集了足够长的时间段的数据。原文链接:http://www.searchdatabase.com.cn/showcontent_88474.htm
