首页 > 解决方案 > 如何让此查询输出表中的多个值

问题描述

我有一个查询,它将为我提供给定表名的平均大小(以字节为单位)。

我打算用它作为一个 sql 结果集的估计,例如,一个 100 字节的表有 100 行,它会计算出每行可能是 1 字节。因此,带有返回 25 行的 where 子句的表上的 select 可能估计为 25 个字节。

这是一个基本的容量规划器。在查看了其他可能的方法之后,我更喜欢与任何依赖统计数据的方法相比。

我已经尝试了下面的代码,它适用于 1 个表。

SELECT a.total_bytes / b.num_rows avg_row_size
FROM (SELECT SUM(bytes) total_bytes
FROM dba_extents
WHERE owner = 'KEVIN'
AND segment_name = 'KEVS_TABLE' ) a,
(SELECT COUNT(*) num_rows
FROM KEVS_TABLE) b 

但是,我希望它循环并为整个表负载提供结果。我试过了:

SELECT a.total_bytes / b.num_rows avg_row_size
FROM (SELECT SUM(bytes) total_bytes
FROM dba_extents
WHERE 
segment_name in (select table_name from table_list) ) a,
(SELECT COUNT(*) num_rows
FROM table_list) b 

但它什么也不返回。

有什么想法可以让它为 table_list 中的每一行返回一个值吗?

标签: sqloracle

解决方案


我认为你过于复杂了。就有关方面而言,Oracle 系统视图ALL_TABLES在列中为您提供了您正在寻找的信息AVG_ROW_LEN

文档说:

AVG_ROW_LEN- NUMBER:表中行的平均长度(以字节为单位)

注意:AVG_ROW_LENGTH仅当已在相应表上收集统计信息时才会填充。

因此,您应该能够使用如下查询:

SELECT table_name, avg_row_length FROM all_tables WHERE owner = 'KEVIN';

或者,如果您想检查当前架构中的所有表,只需使用USER_TABLES

SELECT table_name, avg_row_length FROM user_tables;

注意:请注意,ALL_TABLES(和USER_TABLES)包含许多其他对您的用例有用的信息,前提是最近分析了相关表,即接近实时的数据量,例如:

  • NUM_ROWS: 表中的行数
  • BLOCKS:表中使用的数据块数(您可以将其与承载表的表空间的块大小相乘,以计算其总大小(以字节为单位))
  • LAST_ANALYZED:最近分析此表的日期

推荐阅读