在测试中,写错代码将SEQ自增长到了60级万,突然发现select * from accounts_roles 这样要1.5-3秒,好吧里面只有5条数据。
手动将SEQ改回来后,依旧发现要很久,但是如果select * from accounts_roles where id>0只要0.016秒。
表里只有ID主键,通过触发器ID自增长。
求解怎么怎么才能弄回来。。。百度的下好像要做什么表分析?用的11G。
Oracle?11g select
------解决方案--------------------
-- 不知道楼主听说过“高水位线”这一说。
-- 你可以简单这么理解:类似于涨潮(或洪水)后,湖面曾经水位最高位置留下的痕迹。
-- 表也有这样的说法,具体请参数:
http://www.cnblogs.com/linjiqin/archive/2012/01/15/2323030.html
-- 当你删除表其记录(只剩下5条记录)时,表的高水位线默认是没有变化的,此时,
-- 如果你select * from accounts_roles要走全表扫描,且扫描同样多的数据块,
-- 所以你会感觉执行效率跟没删除记录行时差别不大。
-- 而你如果select * from accounts_roles where id>0的时候,表走的是ID主键索引,当然就不太受表的高水位线影响。
------解决方案--------------------
楼上分析到位,楼主可以通过收缩或重建表的方式解决空闲空间的问题!
----收缩表
alter table accounts_roles enable row movement;--启动行移动;
alter table accounts_roles shrink space cascade;--收缩空间;
alter table accounts_roles disable row movement;--关闭行移动;