统计表中数据量大小

本文介绍如何使用MySQL的information_schema数据库来查询特定表的空间占用情况,包括数据大小和索引大小。

mysql> SELECT sum(DATA_LENGTH+INDEX_LENGTH),sum(TABLE_ROWS) FROM TABLES WHERE TABLE_NAME like '%his';  

 

 

如果想知道MySQL数据库中每个表占用的空间、表记录的行数的话,可以打开MySQL的 information_schema 数据库。在该库中有一个 TABLES 表,这个表主要字段分别是:

TABLE_SCHEMA : 数据库名
TABLE_NAME:表名
ENGINE:所使用的存储引擎
TABLES_ROWS:记录数
DATA_LENGTH:数据大小
INDEX_LENGTH:索引大小

其他字段请参考MySQL的手册,我们只需要了解这几个就足够了。

所以要知道一个表占用空间的大小,那就相当于是 数据大小 + 索引大小 即可。

SQL:

 

SELECT TABLE_NAME,DATA_LENGTH+INDEX_LENGTH,TABLE_ROWS FROM TABLES WHERE TABLE_SCHEMA='数据库名' AND TABLE_NAME='表名'

### 如何在 Oracle 数据库中统计表数据量 #### 使用 `ANALYZE` 命令获取统计数据 为了计算特定中的数据量,可以使用 `ANALYZE TABLE ... COMPUTE STATISTICS` 语句。这会更新有关该及其索引的各种元数据信息,包括行数、块数以及平均行长度等重要指标[^1]。 ```sql ANALYZE TABLE employees COMPUTE STATISTICS; ``` 此命令执行完毕后,可以通过查询 `USER_TABLES` 或者 `ALL_TABLES` 视图来查看最新的统计信息: ```sql SELECT num_rows FROM USER_TABLES WHERE table_name='EMPLOYEES'; ``` 对于整个模式下的所有格批量处理,则可通过创建存储过程实现自动化操作。下面是一个示例性的 PL/SQL 存储过程定义: ```plsql CREATE OR REPLACE PROCEDURE analyze_all_tables AS BEGIN FOR rec IN (SELECT table_name FROM user_tables) LOOP EXECUTE IMMEDIATE 'ANALYZE TABLE ' || rec.table_name || ' COMPUTE STATISTICS'; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Error analyzing table ' || rec.table_name); END LOOP; END; / ``` 需要注意的是,在较新的版本中推荐采用 `DBMS_STATS.GATHER_TABLE_STATS()` 函数代替传统的 `ANALYZE` 方法来进行更精确高效的统计收集工作。 #### 动态性能视图查询实时数据量 除了通过上述方式定期刷新统计外,还可以利用动态性能视图(`V$TABLESPACE`, `V$SEGMENT_STATISTICS`)即时获得某些对象当前占用的空间大小情况。例如要了解某段时间内某个空间内的各个段(segment)的变化趋势,可参照如下 SQL 片段构建历史记录并加以分析[^2] : ```sql CREATE TABLE top_get_table_data AS SELECT SYSDATE AS riqi, owner, segment_name, ROUND(SUM(bytes)/1024/1024,2) MB FROM dba_segments GROUP BY owner,segment_name; -- 定期插入新纪录以便跟踪变化... INSERT INTO top_get_table_data(riqi,owner,segment_name,mb) WITH latest_stats AS ( SELECT owner, segment_name, SUM(bytes)/1024/1024 mb FROM dba_segments GROUP BY owner,segment_name ) SELECT SYSDATE, ls.owner, ls.segment_name, ls.mb FROM latest_stats ls LEFT JOIN top_get_table_data t ON ls.owner=t.owner AND ls.segment_name=t.segment_name WHERE t.riqi IS NULL; -- 只添加最新未记录过的条目 ``` 以上方法提供了两种不同角度去理解和掌握Oracle数据库内部各张的实际容量状况;一种是从静态的角度出发基于预先建立好的统计资料来做决策支持,另一种则是借助于系统自带的监视工具集捕捉瞬时状态用于短期规划调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值