Oracle收集统计信息

时间:2015-01-15 14:53:24

标签: oracle statistics

我正在使用Oracle 11g,我对统计表有一些疑问。

我使用了收集统计数据(100%样本),我看到了一个奇怪的行为。以下是输出统计表中的值,例如:

Table_name | column_name | low_value |      max_value
  MyTable  |      A      |    30     |   393939393939393939

然而,下一个查询给出了不同的输出:

SELECT MIN(A), MAX(A)
FROM MyTable

Output:
0    | 99999999999999999

怎么会发生? 请注意,A列为VARCHAR2,而此列的值为INT(从不明白为什么)。也许类型问题是问题?

2 个答案:

答案 0 :(得分:3)

“统计”选项卡使用RAW数据类型显示low_value和high_value。

您可以尝试这种方式:

select 
    utl_raw.cast_to_number(low_value), 
    utl_raw.cast_to_number(high_value)
from cols
where column_name = '<column_name>' and table_name = '<table_name>'

问候 Giova

答案 1 :(得分:1)

正如其他人所指出的那样,数据以RAW格式存储。值得注意的是,RAW值仅存储前32个字节的数据。

在下面的示例中,结果100%准确,最多32个字节。但我不确定是否总是这样。在this answer中,我使用了优化器统计信息,但即使是几个字节,它们也不是100%准确。

--Create table, add test data, gather stats.
create table test1(a varchar2(4000));
insert into test1 values('abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz');
insert into test1 values('ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ');
begin
    dbms_stats.gather_table_stats(user, 'TEST1');
end;
/

--Find the low and high values.
select low_value, high_value
from user_tab_columns where table_name = 'TEST1';


--Convert those values back to VARCHARs.
declare
    v_out varchar2(4000);
begin
    dbms_stats.convert_raw_value('4142434445464748494A4B4C4D4E4F505152535455565758595A414243444546', v_out);
    dbms_output.put_line('Low value: '||v_out);
    dbms_stats.convert_raw_value('6162636465666768696A6B6C6D6E6F707172737475767778797A616263646566', v_out);
    dbms_output.put_line('High value: '||v_out);
end;
/

--Note how these values are cut off.
Low value: ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEF
High value: abcdefghijklmnopqrstuvwxyzabcdef