索引——直方图

物理优化之统计信息 优化器、代价估算、物理优化、postgresql、kingbase 阅读详情

转自:http://czmmiao.iteye.com/blog/1484298



直方图概述
直方图是一种统计学上的工具,并非Oracle专有,通常情况下它会表现为一种几何图形表,这个图形表是根据从实际环境中所收集来的被管理对象某个方面的质量分布情况的数据所绘制成的,通常会画成以数量为底边,以频度为高度的一系列连接起来的矩形图,因此直方图在统计学上也称为质量分布图。
在Oracle中直方图是一种对数据分布质量情况进行描述的工具。它会按照某一列不同值出现数量多少,以及出现的频率高低来绘制数据的分布情况,以便能够指导优化器根据数据的分布做出正确的选择。在某些情况下,表的列中的数值分布将会影响优化器使用索引还是执行全表扫描的决策。当where 子句的值具有不成比例数量的数值时,将出现这种情况,使得全表扫描比索引访问的成本更低。这种情况下如果where 子句的过滤谓词列之上上有一个合理的正确的直方图,将会对优化器做出正确的选择发挥巨大的作用,使得SQL语句执行成本最低从而提升性能。
在分析表或索引时,直方图用于记录数据的分布。通过获得该信息,基于成本的优化器就可以决定使用将返回少量行的索引,而避免使用基于限制条件返回许多行的索引。直方图的使用不受索引的限制,可以在表的任何列上构建直方图。
构造直方图最主要的原因就是帮助优化器在表中数据严重偏斜时做出更好的规划。例如,如果一到两个值构成了表中的大部分数据(数据偏斜),相关的索引就可能无法帮助减少满足查询所需的I/O数量。创建直方图可以让基于成本的优化器知道何时使用索引才最合适,或何时应该根据WHERE子句中的值返回表中80%的记录。
通常情况下在以下场合中建议使用直方图:
1、当Where子句引用了列值分布存在明显偏差的列时:当这种偏差相当明显时,以至于WHERE 子句中的值将会使优化器选择不同的执行计划。这时应该使用直方图来帮助优化器来修正执行路径。(注意:如果查询不引用该列,则创建直方图没有意义。这种错误很常见,许多 DBA 会在偏差列上创建柱状图,即使没有任何查询引用该列。)
2、当列值导致不正确的判断时:这种情况通常会发生在多表连接时,例如,假设我们有一个五项的表联接,其结果集只有10行。Oracle 将会以一种使第一个联接的结果集(集合基数)尽可能小的方式将表联接起来。通过在中间结果集中携带更少的负载,查询将会运行得更快。为了使中间结果最小化,优化器尝试在SQL执行的分析阶段评估每个结果集的集合基数。在偏差的列上拥有直方图将会极大地帮助优化器作出正确的决策。如优化器对中间结果集的大小作出不正确的判断,它可能会选择一种未达到最优化的表联接方法。因此向该列添加直方图经常会向优化器提供使用最佳联接方法所需的信息。
等频直方图与等高直方图
默认的,如果一个倾斜列上的唯一值超过了254个,那么ORACLE会对此列建立等高直方图,否则建立等频直方图。我们先来看下等频直方图。
所谓的等频即按照列上的不同数据值进行划分,由于每个数值的频度相同,高度不同,故称为等频。下面是具体例子:
通过如下方式,建立表TAB,更新字段B,让列B产生倾斜。并在B列上创建索引。
SQL> create table tab(a number,b number);

Table created.
SQL> insert into tab select rownum,rownum from dual connect by level <=10000;

10000 rows created.

SQL> commit;

Commit complete.

SQL> update tab set b=5 where b between 6 and 9995;

9990 rows updated.

SQL> commit;

Commit complete.

SQL> create index tab_b_idx on tab(b);

Index created.
然后分析表,强制使列B不产生直方图。
SQL> exec dbms_stats.gather_table_stats('HR','TAB',cascade=>true,method_opt=>'FOR COLUMNS B SIZE 1');

PL/SQL procedure successfully completed.
查看视图USER_TAB_HISTOGRAMS或者DBA_TAB_COL_STATISTICS
SQL> select TABLE_NAME,COLUMN_NAME,ENDPOINT_NUMBER,ENDPOINT_VALUE from user_histograms where TABLE_NAME='TAB'

TABLE_NAME   COLUMN_NAME  ENDPOINT_NUMBER ENDPOINT_VALUE
------------ ------------ --------------- --------------
TAB          B                          0              1
TAB          B                          1          10000
列B上只有最大值,最小值两条记录分别对应端点号(endpoint_number)0和1,这种显示说明列B没有直方图信息。
在没有直方图的情况下,在B列上进行等值查询的时候,都是索引范围扫描。
SQL>  select * from tab where b=5

Execution Plan
----------------------------------------------------------
Plan hash value: 157166354

-----------------------------------------------------------------------------------------
| Id  | Operation                   | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |           |  1000 |  6000 |     4   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| TAB       |  1000 |  6000 |     4   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | TAB_B_IDX |  1000 |       |     2   (0)| 00:00:01 |
-----------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("B"=5)
收集直方图信息。看看是什么效果。由于列B唯一值的个数没有超过254因此产生的是等频直方图。
SQL> exec dbms_stats.gather_table_stats('HR','TAB',cascade=>true);

PL/SQL procedure successfully completed.
默认是对所有列分析直方图

在B=1时候采用索引扫描,而B=5时候,已经采用全表扫描了,说明直方图起了作用。
SQL> select * from tab where b=1;

Execution Plan
----------------------------------------------------------
Plan hash value: 157166354

-----------------------------------------------------------------------------------------
| Id  | Operation                   | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |           |     1 |     6 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| TAB       |     1 |     6 |     2   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | TAB_B_IDX |     1 |       |     1   (0)| 00:00:01 |
-----------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("B"=1)
SQL> select * from tab where  b=5;


Execution Plan
----------------------------------------------------------
Plan hash value: 1995730731

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |  9991 | 59946 |     6   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| TAB  |  9991 | 59946 |     6   (0)| 00:00:01 |
--------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("B"=5)

 

查看此时的直方图信息:

SQL> select TABLE_NAME,COLUMN_NAME,ENDPOINT_NUMBER,ENDPOINT_VALUE from user_histograms where table_name='TAB';

TABLE_NAME   COLUMN_NAME  ENDPOINT_NUMBER ENDPOINT_VALUE
------------ ------------ --------------- --------------
TAB          B                          1              1
TAB          B                          2              2
TAB          B                          3              3
TAB          B                          4              4
TAB          B                       9995              5
TAB          B                       9996           9996
TAB          B                       9997           9997
TAB          B                       9998           9998
TAB          B                       9999           9999
TAB          B                      10000          10000
TAB          A                          0              1

TABLE_NAME   COLUMN_NAME  ENDPOINT_NUMBER ENDPOINT_VALUE
------------ ------------ --------------- --------------
TAB          A                          1          10000

12 rows selected.

 

其中EDNPOINT_NUMBER是累计值。EDNPOINT_VALUE是列的值。可以看出这种等频直方图统计的列的信息是非常精确的。它为每一个列值分配了一个bucket。从执行计划的ROWS部分也可以看出ORACLE计算出来的cardinality是9991,和实际的情况完全吻合。
如果想知道每一个列值对应的数量是多少,需要做一下简单的减法运算:假如想知道列值等于5的个数,那么可以通过:9995-4=9991得到。这就是ENDPOINT_NUMBER累计值的含义。
等高直方图,当列上的数据不同值超过254时,Oracle将会默认将列上的数据划分为高度一致但频度不一致的等高直方图。
SQL> exec dbms_stats.gather_table_stats('HR','TAB',cascade=>true,method_opt=>'FOR COLUMNS B SIZE 8);

PL/SQL procedure successfully completed.
由于列B有10个唯一值,通过上面的size 8可以强制ORACLE使用等高直方图。
查看直方图信息.
SQL> select TABLE_NAME,COLUMN_NAME,ENDPOINT_NUMBER,ENDPOINT_VALUE from user_histograms where table_name='TAB';

TABLE_NAME   COLUMN_NAME  ENDPOINT_NUMBER ENDPOINT_VALUE
------------ ------------ --------------- --------------
TAB          B                          0              1
TAB          B                          7              5
TAB          B                          8          10000
TAB          A                          0              1
TAB          A                          1          10000

从查询结果惊奇的发现只有三个桶0 7 8,原来ORACLE会自动省去EDNPOINT_VALUE值相同且ENDPOINT_NUMBER相邻的桶的值。省去了桶(EDNPOINT_NUMBER)为1 2 3 4 5 6 ,EDNPOINT_VALUE为5的六条内容。
说明:在等高直方图中,EDNPOINT_NUMBER代表桶号,这一点与等频直方图不同。再看等高直方图下的执行计划:

SQL>  select * from tab where b=5

Execution Plan
----------------------------------------------------------
Plan hash value: 1995730731

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |  9982 | 59892 |     6   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| TAB  |  9982 | 59892 |     6   (0)| 00:00:01 |
--------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("B"=5)
有执行计划的ROWS部分,ORACLE计算出来的cardinality不是特别精确的。9991才是精确值。而等频直方图可以精确到9991,因此可以说等频直方图比等高直方图稳定,精确。
可是现实很多时候,列的唯一值是超过254的。只能使用等高直方图了。
一个注意点
如果需要删除直方图信息,10g中可以通过上面提到的
exec dbms_stats.gather_table_stats('HR','TAB',cascade=>true,method_opt=>'FOR COLUMNS B SIZE 1');
但这却得再次收集表的统计信息,十分不合理,11g有如下方法可以直接删除直方图信息
dbms_stats.delete_column_stats(ownname => user,
tabname => 'T',
colname => 'VAL',
col_stat_type => 'HISTOGRAM')

11g 搜集直方图导致不走索引 SELECT messagein0_.proccnt AS col_0_0_ FROM mbfe.messagein messagein0_ WHERE messagein0_.msgID='ID:414d5120514d453333313020202020204c224a3c200c49cb'; 1条记录 SQL_ID c1pvjs5wx132x, CHILD NUMBER 0 ---- 阅读详情

相关推荐

oracle 收集直方图不走索引

1 Plan hash value: 1138811981 2 3 ---------------------------------------------------------------------------------------------- 4 | Id | Operation | Name | Rows |...

zhaoyangjian724的专栏 653

Oracle直方图的深入理解(原创)

直方图概述 直方图是一种统计学上的工具,并非Oracle专有,通常情况下它会表现为一种几何图形表,这个图形表是根据从实际环境中所收集来的被管理对象某个方面的质量分布情况的数据所绘制成的,通常会画成以数量为底边,以频度为高度的一系列连接起来的矩形图,因此直方图在统计学上也称为质量分布图。 在Oracle中直方图是一种对数据分布质量情况进行描述的工具。它会按照某一列不同值出现数量多少,以及出现...

czmmiao的专栏 465

图像搜索引擎1|使用Python颜色直方图在数据集中搜索视觉上相似的图像

这篇博客将介绍如何从头到尾创建图像搜索引擎。第一步是选择一个图像描述符——使用3D RGB直方图来表征图像的颜色。然后通过提取特征向量(即直方图)使用描述符对数据集中的每个图像进行索引。然后使用卡方距离来定义两个图像之间的“相似性”。并进行检索返回和查询图像最接近的top10结果。

qq_40985985的博客 909

Oracle统计信息(二)—— 直方图 Histogram

Oracle统计信息(二)—— 直方图 Histogram

sqlora的专栏 2300

图像增强核心技术实战:伽马矫正、直方图处理与索引色变换

用户可手动定义任意调色板,实现风格化渲染。例如创建一个从黑→红→黄→白的“火焰”渐变调色板:% 构建火焰调色板 (256行)n = 256;% R: 0 → 1% G: 0 → 1else% B: 0 → 1endend% 应用于灰度图像的伪彩色渲染% 映射0~255到1~256colorbar;逻辑分析:- 分段线性函数构造平滑过渡的暖色调序列。indices将灰度值线性映射为调色板索引。- 结果呈现出类似热辐射的视觉效果,适用于警报级别指示。

weixin_34374684的博客 1021

Utrust4701F与Utrust2700R读写器在银河麒麟系统的安装及测试步骤说明

Utrust4701F与Utrust2700R读写器支持银河麒麟系统,广泛应用会员管理、支付管理等领域。本文将重点介绍Utrust4701F与Utrust2700R读写器在银河麒麟系统的安装及测试步骤说明。以上方法适用于主流国产操作系统,如 优麒麟(UbuntuKylin)/ 中标麒麟(NeoKylin) / UOS(统信操作系统)/ 中兴新支点 / 红旗 linux(redflag linux)/ 普华 Linux(I-soft OS) / 威科乐恩 Linux(WiOS)等

华翔天诚科技 1833

oracle 查询直方图,Oracle的直方图

1直方图的含义在Oracle数据库中,CBO会默认认为目标列的数据在其最小值LOW_VALUE和最大值HIGH_VALUE之间均匀分布的,并且会按照这个均匀分布原则来计算对目标列施加查询条件后的可选择率以及结果集的Cardinality,进而据此来计算成本值并选择执行计划。但目标列的数据是均匀分布这个原则并不总是正确的,在实际的系统中,我们很容易就能看到一些目标列的数据分布是不均匀的,甚至是极度倾...

weixin_29304713的博客 1089

Flutter 直接调用so动态库,或调用C/C++源文件内函数

我把 .so 文件尝试放过好几个目录/lib/,最终都会报这个错误,现在才知道库文件需要放在你根本想象不到的地方!!!尝试了一些方法还是不行后我放弃了 ffi,想着用 Flutter 的 MethodChannel 桥接 android/ios 原生,再让原生去调 native 层。一顿操作把Android端的搞定了,当然中间涉及到 Kotlin和C++ 层的数据类型映射的痛苦,而且业务函数也不像一个 helloworld 那么简单,别提有多痛苦了。

开发以大橘为重 8352

oracle cost分析,SQL优化系列--Cost赖以生存的基础-直方图

直方图是统计学上的工具,通常情况下表现为一种几何图形,这个图形是根据从实际环境所收集过来的被管理对象的质量分布情况的数据所绘制而成,通常会画成以数据类型为底边(X 轴),数据频率作为高度(Y轴),根据所绘制成的图形判断数据的分布和走势,从而判断产品的质量情况。表现为:https://www.cndba.cn/arealman/article/397 之前有分析过一个COST计算的案例,里面有关行数...

weixin_34790159的博客 972

深入解析FOC电流环PI参数整定:从理论到实践

本文深入解析了FOC(磁场定向控制)中电流环PI参数整定的核心原理与实践方法。文章从永磁同步电机模型出发,详细阐述了基于带宽与零极点对消的工程法及考虑逆变器延迟的二阶系统整定法两种经典策略,并提供了从理论计算到安全上电调试的完整步骤与常见问题解决方案,帮助工程师精准调校电机控制性能。

weixin_29164497的博客 449

【VSCode】【Clangd】从零构建:基于LLVM/Clangd+MINGW+CMake的Windows高性能C/C++开发环境实战

本文详细介绍了如何在Windows平台搭建基于LLVM/Clangd+MINGW+CMake的高性能C/C++开发环境。通过VSCode配置Clangd语言服务器,结合MINGW提供的GCC工具链和CMake的跨平台构建能力,实现轻量级、高效率的开发体验。文章包含从环境准备到实战配置的完整指南,特别适合追求开发效率和跨平台兼容性的开发者。

weixin_28839629的博客 313

直方图;索引

之前一直以为收不收集直方图有两个条件: 1.有索引 2.列值分布不均匀 第二点毋庸置疑,实验下第一点: 实验环境 CREATE TABLE TEST AS SELECT * FROM DBA_OBJECTS; CREATE TABLE TEST2 AS SELECT * FROM DBA_OBJECTS; UPDATE TEST2 SET OBJECT_ID = 11111

wbaug20th的专栏 732

【opencv3 学习记录】第二章 读取显示保存视频

一:捕获视频函数 1.函数:cv2.VideoCapture(参数) 2.参数说明: (1)开启摄像头:参数一般为0,你可以通过设置成 1 或 者其他的来选择别的摄像头。 (2)从文件夹中获取视频:参数为字符串形式的文件路径 3.示例: cap = cv2.VideoCapture(0) #cap:存放参数 二:读取视频函数 1.函数:cap.read() 2.函数说明: (1)cap.read 中cap与捕获视频函数存放函数一致,可以自己命名.括号一般不用填写 (2)ret,f

m0_64448543的博客 3272

直方图构建图像搜索引擎一

Clever Girl: A Guide to Utilizing Color Histograms for Computer Vision and Image Search Engines(直方图构建图像搜索引擎一) 英文原文 translator : aaron-clark-aic 图像搜索引擎原理 两图相似可以认为是两图的色彩相似,直方图就是图形色彩的统计。在彩色直方图的相似比较上可以使用距...

aaron-clark-aic 385

从零到一,打造你的无人机侦察兵!树莓派+Python+MQTT,实时目标检测全攻略

物联网、人工智能与计算机视觉三大前沿技术的深度融合。

u013558123的博客 1473

lammps后处理:堆垛层错和孪晶的数量统计

python调用ovito包可以免费实现ovito pro版本的功能,不需要安装ovito pro软件,如统计位错线长度、CNA结构、键角分布等,如需深入学习,可考虑报名python ovito后处理课程,或lammps一对一课程。lammps金属变形模拟中,可能会产生堆垛层错或者孪晶等结构,但是ovito免费版本无法统计这些结构的数量。使用python和ovito软件包,则可以方便的统计出这些结构的数量。大家好,我是小马老师。

lammps_jiayou的博客 467

mysql 直方图 索引_MYSQL 8 Histogram statistics 直方图,开始开挂的MYSQL

周六日,松懈了,罪过罪过, MYSQL 从8.0开始就开始正式走到开挂数据库得行列,估计8.0铺开后,大部分原先的MYSQL的经验的进行一次洗牌,今天就从MYSQL 的直方图开始。MYSQL 从8.03 开始引入的直方图的功能,那什么是直方图,直方图对数据库的查询有什么帮助下面我们的学习一下。首先数据库引入直方图的是大部分数据库早已经做的事情,2年前 TIDB 的一次讲座听了一下,当时TIDB 就...

weixin_32204241的博客 274

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

《叶问》第28期,表里某个字段,同时创建了索引和直方图,执行计划会怎么选择...

亲测在有索引的情况下,优化器会选择索引统计信息而非直方图,例如:"considered_execution_plans": [ { "table"...

老叶茶馆 735

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

值分布不均衡的列建索引不收集直方图信息的结果

在一个值分布不均衡的列上建索引,但是收集统计信息的时候没有收集直方图信息的情况下会走索引吗? SQL> create table t as select * from dba_objects; Table created. SQL> create index idx_t1 on t(status); create index idx_t1 on t(status)

about database article 776

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Oracle索引梳理系列(十)- 直方图使用技巧及analyze table操作对直方图统计的影响(谨慎使用)

版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载。转载时,请在文章明显位置注明原文链接。若在未经作者同意的情况下,将本文内容用于商业用途,将保留追究其法律责任的权利。如果有问题,请以邮箱方式联系作者(793113046@qq.com)。 前言 针对索引列,尤其是存在严重数据倾斜的索引列,直方图的统计信息,对于

qcq8208的博客 864

直方图构建图像搜索引擎二

Hobbits and Histograms – A How-To Guide to Building Your First Image Search Engine in Python(直方图构建图像搜索引擎二) 英文原文 直方图构建图像搜索引擎一 translator:aaron-clark-aic 如何建立第一个Python图像搜索引擎 前面一章我们已经建立了基于色彩统计的彩色直方图。原作者的...

aaron-clark-aic 285

用于相似图片搜索引擎的Python OpenCV图像直方图

像的构成是由像素点构成的,每个像素点的值代表着该点的颜色(灰度图或者彩色图)。所谓直方图就是对图像的中的这些像素点的值进行统计,得到一个统一的整体的灰度概念。

人工智能研究所的博客 1123

Oracle直方图导致SQL不走索引.

在ITPUB 上看到一个帖子 http://www.itpub.net/thread-1875212-1-1.html 同一条SQL语句,只有查询条件不一样,查询返回的结果集都为0,一个走了全表扫描,一个走索引。查看全表扫描的SQL语句:SQL走全表,产生了2422609个逻辑读,cost为535KSQL&gt; SELECT URL,YHZH,HFRZY,HFLR,SPURL,TPURL,YP...

weixin_33724659的博客 240
上一篇: 索引——二元高度
下一篇: 索引——快速全局扫描
narutobing
博客等级 码龄18年 2粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值