判断空表

QQ群里有人问有150个表,如何快速判断哪些是空表。鉴于早上刚对某个表(近600W条记录)没加条件地count(*),心有余悸地想到用extent去判断。

select segment_name,segment_type,bytes,blocks,extents from user_segments where segment_type='TABLE';

extent=1的就是空表

马上就有人提醒说有可能只有几条记录的表也是只有1个extent,当然还有高水位问题

hr@ORCL>delete from dropme;

1225043 rows deleted.

hr@ORCL>commit;

Commit complete.

hr@ORCL>select segment_name,bytes,blocks,extents from user_segments;

SEGMENT_NAME EXTENTS
------------------------------ ----------
DROPME 84


这才意识到依靠extent来判断是否是空表是不靠谱的

最后弄了条PLSQL才算是正式解决了这一问题

create or replace procedure check_is_null_table is
n_num number;
cursor user_table_cur is
select table_name from user_tables;
v_sql varchar2(200);
begin
for i in user_table_cur loop
v_sql:='select count(*) from '||i.table_name||' where rownum=1';
execute immediate v_sql
into n_num;
if n_num=0 then
dbms_output.put_line(i.table_name);
end if;
end loop;
exception when others then
dbms_output.put_line(v_sql);
end check_is_null_table;

总结了一下,虽然我自己知道delete不释放空间,自己也碰到过delete后表空间仍然不足的问题。很显然这里换了个方式我就忘记了。


你可能感兴趣的:(sql,qq,user,table,null,delete)