如何构建显示段大小的查询

时间:2019-02-17 02:31:54

标签: sql oracle

我有一个数据库表,我需要利用表中的数据来告诉我有关数据库表中列出的表的段大小。

这里是其中一种数据的示例,它分为4列,并且有很多行:

TABLE_A    TABLE_B      JOIN_COND            WHERE_CLAUSE
AZ             AT       A.AR_ID = B.AR_ID     A.DE = 'AJS'
AZ1           AT1       A.AR_ID = B.AR_ID     A.DE = 'AJS' AND B.END_DATE > '30-NOV-2015'
AZ2           AT3       A.AR_ID = B.AR_ID     A.DE = 'AJS' AND B.END_DATE > '30-NOV-2015'

这是我需要完成的:

  1. 也许是某种循环?可以找到每个“ TABLE_A”的大小(以千字节为单位)。
  2. 构建一个查询,该查询将基于以下查询子集找到创建新表所需的数据(空间)估计值:

...

SELECT *
  FROM TABLE_A a, TABLE_B b
 WHERE A.AR_ID = B.AR_ID
   AND A.FININS_CDE = 'AJS'
   AND B.END_DTE > '30-NOV-2015'

...但是对于表中的每一行。因此,在过程结束时,如果表中有100行,我将得到200个结果:

  • 100行告诉我每个表A的大小
  • 100个结果告诉我带有WHERE子句的子集将占用的大小。

1 个答案:

答案 0 :(得分:1)

您将需要为此使用动态sql。 Oracle文档为here

您需要为每个表构建一些动态sql:

SELECT TABLE_A, 'select segment_name,segment_type,bytes/1024/1024 MB
 from dba_segments
 where segment_type=''TABLE'' and segment_name=''' ||  TABLE_A || ''''
FROM <your meta data table>

然后,您需要loop遍历结果集并执行每个语句并捕获结果。有关here的一些信息。

执行完所有语句后,您将得到1的答案。

下一部分比较棘手,您需要为每个列查找数据类型的大小,然后将所有这些值加在一起,就可以得到一张表的一行的大小。您可以使用vsize来获取每一列的大小。

使用更多的动态sql,您可以构建实际的语句并将其作为SELECT COUNT(*)执行以获取实际的行数。将行数乘以每个表中整行的大小,您将得到答案。显然,您还需要另一个循环。

这一切有意义吗?