求解不带条件1.3秒,带条件0.016秒 在测试中,写错代码将SEQ自增长到了60级万,突然发现select * from accounts_roles 这样要1.5-3秒,好吧里面只有5条数据。
手动将SEQ改回来后,依旧发现要很久,但是如果select * from accounts_roles where id>0只要0.016秒。
-- 当你删除表其记录(只剩下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;--关闭行移动;