SQLServer2005点菜攻略怎样评估和管理索引?
SQLServer2005怎样评估和管理索引?--王成辉翻译整理,转贴请注明出处 问题:SQLServer2005怎样评估和管理索引?
(1)怎样知道索引是否有用?它们是怎样使用的?
(2)哪些表和索引是没用或者很少用的?
(3)索引维护的成本与它的性能比多少合适?
(4)存在索引争夺吗?
(5wrc赛车)更多的索引好还是更少的索引好?白带有血丝是什么原因
回答:SQLServer2005动态管理视图(DMVs)返回会话、事务、请求的服务器状态信息。它可用于诊断、内存和过程调优、监控(SQLServer2000不支持)。儿童疱疹图片SQLServer引擎跟踪详细的资源使用情况,用lect语句从DMVs中可查到,但是这些信息不会长期驻留在磁盘上。 由于索引提供了代替表扫描的一个选择,且DMVs返回索引使用计数,所以可以比较索
引的成本和其性能。这个比较包括保持索引最新的成本,与使用索引而不是表扫描读数据的性能之比。谨记一个更新或删除操作先要读数据从而定位数据,然后对定位的数据进行写操作。一个插入操作在所有的索引上只是写操作。因此,一个大量的插入将使写操作次数超过读操作次数。一个大量的更改操作(包括更新和删除),读和写的次数通常很接近(假定没有‘记录找不到’的情况发生)。一个大量的读操作,读的次数将超过写。引用约束如外键还要求额外的读操作(对于插入、更新、删除而言)去确保引用完整性得到维护。
(1班级优化)怎样知道索引是否有用?它们是怎样使用的? 首先来看看索引是否是有用的。DDL是用来创建对象(如索引)且更新目录的。创建索引不是使用索引,所以在索引相关的DMVs不会有记录,除非索引真正被使用。当一个索引被Select、 Inrt对账函、 Update或者 Delete引用时,会被sys.dm_db_index_usage_stats捕获。如果运行一个典型的SQLServer使用周期后,所有的有用的索引都会记录在sys.dm_db_index_usage_stats中。这样,任何一个在sys.dm_db_index_usage_stats中找不到的索引就是没用的索引(在最近的一个SQLServer使用周期里)。未使用的索引可通过下面的方式找到:
司法鉴定意见书 (2)哪些表和索引是没用或者很少用的? ------ 未使用的表和索引。表都有一个索引ID,如果是0则为堆表,1则为聚集索引
Declare @dbid int
Select @dbid = db_id('Northwind')Select objectname=object_name(i.object_id) , indexname=i.name, i.index_id from sys.indexes i, sys.objects o where objectproperty(o.object_id,'IsUrTable') = 1and i.index_id NOT IN (lect s.index_id from sys.dm_db_index_usage_stats s where s.object_id=i.object_id and i.index_id=s.index_id and databa_id = @dbid )and o.object_id = i.object_idorder by objectname,i.index_id,indexname asc
使用很少的索引和频繁使用的索引一样,都会记录在sys.dm_db_index_usage_stats中。为了找出这些索引,需要查看诸如ur_eks、 ur_scans、 ur_lookups和ur_updates的列。
--- 使用很少的索引排在最先
declare @dbid intlect @dbid = db_id()
lect objectname=object_name(s.object_id), s.object_id, indexname=i.name, i.index_id
, ur_eks, ur_scans, ur_lookups, ur_updatesfrom sys.dm_db_index_usage_stats s, sys.indexes iwhere databa_id = @dbid and objectproperty(s.object_id,'IsUrTable') = 1and i.object_id = s.object_idand i.index_id = s.index_idorder by (ur_eks + ur_scans + ur_lookups + ur_updates) asc
(3)索引维护的成本与它的性能比多少合适? 如果一个表是频繁更改的而又有很少用到的索引,那么维护索引的成本将超过索引带来的好处。为了比较成本和其好处,可以如下使用表值函数sys.dm_db_index_operational_stats:
--- sys.dm_db_index_operational_stats
declare @dbid int
lect @dbid = db_id()
lect objectname=object_name(s.object_id), indexname=i.name, i.index_id , reads=range_scan_count + singleton_lookup_count , 'leaf_writes'=leaf_inrt_count+leaf_update_count+ leaf_delete_count , 'leaf_page自我鉴定毕业生登记表
_splits' = leaf_allocation_count , 'nonleaf_writes'=nonleaf_inrt_count + nonleaf_update_count + nonleaf_delete_count , 'nonleaf_page_splits' = nonleaf_allocation_countfrom sys.dm_db_index_operational_stats (@dbid,NULL,NULL,NULL) s, sys.indexes iwhere objectproperty(s.object_id,'IsUrTable') = 1and i.object_id = s.object_idand i.index_id = s.index_idorder by reads desc, leaf_writes, nonleaf_writes --- sys.dm_db_index_usage_statslect objectname=object_name(s.object_id), indexname=i.name, i.index_id ,reads=ur_eks + ur_scans + ur_lookups ,writes = ur_updatesfrom sys.dm_db_index_usage_stats s, sys.indexes iwhere objectproperty(s.object_id,'IsUrTable') = 1and s.object_id = i.object_idand i.index_id = s.index_idand s.databa_id = @dbidorder by reads descgo