日期:2014-05-17  浏览次数:20753 次

求解不带条件1.3秒,带条件0.016秒
在测试中,写错代码将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主键索引,当然就不太受表的高水位线影响。

------解决方案--------------------
引用:
-- 不知道楼主听说过“高水位线”这一说。
-- 你可以简单这么理解:类似于涨潮(或洪水)后,湖面曾经水位最高位置留下的痕迹。
-- 表也有这样的说法,具体请参数:
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;--关闭行移动;