直方图,一种特殊类型的列的统计信息,它能提供表中列的更详细的数据分布信息,直方图将值存放于桶(buckets)中。基于不同值的数目和数据的分布,数据库选择要创建的直方图类型,直方图的类型有如下几种:

  • 频率直方图和顶频直方图:Frequency histograms and to frequency histograms;
  • 高度平衡直方图(遗留):Height-Balanced hitograms;
  • 混合柱状图:Hybrid histograms;

1 直方图介绍

1.1 使用直方图的目的

默认情况下,优化器假定列的不同值之间时均匀分布的。对于包含数据倾斜列(列中数据的分布不均匀的列),直方图使优化器能够为涉及这些列的过滤或连接谓词生成更准确的基数的估计值,从而生成更精确的执行计划。

1.2 何时数据库创建直方图

使用DBMS_STATS搜集表的统计信息,查询引用表中的列时,数据库会根据之前的查询负载来自动的创建直方图。基本过程如下:

  • 使用DBMS_STATS搜集表的统计信息,且指定METHOD_OPT参数默认为SIZE AUTO;
  • 用户查询对应的表;
  • 数据库记录前面查询时使用的谓词,并更新数据字典表SYS.COL_USAGE$;
  • 再次运行DBMS_STATS时,DBMS_STATS会查询SYS.COL_USAGE$视图并根据前面的查询负载决定哪些列需要直方图。

示例:

1)创建测试表

SQL> create table sh.sales_new as select * from sh.sales;Table created.

2)查看统计信息

SQL> select column_name,notes,histogram from dba_tab_col_statistics where owner='SH' and table_name='SALES_NEW';COLUMN_NAME NOTES HISTOGRAM------------------------------ ------------------------------ ---------------AMOUNT_SOLD STATS_ON_LOAD NONEQUANTITY_SOLD STATS_ON_LOAD NONEPROMO_ID STATS_ON_LOAD NONECHANNEL_ID STATS_ON_LOAD NONETIME_ID STATS_ON_LOAD NONECUST_ID STATS_ON_LOAD NONEPROD_ID STATS_ON_LOAD NONE7 rows selected.

3)执行查询

SQL> select column_name,notes,histogram from dba_tab_col_statistics where owner='SH' and table_name='SALES_NEW';COLUMN_NAME NOTES HISTOGRAM------------------------------ ------------------------------ ---------------AMOUNT_SOLD STATS_ON_LOAD NONEQUANTITY_SOLD STATS_ON_LOAD NONEPROMO_ID STATS_ON_LOAD NONECHANNEL_ID STATS_ON_LOAD NONETIME_ID STATS_ON_LOAD NONECUST_ID STATS_ON_LOAD NONEPROD_ID STATS_ON_LOAD NONE7 rows selected.

4)搜集统计信息

SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS('SH','SALES_NEW',OPTIONS=>'GATHER AUTO');PL/SQL procedure successfully completed.

5)查看统计信息

SQL> select column_name,notes,histogram from dba_tab_col_statistics where owner='SH' and table_name='SALES_NEW';COLUMN_NAME NOTES HISTOGRAM------------------------------ ------------------------------ ---------------AMOUNT_SOLD STATS_ON_LOAD NONEQUANTITY_SOLD STATS_ON_LOAD NONEPROMO_ID STATS_ON_LOAD NONECHANNEL_ID STATS_ON_LOAD NONETIME_ID STATS_ON_LOAD NONECUST_ID STATS_ON_LOAD NONEPROD_ID HISTOGRAM_ONLY FREQUENCY7 rows selected.

6)查看列的使用

SQL> select * from sys.col_usage$ where obj#=93264;OBJ# INTCOL# EQUALITY_PREDS EQUIJOIN_PREDS NONEQUIJOIN_PREDS RANGE_PREDS LIKE_PREDS NULL_PREDS TIMESTAMP---------- ---------- -------------- -------------- ----------------- ----------- ---------- ---------- ---------93264 1 1 0 0 0 0 0 25-APR-20

1.3 如何选择直方图类型

前面讲过,直方图有多种类型,那么创建直方图时,数据库如何选择直方图的类型呢?这里有几个参考变量:

  • NDV:表示列的不同值的数量;
  • n:表示直方图桶(buckets)的数量,默认时254;
  • p:表示内部百分比阈值,等于(1-(1/n))*100;
  • DBMS_STATS中estimate_percent参数是否设置为auto_sample_size(默认值)。

下图展示的是直方图创建时的决策树:

2 直方图基数算法

对于直方图,基数的算法取决于端点数和值等因素,以及列值是否受欢迎。

2.1 端点编号和值(Endpoint Numbers and Values)

端点编号是唯一标识桶的编号,在频率和混合直方图中,端点编号是当前桶和之前桶中包含的所有值的累计频率,例如:端点编号是100的桶表示当前桶和以前所有桶的值的总频率是100,在高度平衡的直方图中,优化器按顺序给桶编号,从0或1开始。在所有情况下,端点编号就是桶号。

端点值是桶中值范围内的最大值,例如,如果一个桶只包含52794和52795,那么端点值是52795。

2.2 受欢迎和不受欢迎值(Popular and Nopopular Values)

直方图中某个值的受欢迎程度会影响基数估值算法,具体如下:

  • 受欢迎值:受欢迎值出现在多个桶的端点值,优化器通过检查某个值是否是桶的端点值来确定该值是否受欢迎,如果是,那么对于频率直方图,优化器将从当前桶的端点数减去前一个桶的端点数,混合直方图存储了每个端点的信息,如果这个值大于1,那么该值是受欢迎的。对于受欢迎的值,优化器通过下面的公式计算基数估计:cardinality of popular value = (num of rows in table) * (num of endpoints spanned by this value / total num of endpoints);
  • 不受欢迎值:所有不是受欢迎的值都是不受欢迎的值,对于不受欢迎的值,,优化器通过下面的公式计算基数估计:cardinality of nonpopular value = (num of rows in table) * density。

2.3 桶压缩(Bucket Compression)

在某些情况下,为了减少桶的总数,优化器将多个桶压缩到一个桶中,例如,下面的频率直方图表示第一个桶数是1,最后一个桶数是23:

ENDPOINT_NUMBER ENDPOINT_VALUE --------------- -------------- 1             52792 6             52793 8             52794 9             52795 10            52796 12            52797 14            52798 23            52799

可以看到,有几个桶“丢失”了,最初,桶2到桶6每个都包含一个值为52793的实例,优化器将所有这些桶压缩到具有最高端点数(桶6)的桶中,该桶现在包含5个实例的值52793,这个值是受欢迎的,因为当前桶和前一个桶的端点数之差为5,因此,在压缩之前,52793是5个桶的端点。下图展示了哪些桶是压缩的,哪些值是受欢迎的:

ENDPOINT_NUMBER ENDPOINT_VALUE
--------------- -------------- 1                 52792 -> nonpopular 6                 52793 -> buckets 2-6 compressed into 6; popular 8                 52794 -> buckets 7-8 compressed into 8; popular 9                 52795 -> nonpopular 10 52796 -> nonpopular 12                52797 -> buckets 11-12 compressed into 12; popular 14                52798 -> buckets 13-14 compressed into 14; popular 23                52799 -> buckets 15-23 compressed into 23; popular

3 频率直方图

在频率直方图中,每个不同的列值对应一个直方图桶,由于每个值都有自己的专用桶,所以有些桶会有很多值,而有些则很少。

3.1 频率直方图满足的条件

当满足下面的条件时,数据库创建频率直方图:

  • NDV少于或等于桶数(默认为254);
  • DBMS_STATS对应的过程的参数设置为AUTO_SAMPLE_SIZE或指定一个具体的值;

3.2 生成频率直方图

本实验在sh.countries_new的列country_subregion_id产生频率直方图。

1)生成测试数据

SQL> create table sh.countries_new as select * from sh.countries;Table created.SQL> select country_subregion_id,count(1) from sh.countries_new group by country_subregion_id order by 1;COUNTRY_SUBREGION_ID COUNT(1)-------------------- ----------52792 152793 552794 252795 152796 152797 252798 252799 98 rows selected.

2)搜集统计信息

begindbms_stats.gather_table_stats(ownname => 'SH',tabname => 'COUNTRIES_NEW',method_opt => 'for columns country_subregion_id');end;/PL/SQL procedure successfully completed.

3)查看列统计信息

SQL> select column_name,notes,histogram from dba_tab_col_statistics where owner='SH' and table_name='COUNTRIES_NEW';COLUMN_NAME NOTES HISTOGRAM------------------------------ ------------------------------ ---------------COUNTRY_NAME_HIST STATS_ON_LOAD NONECOUNTRY_TOTAL_ID STATS_ON_LOAD NONECOUNTRY_TOTAL STATS_ON_LOAD NONECOUNTRY_REGION_ID STATS_ON_LOAD NONECOUNTRY_REGION STATS_ON_LOAD NONECOUNTRY_SUBREGION_ID FREQUENCYCOUNTRY_SUBREGION STATS_ON_LOAD NONECOUNTRY_NAME STATS_ON_LOAD NONECOUNTRY_ISO_CODE STATS_ON_LOAD NONECOUNTRY_ID STATS_ON_LOAD NONE10 rows selected.

可看到COUNTRY_SUBREGION_ID已搜集了直方图信息。

4)查看直方图信息

select t.endpoint_number, t.endpoint_valuefrom dba_histograms twhere t.owner = 'SH'and t.table_name = 'COUNTRIES_NEW'and t.column_name = 'COUNTRY_SUBREGION_ID';ENDPOINT_NUMBER ENDPOINT_VALUE--------------- --------------1 527926 527938 527949 5279510 5279612 5279714 5279823 527998 rows selected.

5)优化器评估52799的基数

SQL> select count(1) from sh.countries_new;COUNT(1)----------23SQL> select count(1) from sh.countries_new where country_subregion_id=52799;COUNT(1)----------9

cardinality of popular value = (num of rows in table) * (num of endpoints spanned by this value / total num of endpoints)

即:C=23*(9/23)=9

和查询的结果相同

4 最高频率直方图

最高频率直方图是频率直方图的一种变种,它忽略了统计上不重要的不受欢迎的值。

4.1 最高频率直方图满足的条件

如果一小部分值占了大部分行,那么在这一小部分值上创建一个频率直方图是很有用的,即使NDV大于请求的直方图的桶的数量。为受欢迎的值创建一个更高质量的直方图,优化器将忽略不受欢迎的值并创建一个直方图。

当满足下面的条件时,数据库创建最高频率直方图:

  • NDV大于直方图桶的数量(默认为254);
  • 前n个频率值占用的行数百分比等于或大于阈值p,p等于(1-(1/n))*100;
  • BMS_STATS对应的过程的参数设置为AUTO_SAMPLE_SIZE;

4.2 生成最高频率直方图

本实验在sh.countries_new的列country_subregion_id产生频率直方图。

1)生成测试数据

SQL> select country_subregion_id,count(1) from sh.countries_new group by country_subregion_id order by 1;COUNTRY_SUBREGION_ID COUNT(1)-------------------- ----------52792 152793 552794 252795 152796 152797 252798 252799 98 rows selected.

2)搜集统计信息

begindbms_stats.gather_table_stats(ownname => 'SH',tabname => 'COUNTRIES_NEW',method_opt => 'for columns country_subregion_id size 7 ');end;/PL/SQL procedure successfully completed.

3)查看列统计信息

SQL> select column_name,notes,histogram from dba_tab_col_statistics where owner='SH' and table_name='COUNTRIES_NEW';COLUMN_NAME NOTES HISTOGRAM------------------------------ ------------------------------ ---------------COUNTRY_NAME_HIST STATS_ON_LOAD NONECOUNTRY_TOTAL_ID STATS_ON_LOAD NONECOUNTRY_TOTAL STATS_ON_LOAD NONECOUNTRY_REGION_ID STATS_ON_LOAD NONECOUNTRY_REGION STATS_ON_LOAD NONECOUNTRY_SUBREGION_ID TOP-FREQUENCYCOUNTRY_SUBREGION STATS_ON_LOAD NONECOUNTRY_NAME STATS_ON_LOAD NONECOUNTRY_ISO_CODE STATS_ON_LOAD NONECOUNTRY_ID STATS_ON_LOAD NONE10 rows selected.

可看到COUNTRY_SUBREGION_ID已搜集了最高频率直方图( TOP-FREQUENCY)信息。

4)查看直方图信息

select t.endpoint_number, t.endpoint_valuefrom dba_histograms twhere t.owner = 'SH'and t.table_name = 'COUNTRIES_NEW'and t.column_name = 'COUNTRY_SUBREGION_ID';ENDPOINT_NUMBER ENDPOINT_VALUE--------------- --------------1 527926 527938 527949 5279611 5279713 5279822 527997 rows selected.

5 高度平衡直方图(遗留)

在高度平衡直方图中,将列值划分为桶,以便每个桶包含大约相同的数据行。

待续。。。

【12c】直方图Histograms相关推荐

  1. 2.1_11 Oralce 执行计划之3_直方图(Histograms)

    目录 Summarize 总结 一.Purpose of Histograms 二.When Oracle Database Creates Histograms 三.How Oracle Datab ...

  2. Python+OpenCV:直方图(Histograms)

    Python+OpenCV:直方图(Histograms) 理论 什么是直方图?您可以将直方图看作是一种图形或图表,它为您提供关于图像强度分布的总体概念.它是x轴为像素值(范围从0到255,不总是这样 ...

  3. OpenCV-python学习笔记(三)——histograms直方图

    文章目录 histograms直方图 1 使用opencv来计算直方图 2 grayscale histograms灰度直方图 3 color histograms彩色直方图 4 彩色二维直方图 5 ...

  4. opencv21:Histograms直方图-查找、绘制和分析

    目标 学会 使用OpenCV和Numpy函数查找直方图 使用OpenCV和Matplotlib函数绘制直方图 函数:cv2.calcHist(),np.histogram()等. 理论 直方图(His ...

  5. CVPR2005【行人检测】HOG+SVM用于人体检测的梯度方向直方图

    目录 CVPR2005-用于人体检测的梯度方向直方图 Histograms of Oriented Gradients for Human Detection 使用的数据集 研究方法 数据 流程 双对 ...

  6. python 直方图每个bin中的值_使用python中的matplotlib进行绘图分析数据

    matplotlib 是python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图.而且也可以方便地将它作为绘图控件,嵌入GUI应用程序中. 它的文档相当完备, ...

  7. 深入理解Oracle直方图

    直方图是一种按数据出现的频率来进行分类存储的方法.在Oracle中直方图是用来描述表中列数据的分布情况.每一个sql在被执行前都要经过优化这一步骤那么在优化器给出一个最优执行计划之优化器应该要知道sq ...

  8. 行人检测:论文翻译Histograms of Oriented Gradients for Human Detection

                                                                                       用于人体检测的方向梯度直方图 Na ...

  9. excel图表中的直方图_如何在Microsoft Excel中创建直方图

    excel图表中的直方图 Histograms are a useful tool in frequency data analysis, offering users the ability to ...

  10. 轻松入门模型转换和可视化

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 本文给大家介绍一个模型转换格式ONNX和可视化工具Netron.ONNX是微软设计的一种多平台的通用文 ...

最新文章

  1. linux进程 网络占用率,linux CPU SI软中断比较占用率比较大(网络解决方案)
  2. mirna富集分析_2020年的3+分ceRNA分析长啥样?
  3. android开发常用的颜色值
  4. matlab中服从高斯分布的矩阵_一些张量的计算步骤matlab代码
  5. 2. Mysql数据库的入门知识
  6. (一)Windows环境下汇编编程读书笔记
  7. mysql 备份到别的机器_物理拷贝备份mysql到其他机器上恢复
  8. quake3中求1/sqrt(x)的算法源代码
  9. 【重点!DP】LeetCode 115. Distinct Subsequences
  10. 传说中Python最难理解的点|看这完篇就够了
  11. 2017北理复试机试题
  12. 《数据挖掘:理论与算法》习题 + 期末考试+答案 + 2021年【完整/完结】
  13. Python实现网络出口带宽自动巡检
  14. 毕业设计 嵌入式 智能温控风扇系统
  15. Pseudo-terminal will not be allocated because stdin is not a terminal. Warning: Permanently added ‘[
  16. 国标中不能用作公差基准字母
  17. python-QQ群扫码登录(QQ群验证)
  18. 北京交通大学计算机考研906计算机专业基础初试经验分享北交大考研计算机
  19. 《解压猫咪》用户隐私政策
  20. JAVA简单实现坦克对战(只有坦克和子弹)

热门文章

  1. 面试技巧 16个经典面试问题回答思路
  2. FPGA与ASIC对比
  3. Ubuntu下ASIC/FPGA环境搭建
  4. OpenWrt ar71xx 添加原生 AR8035 支持的方法 (AR934X)
  5. 致远OA表单自定义函数(明细表排名 )
  6. 电磁场与波 matlab,电磁场数值计算法与MATLAB实现
  7. 4.4 Recovery和Removal分析
  8. 【校招Verilog快速入门】组合逻辑篇:VL12、4bit超前进位加法器电路
  9. go编译文件带上图标
  10. usb万能驱动win7_突破封锁,倒行逆施强行安装Win7系统,繁琐变简洁