Oracle 收集统计信息

Oracle gather statistics

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

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

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(不管为什么)。也许是类型问题?

“统计信息”选项卡使用 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>'

问候 乔瓦

正如其他人指出的那样,数据以 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