`

柱状图与cursor_sharing设置为similar研究

阅读更多

当cursor_sharing参数为similar来减少硬解析.在这种设置下,如果一个等值查询sql的条件列上存在柱状图,Oracle将认为每次由不同的字面变量产生的cursor都是unsafe的,这样就会产生硬解析且增加version count.

SYS@huiches>select * from v$version;
BANNER
--------------------------------------------------------------------------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Prod
PL/SQL Release 10.2.0.4.0 - Production
CORE 10.2.0.4.0 Production
TNS for 32-bit Windows: Version 10.2.0.4.0 - Production
NLSRTL Version 10.2.0.4.0 - Production

已用时间:  00: 00: 00.09
SYS@huiches>desc test;
 名称                                                                                                                                               是否为空? 类型
 -------------------------------------------------------------------------------------------------------------------------------------------------- -------- ---------------------------------------------------------------------------------------------------
 ID                                                                                                                                                          NUMBER
 NAME                                                                                                                                                        VARCHAR2(20)

SYS@huiches>select count(*) from test;
  COUNT(*)
----------
  19999900

已用时间:  00: 00: 10.79
SYS@huiches>select sql_text,hash_value from v$sql where sql_text='select count(*) from test';
SQL_TEXT                                                     HASH_VALUE
------------------------------------------------------------ ----------
select count(*) from test                                     297253644

已用时间:  00: 00: 00.03
SYS@huiches>select operation,options,object_name,optimizer from v$sql_plan where hashvalue='297253644';
OPERATION                      OPTIONS                        OBJECT_NAME                    OPTIMIZER
------------------------------ ------------------------------ ------------------------------ ----------------------------------------------------------------------------------------------------------------------------------------------------------------
SELECT STATEMENT                                                                             ALL_ROWS
SORT                           AGGREGATE
PX COORDINATOR
PX SEND                        QC (RANDOM)                    :TQ10000
SORT                           AGGREGATE
PX BLOCK                       ITERATOR
TABLE ACCESS                   FULL                           TEST

已选择7行。

已用时间:  00: 00: 02.61
SYS@huiches>show parameter cursor_sharing
NAME                                 TYPE                   VALUE
------------------------------------ ---------------------- ------------------------------
cursor_sharing                       string                 EXACT
SYS@huiches>alter system set cursor_sharing='SIMILAR';

系统已更改。

已用时间:  00: 00: 00.07
SYS@huiches>show parameter cursor_sharing
NAME                                 TYPE                   VALUE
------------------------------------ ---------------------- ------------------------------
cursor_sharing                       string                 SIMILAR

1.建立一个测试表histestnew,A B 两列都是unique的,区别在于A上有柱状图,B上没有柱状图;
SYS@huiches>create table histestnew as select rownum a, rownum b from dba_objects;

表已创建。

已用时间:  00: 00: 00.25
SYS@huiches>select count(*) from histestnew;
  COUNT(*)
----------
     50526

已用时间:  00: 00: 00.06
SYS@huiches>alter table histestnew add constraint UN1_histestnew unique (A);

表已更改。

已用时间:  00: 00: 00.23
SYS@huiches>alter table histestnew add constraint UN2_histestnew unique (B);

表已更改。

已用时间:  00: 00: 00.07

10g数据库统计怎么有问题呢?
SYS@huiches>exec dbms_stats.gather_table_stats(ownname=>'SYS',tabname=>'HISTESTNEW',cascade=>true,method_opt=>'FOR COLUMNS B SIZE 1');

PL/SQL 过程已成功完成。

已用时间:  00: 00: 00.15
SYS@huiches>select column_name,num_distinct,num_buckets from user_tab_col_statistics  where  table_name='HISTESTNEW';
COLUMN_NAME                                                  NUM_DISTINCT NUM_BUCKETS
------------------------------------------------------------ ------------ -----------
A                                                                   50526          75
B                                                                   51362           1

已用时间:  00: 00: 00.04
SYS@huiches>exec dbms_stats.gather_table_stats(ownname=>'SYS',tabname=>'HISTESTNEW',cascade=>true,method_opt=>'for columns B size 1');

PL/SQL 过程已成功完成。

已用时间:  00: 00: 00.12
SYS@huiches>select column_name,num_distinct,num_buckets from user_tab_col_statistics where table_name = 'HISTESTNEW';
COLUMN_NAME                                                  NUM_DISTINCT NUM_BUCKETS
------------------------------------------------------------ ------------ -----------
A                                                                   50526          75
B                                                                   50903           1

已用时间:  00: 00: 00.01

2.测试cursor_sharing=similar时,A列上不同字面量的等值查询将被oracle转换为相同hash value的sql语句;但是因为柱状图的存在,无法共享child cursor而发生硬解析:
SYS@huiches>show parameter cursor_sharing;
NAME                                 TYPE                   VALUE
------------------------------------ ---------------------- ------------------------------
cursor_sharing                       string                 SIMILAR
SYS@huiches>alter system flush shared_pool;

系统已更改。

已用时间:  00: 00: 00.23
SYS@huiches>select * from histestnew where a=1;
         A          B
---------- ----------
         1          1

已用时间:  00: 00: 00.03
SYS@huiches>select sql_text,version_count,optimizer_mode,hash_value from v$sqlarea where sql_text like '%select * from histestnew where a=%';
SQL_TEXT                                                     VERSION_COUNT OPTIMIZER_MODE       HASH_VALUE
------------------------------------------------------------ ------------- -------------------- ----------
select * from histestnew where a=:"SYS_B_0"                              1 ALL_ROWS             2855577372

已用时间:  00: 00: 00.03
SYS@huiches>select sql_text,loaded_versions,parse_calls,child_number from v$sql where sql_text like  '%select * from histestnew where a=%';
SQL_TEXT                                                     LOADED_VERSIONS PARSE_CALLS CHILD_NUMBER
------------------------------------------------------------ --------------- ----------- ------------
select * from histestnew where a=:"SYS_B_0"                                1           1            0

已用时间:  00: 00: 00.04
SYS@huiches>select * from v$mystat m,v$statname s where s.statistic#=m.statistic# and s.name='parse count (hard)';
       SID STATISTIC#      VALUE STATISTIC# NAME                                                              CLASS    STAT_ID
---------- ---------- ---------- ---------- ------------------------------------------------------------ ---------- ----------
       158        339        528        339 parse count (hard)                                                   64  143509059

已用时间:  00: 00: 00.01
SYS@huiches>select * from histestnew where a=2;     使用2,3,4这三个不同的字面量,做等值查询
         A          B
---------- ----------
         2          2

已用时间:  00: 00: 00.00
SYS@huiches>select * from histestnew where a=3;
         A          B
---------- ----------
         3          3

已用时间:  00: 00: 00.01
SYS@huiches>select * from histestnew where a=4;
         A          B
---------- ----------
         4          4

已用时间:  00: 00: 00.00
SYS@huiches>select sql_text,version_count,optimizer_mode,hash_value from v$sqlarea where sql_text like '%select * from histestnew where a=%';
SQL_TEXT                                                     VERSION_COUNT OPTIMIZER_MODE       HASH_VALUE
------------------------------------------------------------ ------------- -------------------- ----------
select * from histestnew where a=:"SYS_B_0"                        ALL_ROWS             2855577372

已用时间:  00: 00: 00.03
SYS@huiches>select sql_text,loaded_versions,parse_calls,child_number from v$sql where sql_text like  '%select * from histestnew where a=%';
SQL_TEXT                                                     LOADED_VERSIONS PARSE_CALLS CHILD_NUMBER
------------------------------------------------------------ --------------- ----------- ------------
select * from histestnew where a=:"SYS_B_0"                                1           1            0
select * from histestnew where a=:"SYS_B_0"                                1           1            1
select * from histestnew where a=:"SYS_B_0"                                1           1            2
select * from histestnew where a=:"SYS_B_0"                                1           1            3

已用时间:  00: 00: 00.04

硬解析次数也相应的增加了3(531-528)次:
SYS@huiches>select * from v$mystat m,v$statname s where s.statistic#=m.statistic# and s.name='parse count (hard)';
       SID STATISTIC#      VALUE STATISTIC# NAME                                                              CLASS    STAT_ID
---------- ---------- ---------- ---------- ------------------------------------------------------------ ---------- ----------
       158        339        531        339 parse count (hard)                                                   64  143509059

已用时间:  00: 00: 00.01

3.测试使用相同值做等值查询:
SYS@huiches>select * from histestnew where a=2;
         A          B
---------- ----------
         2          2

已用时间:  00: 00: 00.01
SYS@huiches>select * from histestnew where a=2;
         A          B
---------- ----------
         2          2

已用时间:  00: 00: 00.01
SYS@huiches>select * from histestnew where a=2;
         A          B
---------- ----------
         2          2

已用时间:  00: 00: 00.00

此时可以看到硬解析次数未增加,version_count个数也未增加,sql可以共享:
SYS@huiches>select * from v$mystat m,v$statname s where s.statistic#=m.statistic# and s.name='parse count (hard)';
       SID STATISTIC#      VALUE STATISTIC# NAME                                                              CLASS    STAT_ID
---------- ---------- ---------- ---------- ------------------------------------------------------------ ---------- ----------
       158        339        531        339 parse count (hard)                                                   64  143509059

已用时间:  00: 00: 00.03
SYS@huiches>select sql_text,version_count,optimizer_mode,hash_value from v$sqlarea where sql_text like '%select * from histestnew where a=%';
SQL_TEXT                                                     VERSION_COUNT OPTIMIZER_MODE       HASH_VALUE
------------------------------------------------------------ ------------- -------------------- ----------
select * from histestnew where a=:"SYS_B_0"                4       ALL_ROWS             2855577372

已用时间:  00: 00: 00.03
SYS@huiches>select sql_text,loaded_versions,parse_calls,child_number from v$sql where sql_text like  '%select * from histestnew where a=%';
SQL_TEXT                                                     LOADED_VERSIONS PARSE_CALLS CHILD_NUMBER
------------------------------------------------------------ --------------- ----------- ------------
select * from histestnew where a=:"SYS_B_0"                                1           4          1
select * from histestnew where a=:"SYS_B_0"                                1           1            2
select * from histestnew where a=:"SYS_B_0"                                1           1            3

已用时间:  00: 00: 00.04

4.现在来看看B列,没有柱状图.

首先执行查询,生成一个共享游标(Cursor):
SYS@huiches>alter system flush shared_pool;

系统已更改。

已用时间:  00: 00: 00.17
SYS@huiches>select * from histestnew where b=1;
         A          B
---------- ----------
         1          1

已用时间:  00: 00: 00.01
  1* select sql_text,version_count,optimizer_mode,hash_value from v$sqlarea where sql_text like '%select * from histestnew where b=%'
SYS@huiches>/
SQL_TEXT                                                     VERSION_COUNT OPTIMIZER_MODE       HASH_VALUE
------------------------------------------------------------ ------------- -------------------- ----------
select * from histestnew where b=:"SYS_B_0"                              1 ALL_ROWS             2699912528

已用时间:  00: 00: 00.04
  1* select sql_text,loaded_versions,parse_calls,child_number from v$sql where sql_text like '%select * from histestnew where b=%'
SYS@huiches>/
SQL_TEXT                                                     LOADED_VERSIONS PARSE_CALLS CHILD_NUMBER
------------------------------------------------------------ --------------- ----------- ------------
select * from histestnew where b=:"SYS_B_0"                                1           1            0

已用时间:  00: 00: 00.03
SYS@huiches>select * from v$mystat m,v$statname s where s.statistic#=m.statistic# and s.name='parse count (hard)';
       SID STATISTIC#      VALUE STATISTIC# NAME                                                              CLASS    STAT_ID
---------- ---------- ---------- ---------- ------------------------------------------------------------ ---------- ----------
       158        339        616        339 parse count (hard)                                                   64  143509059

已用时间:  00: 00: 00.03
SYS@huiches>select * from histestnew where b=2;
         A          B
---------- ----------
         2          2

已用时间:  00: 00: 00.01
SYS@huiches>select * from histestnew where b=3;
         A          B
---------- ----------
         3          3

已用时间:  00: 00: 00.01
SYS@huiches>select * from histestnew where b=4;
         A          B
---------- ----------
         4          4

已用时间:  00: 00: 00.00
SYS@huiches>select sql_text,version_count,optimizer_mode,hash_value from v$sqlarea where sql_text like '%select * from histestnew where b=%';
SQL_TEXT                                                     VERSION_COUNT OPTIMIZER_MODE       HASH_VALUE
------------------------------------------------------------ ------------- -------------------- ----------
select * from histestnew where b=:"SYS_B_0"                              1 ALL_ROWS             2699912528

已用时间:  00: 00: 00.03

可以看到这个SQL只有一个版本,解析调用4次,实现了共享:
SYS@huiches>select sql_text,loaded_versions,parse_calls,child_number from v$sql where sql_text like '%select * from histestnew where b=%';
SQL_TEXT                                                     LOADED_VERSIONS PARSE_CALLS CHILD_NUMBER
------------------------------------------------------------ --------------- ----------- ------------
select * from histestnew where b=:"SYS_B_0"                                1                      0

已用时间:  00: 00: 00.03

SYS@huiches>select * from v$mystat m,v$statname s where s.statistic#=m.statistic# and s.name='parse count (hard)';
       SID STATISTIC#      VALUE STATISTIC# NAME                                                              CLASS    STAT_ID
---------- ---------- ---------- ---------- ------------------------------------------------------------ ---------- ----------
       158        339        616        339 parse count (hard)                                                   64  143509059

可见在cursor_sharing=similar的环境中,如果条件列上存在柱状图,不同的字面量等值查询的sql,parent cursor可以共享,但是无法共享child cursor(VERSION_COUNT),因而造成硬解析.每一次sql被执行前都先要到library cache中根据hash value 查找parent cursor,然后查找是否有可以共享的child cursor,如果有就发生软解析,没有就要硬解析.在这个过程中,要使用library cache latch.如果发生硬解析,就要多次获得library cache latch,并且随着child cursor数量的增多,library cache latch 被持有的时间也会变长.由于latch是串行机制,多个进程同时申请获得一个latch就会产生竞争.等待获得latch的过程就是latch free,在等待latch free的时候,进程将持续占有CPU,这可能引起latch free导致CUP使用率过高.

分享到:
评论

相关推荐

    柱状图V3_Labviewhistogram_labview.柱形图_labview柱状图_labview柱状图

    4. **用户交互**:Labview的图形用户界面(GUI)设计强大,可以添加控件和指示器,让用户能直接与柱状图互动,比如通过滑动条改变bin大小,点击柱子查看具体数据等。 5. **数据可视化**:Labview允许自定义颜色、...

    用Delphi实现柱状图_delphi_delphi柱状图_delphi柱行图_delphi图形pudn_

    柱状图通常使用BarSeries或者ColumnSeries,两者的主要区别在于显示方式——前者为横向,后者为纵向。 3. **自定义样式**:每个柱子都可以独立设置颜色、透明度、图案和边框等样式。通过修改Series的Items属性,...

    柱状图_VB窗体显示柱状图_vb柱状图_柱状图mdb_柱状图_

    在VB(Visual Basic)开发环境中,创建一个窗体显示柱状图是一项常见的任务,尤其在数据分析和可视化领域。本文将详细讲解如何利用VB来实现这一功能,并结合数据库数据进行展示。 首先,我们要明白柱状图是一种图形...

    渐变柱状图代码.rar_matlab柱状图_matlab渐变图_柱状图_渐变色_渐变色 matlab

    在MATLAB中,柱状图是一种常用的数据可视化工具,它能直观地展示各类别数据的大小。当柱状图结合渐变色时,可以更好地突出数据的差异和趋势,增加图表的美观性和可读性。本教程将详细介绍如何在MATLAB中创建具有渐变...

    柱状图_companyyza_图形_

    标题中的“柱状图_companyyza_图形_”暗示了我们即将探讨的是关于柱状图这一数据可视化工具,以及可能与“companyyza”相关的应用。柱状图是一种常用的数据表示方式,它通过竖直的条形长度来展示各类别数据的大小或...

    柱状图的Demo_安卓源码.zip

    【标题】"柱状图的Demo_安卓源码.zip"是一个专门为Android平台设计的应用源码示例,它展示了如何在Android应用中实现柱状图的功能。这个Demo是开发者学习和理解如何在Android应用中集成柱状图图表的一个理想资源。 ...

    xy_bar_graph.zip_bar图_graph_labview 柱状图_labview柱状图_xy_bar_graph

    首先,XY Bar Graph与传统的柱状图相似,但其独特之处在于它允许用户通过X轴和Y轴定义数据的分类和值。这种图表类型可以清晰地显示两个变量之间的关系,对于数据分析和结果展示非常有用。在"xy_bar_graph.vi"这个VI...

    imagestone.zip_C++ 图像柱状图_ImageStone_undo_图像 特效_图像处理库

    2. **图像柱状图**: 柱状图是数据可视化的一种常见方法,常用于表示数量或比例的关系。在图像处理中,柱状图分析可能用于统计图像的像素分布、颜色频率等信息,帮助用户理解和分析图像特征。 3. **ImageStone**: ...

    VB柱状图图表例子_将汇总数据用图表分析并显示

    在这个例子中,我们创建了一个名为"DataSeries"的系列,设置了它的类型为柱状图,并为每个类别添加了相应的值。`IsValueShownAsLabel`属性使柱子顶部自动显示数据值。 为了显示汇总数据,你需要先对数据进行处理,...

    堆叠图_echarts_柱状堆叠图_

    堆叠柱状图在业务分析、市场研究等领域有广泛的应用,比如分析不同产品的销售比例、不同地区的用户分布等。通过堆叠柱状图,我们可以直观地理解各个部分如何共同构成整体,以及各部分之间的相对大小关系。在实际应用...

    GSM.rar_c++ 柱状图_钻孔_钻孔柱状图

    总体而言,GSM软件利用C++的编程能力,为地质勘探或矿业领域的专业人员提供了一个便捷的工具,能够处理钻孔数据并生成直观的柱状图,帮助他们理解和解释地下结构。用户通过导入Excel数据,利用GSM.exe运行程序,结合...

    柱状图 柱状图 柱状图

    柱状图 柱状图 柱状图 柱状图 柱状图 柱状图 柱状图 柱状图 柱状图 柱状图 柱状图 柱状图 柱状图 柱状图 柱状图 柱状图 柱状图 柱状图 柱状图 柱状图 柱状图 柱状图 柱状图 柱状图 柱状图 柱状图

    JSP调用Java Bean在网页上动态生成柱状图.zip_jfree java_jfreechart_jsp_图 jsp_网

    它可能包含方法来设置图表的标题、轴标签、颜色和其他视觉属性,以及将JavaBean提供的数据转换为JFreeChart可以理解的数据模型。 "chart.jpg"是生成的柱状图的静态图像文件,它是由"ChartGraphics"类创建并保存在...

    js jquery实现柱状图,饼状图,折线图,平面图,立体三维图

    在给定的标题和描述中,我们主要涉及到四种图表类型:柱状图、饼状图、折线图以及立体三维图。这些图表的实现通常依赖于第三方库,如Chart.js、Highcharts、D3.js或jQuery UI等。在这里,我们将探讨如何使用jQuery来...

    柱状图V3.0-112,柱状图怎么做,LabView

    6. **导出图表**:生成的柱状图可以保存为图片,方便在报告或演示中使用。 **三、柱状图V3.0-112.vi分析** 这个特定的VI可能包含了一些优化或增强功能,比如自定义颜色方案、动态数据更新、多列数据处理等。由于...

    柱状图V3.0-112,柱状图怎么做,LabView源码.zip

    在本文中,我们将深入探讨如何使用LabVIEW创建柱状图,以及如何利用提供的"柱状图V3.0-112,柱状图怎么做,LabView源码.zip"资源来学习和理解这一过程。LabVIEW(Laboratory Virtual Instrument Engineering Workbench...

    Java生成柱状图

    Java生成柱状图是一种在Java应用程序中展示数据的可视化方式,尤其适用于数据分析和报告。柱状图能够清晰地比较不同类别的数据量,是数据可视化的常见选择。在这个项目中,开发者提供了一个可以直接运行的解决方案,...

    Qt 柱状图绘制

    Qt库是一种跨平台的C++图形用户界面应用程序开发框架,被广泛用于开发桌面和移动设备的应用。...如果你想要进一步提升,可以研究如何添加动画效果,或者将柱状图与其他Qt组件集成,以实现更复杂的数据分析和交互功能。

    echarts-省份地图+柱状图组合.zip

    通过研究这个例子,你可以了解到 ECharts 如何处理地图数据、如何将地图与柱状图关联,以及如何实现地图和柱状图的交互效果。同时,这也展示了 ECharts 的灵活性和强大的可视化能力,使得数据的展示更加生动和直观。

    scatterbar.zip_MATLAB 柱状图函数_matlab中scatterbar_matlab柱状图_scatterb

    总的来说,`scatterbar.zip`提供的MATLAB脚本为用户提供了绘制三维数据柱状图的便利,通过散点与柱状的结合,使得数据可视化更加直观且富有深度。无论是学术研究还是工程实践中,掌握这类数据可视化技巧都将极大地...

Global site tag (gtag.js) - Google Analytics