RDBMS : 12.2.0.1
原文地址:
-- 直方图的自动创建
create table sales2 as select * from sales;
create index sh_12c_idx1 on sales2(prod_id);
create index sh_12c_idx2 on sales2(cust_id,time_id);
[email protected]>create table sales2 as select * from sales;
Table created.
[email protected]>create index sh_12c_idx1 on sales2(prod_id);
Index created.
[email protected]>create index sh_12c_idx2 on sales2(cust_id,time_id);
Index created.
-- 查看是否有直方图,因为还没有进行过查询,所以没有直方图
SELECT COLUMN_NAME, NOTES, HISTOGRAM
FROM USER_TAB_COL_STATISTICS
WHERE TABLE_NAME = 'SALES2';
[email protected]>SELECT COLUMN_NAME, NOTES, HISTOGRAM
FROM USER_TAB_COL_STATISTICS
WHERE TABLE_NAME = 'SALES2'; 2 3
COLUMN_NAME NOTES HISTOGRAM
-------------------- ------------------------------ ----------------------------------------
PROD_ID STATS_ON_LOAD NONE
CUST_ID STATS_ON_LOAD NONE
TIME_ID STATS_ON_LOAD NONE
CHANNEL_ID STATS_ON_LOAD NONE
PROMO_ID STATS_ON_LOAD NONE
QUANTITY_SOLD STATS_ON_LOAD NONE
AMOUNT_SOLD STATS_ON_LOAD NONE
7 rows selected.
[email protected]>
-- 通过prod_id=42进行查询,然后收集统计信息
SELECT COUNT(*) FROM sales2 WHERE prod_id = 42;
EXEC DBMS_STATS.GATHER_TABLE_STATS(USER,'SALES2',OPTIONS=>'GATHER AUTO');
SELECT COLUMN_NAME, NOTES, HISTOGRAM
FROM USER_TAB_COL_STATISTICS
WHERE TABLE_NAME = 'SALES2';
[email protected]>SELECT COUNT(*) FROM sales2 WHERE prod_id = 42;
COUNT(*)
----------
12116
[email protected]>EXEC DBMS_STATS.GATHER_TABLE_STATS(USER,'SALES2',OPTIONS=>'GATHER AUTO');
PL/SQL procedure successfully completed.
[email protected]>SELECT COLUMN_NAME, NOTES, HISTOGRAM
FROM USER_TAB_COL_STATISTICS
WHERE TABLE_NAME = 'SALES2'; 2 3
COLUMN_NAME NOTES HISTOGRAM
-------------------- ------------------------------ ----------------------------------------
PROD_ID HISTOGRAM_ONLY FREQUENCY
CUST_ID STATS_ON_LOAD NONE
TIME_ID STATS_ON_LOAD NONE
CHANNEL_ID STATS_ON_LOAD NONE
PROMO_ID STATS_ON_LOAD NONE
QUANTITY_SOLD STATS_ON_LOAD NONE
AMOUNT_SOLD STATS_ON_LOAD NONE
7 rows selected.
[email protected]>
--直方图的一些名词
NDV : number distinct of values ,比如一个列包含10,200,300,则NDV就是3
n: 代表直方图的桶,默认是254
p: 代表内部变量百分比阈值, (1–(1/n))* 100. For example, if n = 254, then p is 99.6
-- 直方图的算法,是那种直方图
https://docs.oracle.com/en/database/oracle/oracle-database/12.2/tgsql/histograms.html#GUID-F02DAAC5-31F9-477B-9C25-AE33E21DB350
--- 默认的桶是254,ndv 是72, 72小于254,所以就是FREQUENCY 直方图
[email protected]>select prod_id,sum(distinct(prod_id)) from sales group by prod_id;
PROD_ID SUM(DISTINCT(PROD_ID))
---------- ----------------------
123 123
138 138
......
PROD_ID SUM(DISTINCT(PROD_ID))
---------- ----------------------
118 118
122 122
39 39
15 15
19 19
139 139
72 rows selected.
[email protected]>
END