`

(转)执行计划和直方图

阅读更多
http://aliyundba.aliapp.com/?p=292#more-292
在Oracle中直方图是一种对数据分布质量情况进行描述的工具。它会按照某一列不同值出现数量多少,以及出现的频率高低来绘制数据的分布情况,以便能够指导优化器根据数据的分布做出正确的选择。在某些情况下,表的列中的数值分布将会影响优化器使用索引还是执行全表扫描的决策。当 where 子句的值具有不成比例数量的数值时,将出现这种情况,使得全表扫描比索引访问的成本更低。这种情况下如果where 子句的过滤谓词列之上上有一个合理的正确的直方图,将会对优化器做出正确的选择发挥巨大的作用,使得SQL语句执行成本最低从而提升性能。
根据dba_objects创建一个倾斜列的表。并在严重倾斜的列上创建索引
YANG@yangdb-rac3> create table bind as select * from dba_objects;
Table created.
YANG@yangdb-rac3> update bind set status='INVALID' WHERE WNER='SCOTT';
6 rows updated.
YANG@yangdb-rac3> create index bind_idx on bind(status);
Index created.
收集表和索引的信息。
YANG@yangdb-rac3> exec dbms_stats.gather_table_stats(user,'BIND',cascade=>true);
PL/SQL procedure successfully completed.
YANG@yangdb-rac3> set autot trace exp
查看其执行计划,发现执行计划并没有走索引而是全表扫描
YANG@yangdb-rac3> select owner from bind where status='INVALID';
Execution Plan
----------------------------------------------------------
Plan hash value: 3586145581
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 36374 | 461K| 291 (1)| 00:00:04 |
|* 1 |TABLE ACCESS FULL| BIND | 36374 | 461K| 291 (1)| 00:00:04 |
--------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("STATUS"='INVALID')
为索引列的两个值创建直方图。
YANG@yangdb-rac3>EXEC DBMS_STATS.GATHER_TABLE_STATS(user,'BIND',method_opt => 'FOR ALL INDEXED COLUMNS SIZE 2');
PL/SQL procedure successfully completed.
YANG@yangdb-rac3> select owner from bind where status='INVALID';
Execution Plan
----------------------------------------------------------
Plan hash value: 4106465825
----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 13 | 169 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| BIND | 13 | 169 | 2 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | BIND_IDX | 13 | | 1 (0)| 00:00:01 |
----------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("STATUS"='INVALID')

但是当对于收集直方图的列在sql 语句where 中使用绑定变量的时候:执行计划改变了!没有选择索引而是全表扫描。
YANG@yangdb-rac3>variable val varchar2(10);
YANG@yangdb-rac3>exec :val :='VALID';
PL/SQL procedure successfully completed.
YANG@yangdb-rac3>select owner from bind where status= :val;
Execution Plan
----------------------------------------------------------
Plan hash value: 3586145581
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 36374 | 461K| 291 (1)| 00:00:04 |
|* 1 | TABLE ACCESS FULL| BIND | 36374 | 461K| 291 (1)| 00:00:04 |
--------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("STATUS"=:VAL)
YANG@yangdb-rac3>exec :val :='INVALID';
PL/SQL procedure successfully completed.
YANG@yangdb-rac3>
YANG@yangdb-rac3>select owner from bind where status= :val;
Execution Plan
----------------------------------------------------------
Plan hash value: 3586145581
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 36374 | 461K| 291 (1)| 00:00:04 |
|* 1 | TABLE ACCESS FULL| BIND | 36374 | 461K| 291 (1)| 00:00:04 |
--------------------------------------------------------------------------
Predicate Information (identified by operation id):
--------------------------------------------------
1 - filter("STATUS"=:VAL)
YANG@yangdb-rac3>alter system flush shared_pool;
System altered.
避免bind 变量,第一次执行时使用 INVALID
YANG@yangdb-rac3> variable val varchar2(10);
YANG@yangdb-rac3> exec :val :='INVALID';
PL/SQL procedure successfully completed.
YANG@yangdb-rac3> select owner from bind where status= :val;
Execution Plan
----------------------------------------------------------
Plan hash value: 3586145581
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 36374 | 461K| 291 (1)| 00:00:04 |
|* 1 | TABLE ACCESS FULL| BIND | 36374 | 461K| 291 (1)| 00:00:04 |
--------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("STATUS"=:VAL)
YANG@yangdb-rac3> select owner from bind where status= 'INVALID';
Execution Plan
----------------------------------------------------------
Plan hash value: 4106465825
----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 13 | 169 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| BIND | 13 | 169 | 2 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | BIND_IDX | 13 | | 1 (0)| 00:00:01 |
----------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("STATUS"='INVALID')
其实直方图具有一下几个使用限制
1 all predicates on the column use bind variables
2 the column data is uniformly distributed
3 the column is not used in WHERE clauses of queries
4 the column is unique and is used only with equality predicates
当sql 语句遇到上述情况,收集直方图信息是无效的。
参考文章:
oracle直方图解析
oracle 信息统计方法介绍
分享到:
评论

相关推荐

    matlab图像直方图均衡化和直方图匹配代码

    3. 对于直方图匹配,首先计算目标图像的直方图和CDF,然后找到源图像像素值与目标图像CDF之间的映射关系。 4. 应用映射关系到源图像的每个像素,生成处理后的图像。 在自定义函数中,可能还会包含对图像预处理和后...

    SQL执行计划与直方图关系研究.pdf

    统计信息和直方图作为数据库内部评估执行计划时所需的环境数据,是调优过程中的重要参考依据。 文章的引言部分还提到,数据库性能调优的方法多种多样,除了SQL调优之外,还包括数据库内存的调整、数据存储的优化等...

    直方图均衡化原理及实现

    同时,创建一个函数来执行直方图计算和均衡化。 2. **读取图像**:使用库函数(如OpenCV或自定义函数)读取图像数据,将其转换为灰度图像。 3. **计算直方图**:遍历图像中的每一个像素,累加对应灰度级的计数。 ...

    直方图均衡化、直方图变换、对比度自适应直方图均衡化

    这些方法共同展示了如何利用不同的直方图处理技术来改善图像的视觉效果和分析质量。通过对图像进行适当的增强,不仅可以提高人类观察者的视觉体验,还可以为后续的图像处理任务提供更有价值的信息。

    直方图规定化

    // 执行直方图均衡化 cv::imshow("原始图像", srcImage); cv::imshow("均衡化图像", dstImage); cv::waitKey(0); return 0; } ``` 这段代码首先读取一个灰度图像,然后调用`cv::equalizeHist()`进行直方图...

    ArcGIS教程:区域直方图

    在执行区域直方图分析时,ArcGIS 会将区域输入和值输入进行匹配,生成一个统计图表,显示不同区域中的像元值频数分布。 区域直方图的应用场景 1. 土地利用分类:区域直方图可以用于土地利用分类,显示不同土地利用...

    用C++实现图像的旋转和直方图均衡化

    在"基于控制台1"中,开发者可能展示了如何读取图像,计算直方图,执行均衡化操作,并显示结果。而在"基于控制台2"中,他们可能实现了读取图像,设置旋转角度,计算旋转矩阵,进行旋转操作,并显示旋转后的图像。这些...

    hist1.rar_均衡图片黑白_直方图_直方图均衡_直方图统计

    使用者可以通过这个资源学习如何编程实现直方图的计算,理解直方图均衡化算法,并且可能包括如何读取图像、创建直方图、执行均衡化操作以及可视化结果等步骤。 总结起来,"hist1.rar"压缩包提供了关于黑白图像直方...

    [MATLAB]数字图像处理—直方图均衡、直方图匹配、局部直方图增强、直方图分割

    在MATLAB环境中进行数字图像处理时,直方图分析是一个重要的步骤,它涉及到对图像亮度分布的理解和调整。本项目涵盖了直方图均衡、直方图匹配、局部直方图增强以及直方图分割等核心概念,这些都是图像处理中增强对比...

    VC++实现的直方图规定化代码

    这段代码中,`computeHistogram`函数用于计算图像的直方图,`histogramEqualization`函数执行直方图规定化操作。`main`函数中加载图像,调用这两个函数,并保存处理后的图像。 通过理解和应用这些原理,我们可以...

    基于opencv的彩色图像直方图均衡

    【基于OpenCV的彩色图像直方图均衡】 在计算机视觉领域,图像处理是不可或缺的一环,其中直方图均衡化是一种提升图像对比度的技术。OpenCV(Open Source Computer Vision Library)是一个强大的开源库,提供了丰富...

    图像处理-直方图均衡化和规定化MATLAB源代码

    这些源代码通常会包含自定义函数,分别用于执行直方图均衡化和规定化操作。通过对这些代码的阅读和理解,可以深入掌握这两个图像处理技术的具体实现细节。 在实际应用中,直方图均衡化和规定化经常结合使用,以优化...

    C#绘制直方图,饼图,曲线图

    数据可以从数据库查询得到,通过ADO.NET连接Oracle数据库,执行SQL语句获取数据,然后对数据进行分组和计算频率,最后根据结果绘制直方图。 饼图则用于显示一个数据系列中各项的大小与各项总和的比例关系。在C#中,...

    图像灰度化和直方图显示

    在图像处理领域,"图像灰度化"和"直方图显示"是两个重要的基本...这个过程可能包括读取图像、执行灰度转换、统计像素分布以及绘制直方图的步骤。理解这些概念并能实际操作,将有助于你在图像处理领域深入学习和发展。

    基于matlab的直方图均衡化的彩色图像增强程序

    本程序集是基于MATLAB实现的,专门针对彩色图像进行直方图均衡化的处理,旨在提升图像的清晰度和亮度。 直方图均衡化的核心思想是通过对图像像素值的重新映射,使图像的整体灰度分布更加均匀,从而扩大图像的动态...

    图像的直方图简要说明

    在《Visual C++实现数字图像增强处理.doc》文档中,可能会详细介绍如何使用C++编程语言实现上述图像处理方法,包括读取图像数据、计算直方图、执行直方图均衡化等步骤。可能涉及OpenCV等图像处理库,这些库提供了...

    作业一:彩色图像的直方图均衡化.zip

    然后,我们只需要对I通道执行直方图均衡化,同样利用`histeq`函数。均衡化后的I通道再与原有的色相和饱和度通道合并,通过`hsitorgb`函数转换回RGB空间。 在实际操作中,代码可能会如下所示: ```matlab % 问题1 ...

    11.灰度直方图概念及OpenCV绘制直方图1

    总结来说,灰度直方图是理解图像特性、执行图像分析和处理的关键工具。通过OpenCV,我们可以轻松地计算和绘制直方图,进而利用这些信息进行图像处理和分析。无论是简单的图像操作还是复杂的图像识别系统,直方图都是...

    c++源码 直方图均衡化源码

    例如`calculateHistogram`用于计算直方图,`computeCumulativeDistribution`用于计算累积分布函数,以及`applyHistogramEqualization`用于执行实际的灰度映射和像素替换。 通过阅读和理解这段源代码,你可以深入...

    matlab.rar_基于直方图_直方图 图像增强_直方图增强_直方图统计_统计直方图

    MATLAB是一种强大的数值计算和图形处理环境,它的图像处理工具箱提供了丰富的函数用于直方图分析和增强,如`imhist`用于绘制直方图,`histeq`用于执行直方图均衡化。 通过“新建文件夹 (2)”中的文件,你可以学习...

Global site tag (gtag.js) - Google Analytics