RDBMS : 12.2.0.1 

原文地址:

https://docs.oracle.com/en/database/oracle/oracle-database/12.2/tgsql/histograms.html#GUID-92C94E9C-AE31-4135-86A0-3BE1A541BB36

-- 直方图的自动创建

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

Oracle 直方图的相关知识- 何时创建直方图 & 创建什么类型的直方图

--- 默认的桶是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 

相关文章:

  • 2022-02-07
  • 2022-12-23
  • 2022-12-23
  • 2021-07-16
  • 2022-12-23
  • 2021-04-13
猜你喜欢
  • 2021-10-22
  • 2022-12-23
  • 2022-12-23
  • 2021-05-19
  • 2022-12-23
  • 2022-01-01
  • 2021-06-28
相关资源
相似解决方案