今天上班用户反映数据库相应很慢。定位到一个全表扫描的表,查了一下50多万笔记录并且没有建任何索引。这个表是一个存储临时输入的表。正常情况下不应该超过150笔记录。删除异常的数据后。问题有缓解,但是操作系统命令看top发现cpu使用率依然很高。估计是因为高水标记的上升造成full table scan的效率下降。在业务不繁忙的时候将该表重建。问题解决。
知识点: 将盘区中的块想象成一列,则高水标记位于一个段使用的最后一个块,在删除数据后,高水标记并不会下降。全表扫描会扫描高水标记以下的所有块。这样当大批量删除数据的时候,全表扫描的效率将会下降,有的时候查空表会很慢就是这个原因。有两种方法可以下降高水标记,1用truncate来替代delete 语句。如果有dataguard的配置,则不能使用这个命令。2 重建表。
ps: 感谢lxz兄对我的斧正。
再次测试的时候,truncate 确实可以使用。产生的日志比delete较少。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/10522540/viewspace-353148/ ,如需转载,请注明出处,否则将追究法律责任。