Height-Balanced Histogram 이 생성되는 경우 |
---|
Distinct Count 가 254개 초과인 경우 |
DBMS_STATS Package 의 METHOD_OPT Parameter 를 통해 Distinct Count 보다 적은 Bucket size 를 할당한 경우 (ex) exec dbms_stats.gather_table_stats(user, 't1', method_opt=>'for columns c1 size 5') |
drop table t1 purge;
create table t1(c1 int, c2 int);
insert into t1
select 1, mod(level, 2) +1
from dual
connect by level <= 10000
union all
select 2, mod(level, 300) + 1
from dual
connect by level <= 1000
union all
select 3, mod(level, 50) + 1
from dual
connect by level <= 100
union all
select 4, mod(level, 5) + 1
from dual
connect by level <= 10
union all
select 5, mod(level, 1) + 1
from dual
connect by level <= 1
;
commit;
exec dbms_stats.gather_table_stats(user, 't1', method_opt=>'for all columns size skewonly')
TABLE_NAME : T1
COLUMN_NAME : C1
NUM_DISTINCT : 5
NUM_NULLS : 0
DENSITY : .0000450004500045
LOW_VALUE : C102
HIGH_VALUE : C106
HISTOGRAM : FREQUENCY
-----------------
TABLE_NAME : T1
COLUMN_NAME : C2
NUM_DISTINCT : 300
NUM_NULLS : 0
DENSITY : .00036320911154317
LOW_VALUE : C102
HIGH_VALUE : C204
HISTOGRAM : HEIGHT BALANCED
-----------------
{code:SQL} C1 CNT -- -- 1 10000 2 1000 3 100 4 10 5 1 {code} | {code:SQL} TABLE_NAME COLUMN_NAME ENDPOINT_NUMBER ENDPOINT_VALUE --- T1 C1 10000 1() T1 C1 11000 2() T1 C1 11100 3() T1 C1 11110 4() T1 C1 11111 5() {code} |
ENDPOINT_NUMBER | Frequency(빈도) |
ENDPOINT_VALUE | Value(값) |
{code:SQL} C2 CNT -- -- 1 5008 2 5008 3 8 4 8 5 8 6 6 7 6 8 6 9 6 10 6 . . . {code} | {code:SQL} TABLE_NAME COLUMN_NAME ENDPOINT_NUMBER ENDPOINT_VALUE --- T1 C2 113 1() T1 C2 228 2() T1 C2 229 3() T1 C2 230 10() T1 C2 231 17() T1 C2 232 24() T1 C2 233 32() T1 C2 234 39() T1 C2 235 46() T1 C2 236 55() T1 C2 237 66() T1 C2 238 77() T1 C2 239 88() T1 C2 240 98() T1 C2 241 112() T1 C2 242 126() T1 C2 243 141() T1 C2 244 155() T1 C2 245 170() T1 C2 246 184() T1 C2 247 199() T1 C2 248 213() T1 C2 249 228() T1 C2 250 242() T1 C2 251 257() T1 C2 252 271() T1 C2 253 286() T1 C2 254 300() {code} |
ENDPOINT_NUMBER | Bucket 번호 |
ENDPOINT_VALUE | 값(Value) |
하나의 값이 하나 혹은 그 이상의 Bucket 을 차지하는 경우 -> Popular Value |
여러 값이 하나의 Bucket에 들어있는 경우 -> Non Popular Value |
ENDPOINT_NUMBER | Bucket 번호 | 113 |
ENDPOINT_VALUE | 값(Value) | 1 |
-> 즉 값 1은 1번에서 113번 Bucket 을 혼자서 사용한다는 뜻
-> 이를 이용해 빈도를 계산하면
Popular Value Frequency = Height * Bucket size
= (Total Row Count / Total Bucket size) * Bucket size
= (11111/254) * 113 = 4943
ENDPOINT_NUMBER | Bucket 번호 | 230 |
ENDPOINT_VALUE | 값(Value) | 10 |
-> 이 때 이전 ENDPOINT_VALUE = 3,
-> 즉 4 ~ 10 번 값 6개가 230번 bucket 하나를 공유하고 있음
Popular Value 와 Non Popular Value는 Cardinality의 계산 방식에서 완전히 다른 공식을 사용 |