答一、
最简单的办法可能是先分析数据库
可以用全库分析,看你的数据库到底大不大,如果太大,全库分析就不是好办法。
分析完后查询 dba_tables/user_tables即可
1.Analyze all tables
2.select sum(num_rows) from dba_tables
select table_name,num_rows from user_tables;
但不是最新的
在某些特定条件下才是最新的
使用stat的包来更新
或者
ANALYZE TABLE 表名 COMPUTE STATISTICS;
num_rows就是行数啊!
答二、
执行下面的角本,生成c:/mytext.sql的文件,运行c:/mytext.sql文件中的内容,可以得到当前用户下的所有表及表中的记录数
Connect UserID/PSW@NETServerName
set feedback off
set heading off
spool c:/mytext.sql
select decode(rownum,1,'','union')||' select'||''''||table_name||''''||',count(*)from '||table_name from user_tables;
spool off
答三、
如果你的用户没有dba权限, 使用以下语句:
EXECUTE DBMS_UTILITY.ANALYZE_DATABASE('COMPUTE');
SELECT OWNER, TABLE_NAME, NUM_ROWS FROM ALL_TABLES;
如果你的用户没有dba权限, 并且只想查看本用户的所有表的记录数(注意: 不是你说的"库中的所有表"), 改为:
EXECUTE DBMS_UTILITY.ANALYZE_SCHEMA('MYUSERNAME', 'COMPUTE');
SELECT OWNER, TABLE_NAME, NUM_ROWS FROM USER_TABLES;
注意: MYUSERNAME是你的用户名, 用大写.
之所以不把它做成一个函数, 是因为在数据量大时, ANALYZE是个很耗时的工作. 如果不是必须要求精确数字, 第二次及以后的统计可以使用前面的ANALYZE结果.
另一种方法:
SET ECHO OFF
SET HEAD OFF
SET LINESIZE 200
SET PAGESIZE 0
select 'SELECT ''' || TNAME || ''' TABNAME, COUNT(1) FROM ' || TNAME || ';' FROM TAB;
SPOOL C:/COUNTALL.SQL
/
SPOOL OFF
然后执行生成的COUNTALL.SQL
总:
下面的语句可以查出数据库中数据量较小的表:
SELECT * FROM (SELECT T.TABLE_NAME,SUM(NUM_ROWS) AS MYCOUNT FROM USER_TABLES T GROUP BY T.TABLE_NAME) WHERE MYCOUNT<100