如何获得此查询以输出表中的多个值

时间:2019-03-30 12:20:58

标签: sql oracle

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

我打算将其用作sql结果集的估计,例如,一个100字节的表有100行,它将计算出每行可能是1个字节。因此,带有where子句的返回25行的表上的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中每一行的值吗?

1 个答案:

答案 0 :(得分:2)

我认为您过于复杂了。就系统而言,Oracle系统视图ALL_TABLESAVG_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:最近分析此表的日期