sql - 如何让此查询输出表中的多个值
问题描述
我有一个查询,它将为我提供给定表名的平均大小(以字节为单位)。
我打算用它作为一个 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 中的每一行返回一个值吗?
解决方案
我认为你过于复杂了。就有关方面而言,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
:最近分析此表的日期
推荐阅读
- c++ - 如何减少活动变量的数量;直接调用lambda?
- ios - 如何正确使用带有本地标识符的获取资产?
- scala - Scala ZIO Stream——将 Stream[A] 转换为 Stream[B],其中一个 A 产生零个或多个 B
- python - 使用 PySerial 进行串行通信
- c - 从内核系统调用获取用户空间 RBP 寄存器
- javascript - 使用 if 语句确定 Firebase 用户是否可以访问某些 React Router 路径
- r - 为不同的数据框列表动态标记
- sql - 根据查询结果查询设置变量
- python - shell_exec 执行不好
- ide - 在哪里使用 Nim (linux) 编程?