怎样知道一个表什么时候有碎片?
- 查询超时,性能下降
- 磁盘活动增多
- 缓存利用不高
- 检查查询的I/O
- 在2000中使用DBCC SHOWCONTIG检查Scan density,在2005中使用动态管理视图sys.dm_db_index_physical_stats.
当使用INSERT、UPDATE或DELETE语句修改数据时就可能产生表碎片,随着时间的推移,每个页面都可能产生碎片。 如果一个查询是基于表扫描或部分基于表扫描,那么为了额外的页面读操作将为SQLServer创建很多的处理,从而导致CPU过高以致没有反应。 碎片整理的对象是索引页级的逻辑碎片,以确保最优性能。
索引碎片的影响有哪些?
它将降低性能;正常的查询会花费更长的时间去显示结果。如果查询参数是小的,基于取得的数据,查询优化器选择顺序扫描操作,一旦表有正确的索引将很快找到数据。表是否有正确的索引不总是一个很容易回答的问题,你不得不依赖于查看所有的执行计划或者和事件探查器一起使用索引优化向导。
怎样测量表的碎片并减少碎片?
在SQLServer2000里,可以使用DBCC SHOWCONTIG来显示一个表的scan density和碎片级别。如果该语句带上WITH TABLERESULTS子句,那么它将显示一个额外信息的行集。DBCC INDEXDEFRAG和DBCC DBREINDEX语句用来减少碎片是最好的语句。
DBCC INDEXDEFRAG将整理索引的页级,这将使页的物理顺序和页节点的逻辑顺序相匹配。该语句每隔5分钟向用户报告预计完成的百分比。
即使正确地创建了索引,随着时间的推移,由于通过INSERT、UPDATE、DELETE操作引起的碎片往往引起性能问题。碎片(页面上的自由空间)的结果在为了一个特定的数据集使用查询参数时将导致内存使用不正确。