我有一个查询,它将给定给定表名称的平均大小(以字节为单位)。
我打算将其用作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中每一行的值吗?
答案 0 :(得分:2)
我认为您过于复杂了。就系统而言,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
:最近分析此表的日期