这个是我加入的QQ群里面一个网友问的问题。他说一个表做一个INSERT都会超时。正困惑呢,向群里面的人求助。我刚好对这方面知道点,就回答了说要优化聚集索引。他不明白具体该怎么做,似乎也不知道什么是聚集索引。我对他说你可以看看你插入记录时的磁盘IO是否比较多,他说他的磁盘已经换成了RAID,不好查看磁盘IO。OK, 我继续替他分析道: 你那个insert慢是因为你每次插新记录,数据库服务器都要在中间的一个位置插入,引起磁盘文件的大量读写. 他说: 如何解决? 我的硬件配置已经没法升级了. 我说: 你可以看看聚集索引, 要优化聚集索引. 他似乎不太明白, 写了下面这写东西:
是这个吗:
use WanerSoft2007
declare @table_id int
set @table_id=object_id('dbo.Ws_UserProInfo')
dbcc showcontig(@table_id)
dbcc dbreindex('dbo.Ws_UserProInfo','',0)
declare @table_id int
set @table_id=object_id('dbo.Ws_UserProInfo')
dbcc showcontig(@table_id)
dbcc dbreindex('dbo.Ws_UserProInfo','',0)
我看了一下, 说这是重做索引的批处理,不是聚集索引.我继续说道:聚集索引是指记录的物理摆放次序即按照聚集索引来做的。是最重要的一个索引,聚集索引设计的好,多种数据库操作都可以获得好的性能。设计的不好就会引起性能上的巨大差异, 比如插入操作, 设计得好时,新记录只需要在物理的最后添加就可以了,不需要移动很多记录,所以快,设计得不好时,新记录就是在物理上的中间某个位置插入,那么就必须移动很多记录,就会有大量的磁盘IO。他去找了一会,回来给我贴了个图:
我看了图,对他说聚集索引要选用短的字段,还要单向递增,可以选日期,identity等。他这回就明白了,问是不是聚集索引里面去掉bookid和nclassid字段. 我说是,他照做了,后来回来说,太好了,问题解决了。