使用Oracle SQL Developer编写SQL查询显示所有表及行数的方法
在Oracle SQL Developer中查询所有表及对应行数的方法
嘿,这个需求在日常数据库操作里挺常见的,我给你分享两种靠谱的实现方式,在Oracle SQL Developer里直接就能用:
方法一:利用系统视图快速获取(基于统计信息)
Oracle自带的系统视图里存储了表的基础元数据,其中num_rows字段记录了表的行数——不过要注意,这个数值是基于最近一次收集的统计信息,并非实时数据。如果你的数据库定期更新统计信息,这个方法速度极快,适合快速做表信息盘点。
根据你需要查询的范围,选对应的视图就行:
user_tables:仅显示当前登录用户拥有的表all_tables:显示当前用户有权限访问的所有表dba_tables:显示数据库中所有表(需要DBA权限)
举个查询当前用户表的例子:
SELECT table_name, num_rows FROM user_tables ORDER BY table_name;
如果要查所有有权限的表,加上用户(owner)字段会更清晰:
SELECT owner, table_name, num_rows FROM all_tables ORDER BY owner, table_name;
要是觉得num_rows的数据不够新,可以执行命令更新统计信息(需要对应权限):
-- 更新单张表的统计信息 EXEC DBMS_STATS.GATHER_TABLE_STATS('你的用户名', '目标表名'); -- 更新当前用户所有表的统计信息 EXEC DBMS_STATS.GATHER_SCHEMA_STATS('你的用户名');
方法二:实时计算行数(精准但耗时)
如果需要绝对实时、精准的行数,就得对每个表执行COUNT(*)。这种方法对大数据表会比较慢,但结果完全准确。
用下面的SQL就能实现(以当前用户表为例):
SELECT table_name, TO_NUMBER( EXTRACTVALUE( DBMS_XMLGEN.GETXMLTYPE('SELECT COUNT(*) AS row_count FROM ' || table_name), '/ROWSET/ROW/ROW_COUNT' ) ) AS real_time_row_count FROM user_tables ORDER BY table_name;
小提醒
- 要是查询其他用户的表,记得在表名前加上用户名,比如把
'SELECT COUNT(*) FROM ' || table_name改成'SELECT COUNT(*) FROM ' || owner || '.' || table_name,同时确保你有该表的查询权限。 - 大数据表用方法二会消耗较多数据库资源,建议在业务低峰期执行。
内容的提问来源于stack exchange,提问作者Trendy Cloud




