有台SqlServer2000的主机,主要是用来纪录日志的。系统配置属于双核+2G,不算很高,目前数据文件大约在2G左右。高峰时每分钟100次写入左右。
这些天,系统在部分时间(不一定是高峰期),会出现大量的堵塞。堵塞每次持续时间最多5分钟,之后要么自己恢复,要么系统IO吃光。已经排除了病毒或者网络的问题。
利用sqlserver自带的“事件探查器”发觉大多数的阻塞都是跟其中的一个表有关。这个表数据有3M行的数据,并建立了聚合索引。
反复优化索引,系统没有起色。狠心删除了主键的聚合索引,问题竟奇迹般的解决了!
将聚合索引索引转为非聚合索引之后,系统再也没有出现故障。
分析下来大致如此:
- 系统纪录的日志文件是以时间倒序为聚合索引,但由于日志的记入方式决定了数据的纪录方式并非按照顺序。即会出现新纪录比旧纪录先写入的情况。
- 3百万行的数据大约有500~700M的磁盘空间占用,按照聚合索引占整体数据大小的30%来计,索引大小大约为200M左右。
- 由于聚合索引是按照固定的顺序纪录,出现乱序的数据写入,sqlserver就必须重建聚合索引,每次都要重新生成这200M。
- 200M的数据需要相当长的时间,在此期间如果再有数据记入,行锁就上升为表锁,故出现系统阻塞。而之前一直没有出现问题,只不过是由于数据小,而索引生成的很快罢了。
所以建议聚合索引的使用前请确认在大数据的情况下务必保证新加的数据都在文件的末尾,这样系统就不会因为频繁的重建索引而造成数据阻塞或者IO的浪费。
| anyShare分享到: | |
| |

#1 by 91526 on 2010年07月16日 - 00:15
不错
#2 by ps on 2010年07月22日 - 21:51
支持喽!博客不错!