如何从多个架构的所有表中获取所有列的最小,最大,平均统计值?

时间:2019-05-16 21:38:00

标签: sql oracle

在sys.dba_tab_columns视图中存在低值和高值问题,因为它们都显示错误的值。

我将此问题追溯到内核,该内核从x $ kxttstecs内核状态表中收集信息。 如何通过从多个用户的多个表中选择所有列的最小值/最大值/平均值来解决此问题? 还要使其自动更新为数据库统计视图吗? 您能帮我一个功能还是以某种方式修改内核状态表?

我有一个SQL代码:

SELECT 
ROWNUM AS ROW_ID,
sys.dba_tab_columns.OWNER,
sys.dba_tab_columns.table_name AS TABLE_NAME, 
sys.dba_tab_columns.column_name AS COLUMN_NAME,
decode(data_type, 'NUMBER',   sys.dba_tab_columns.low_value,
                                  NULL) AS LOW_VALUE,
decode(data_type, 'NUMBER',   sys.dba_tab_columns.high_value,
                                  NULL) AS HIGH_VALUE
FROM sys.dba_tab_columns
WHERE sys.dba_tab_columns.OWNER = 'HR' OR sys.dba_tab_columns.OWNER ='XY';

我从LOW_VALUE和HIGH_VALUE那里获得了不正确的数据。

TABLE_NAME | COLUMN_NAME | LOW_VALUE | HIGH_VALUE
DEPARTMENTS | DEPARTMENT_ID | C10B | C20347
EMPLOYEES | DEPARTMENT_ID | C10B | C2020B
JOB_HISTORY | DEPARTMENT_ID | C115 | C2020B

表中的实际值:

LOW_VALUE | HIGH_VALUE
10 | 270
10 | 110
20 | 110

1 个答案:

答案 0 :(得分:0)

我现在才知道答案。由于内核统计信息以RAW数据类型收集此信息,因此为了获取正确的数据,我需要使用UTL_RAW.CAST_TO_NUMBER更改数据类型:

decode(data_type, 'NUMBER',   UTL_RAW.CAST_TO_NUMBER(sys.dba_tab_columns.low_value),
                              NULL) AS LOW_VALUE,

decode(data_type, 'NUMBER',   UTL_RAW.CAST_TO_NUMBER(sys.dba_tab_columns.high_value),
                              NULL) AS HIGH_VALUE