前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >【DB笔试面试582】在Oracle中,什么是绑定变量窥探(下)?

【DB笔试面试582】在Oracle中,什么是绑定变量窥探(下)?

作者头像
AiDBA宝典
发布于 2019-09-29 07:52:00
发布于 2019-09-29 07:52:00
1.2K00
代码可运行
举报
运行总次数:0
代码可运行

若启用了绑定变量窥探且WHERE条件为“目标列 BETWEEN X AND Y”的selectivity计算公式为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
selectivity=((Y-X)/(HIGH_VALUE-LOW_VALUE)+2/NUM_DISTINCT)*Null_Adjust
Null_Adjust=(NUM_ROWS-NUM_NULLS)/NUM_ROWS

--总公式:cardinality=((Y-X)/(HIGH_VALUE-LOW_VALUE)+2/NUM_DISTINCT)*(NUM_ROWS-NUM_NULLS)

--查询相关的值:
LHR@orclasm > SELECT D.NUM_ROWS FROM DBA_TABLES D WHERE D.TABLE_NAME='T_BP_20170609_LHR';

  NUM_ROWS
----------
     78170

LHR@orclasm > col LOW_VALUE format a6
LHR@orclasm > col high_VALUE format a10
LHR@orclasm > SELECT D.LOW_VALUE,D.HIGH_VALUE,UTL_RAW.CAST_TO_NUMBER(D.LOW_VALUE) LOW_VALUE1,UTL_RAW.CAST_TO_NUMBER(D.HIGH_VALUE) HIGH_VALUE1,D.NUM_DISTINCT,D.NUM_NULLS,D.HISTOGRAM FROM DBA_TAB_COL_STATISTICS D WHERE D.TABLE_NAME='T_BP_20170609_LHR' AND D.COLUMN_NAME='OBJECT_ID';

LOW_VA HIGH_VALUE LOW_VALUE1 HIGH_VALUE1 NUM_DISTINCT  NUM_NULLS HISTOGRAM
------ ---------- ---------- ----------- ------------ ---------- ---------------
C103   C3111A1F            2      162530        78158         12 NONE

--XY的值分别为100102时,以及XY的值分别为10060000时,基数Cardinality的值为:
LHR@orclasm > SELECT ROUND(((102-100)/(162530-2)+2/78158)*(78170-12)),ROUND(((60000-100)/(162530-2)+2/78158)*(78170-12)) FROM DUAL; 

ROUND(((102-100)/(162530-2)+2/78158)*(78170-12)) ROUND(((60000-100)/(162530-2)+2/78158)*(78170-12))
------------------------------------------------ --------------------------------------------------
                                               3                                              28807

--可以看到结果和上述直接计划中的结果一致。
--下面禁用绑定变量窥探:
LHR@orclasm > ALTER SESSION SET "_OPTIM_PEEK_USER_BINDS"=FALSE;

Session altered.

LHR@orclasm > EXEC :Y :=102;

PL/SQL procedure successfully completed.

LHR@orclasm > SELECT COUNT(1) FROM T_BP_20170609_LHR T WHERE T.OBJECT_ID BETWEEN :X AND :Y;

  COUNT(1)
----------
         3

LHR@orclasm > SELECT A.SQL_TEXT, A.SQL_ID,A.VERSION_COUNT,A.EXECUTIONS FROM V$SQLAREA A WHERE A.SQL_TEXT LIKE 'SELECT COUNT(1) FROM T_BP_20170609_LHR T%';

SQL_TEXT                                                                                             SQL_ID        VERSION_COUNT EXECUTIONS
---------------------------------------------------------------------------------------------------- ------------- ------------- ----------
SELECT COUNT(1) FROM T_BP_20170609_LHR T WHERE T.OBJECT_ID BETWEEN 100 AND 102                       5q51c7s4z0dp9             1          1
SELECT COUNT(1) FROM T_BP_20170609_LHR T WHERE T.OBJECT_ID BETWEEN :X AND :Y                         gya9jjznchps5             2          2
SELECT COUNT(1) FROM T_BP_20170609_LHR T WHERE T.OBJECT_ID BETWEEN 100 AND 60000                     gpbkt45132r8x             1          1


LHR@orclasm > SELECT A.PLAN_HASH_VALUE,A.CHILD_NUMBER,A.EXECUTIONS FROM V$SQL A WHERE A.SQL_ID='gya9jjznchps5';

PLAN_HASH_VALUE CHILD_NUMBER EXECUTIONS
--------------- ------------ ----------
     2066501558            0          1
      196260839            1          1

--可以看到目标SQL对应的列VERSION_COUNTEXECUTIONS的值均由之前的1变为了现在的2,这说明Oracle在第四次执行该SQL时用的还是硬解析。当把绑定变量窥探关闭后再次执行目标SQL时所对应的解析树和执行计划应该存储在CHILD_NUMBER1的Child Cursor中。CHILD_NUMBER1的Child Cursor所对应的执行计划为如下所示:
LHR@orclasm > SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('gya9jjznchps5',1,'advanced'));

PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------
SQL_ID  gya9jjznchps5, child number 1
-------------------------------------
SELECT COUNT(1) FROM T_BP_20170609_LHR T WHERE T.OBJECT_ID BETWEEN :X AND :Y

Plan hash value: 196260839

------------------------------------------------------------------------------------
| Id  | Operation          | Name          | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |               |       |       |     2 (100)|          |
|   1 |  SORT AGGREGATE    |               |     1 |     5 |            |          |
|*  2 |   FILTER           |               |       |       |            |          |
|*  3 |    INDEX RANGE SCAN| IDX_OBJID_LHR |   195 |   975 |     2   (0)| 00:00:01 |
------------------------------------------------------------------------------------

Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------

   1 - SEL$1
   3 - SEL$1 / T@SEL$1

Outline Data
-------------

  /*+
      BEGIN_OUTLINE_DATA
      IGNORE_OPTIM_EMBEDDED_HINTS
      OPTIMIZER_FEATURES_ENABLE('11.2.0.3')
      DB_VERSION('11.2.0.3')
      OPT_PARAM('_optim_peek_user_binds' 'false')
      ALL_ROWS
      OUTLINE_LEAF(@"SEL$1")
      INDEX(@"SEL$1" "T"@"SEL$1" ("T_BP_20170609_LHR"."OBJECT_ID"))
      END_OUTLINE_DATA
  */

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

   2 - filter(:X<=:Y)
   3 - access("T"."OBJECT_ID">=:X AND "T"."OBJECT_ID"<=:Y)

Column Projection Information (identified by operation id):
-----------------------------------------------------------

   1 - (#keys=0) COUNT(*)[22]

可以看到Oracle评估出来执行这个索引范围扫描所返回结果集的Cardinality的值为195。注意,上述执行计划中的Outline Data部分有“OPT_PARAM('_optim_peek_user_binds' 'false')”,而且执行计划中并没有之前启用绑定窥探时出现的“Peeked Binds”部分的内容,这都说明此时Oracle确实己经禁用了绑定变量窥探。

使用DDL操作可以让Oracle再次执行目标SQL时使用硬解析,但这种方法的弊端在于其影响范围还是太广了,因为一旦对某个表执行了DDL操作,再次执行与这个表相关的所有SQL时就会全部使用硬解析。这是很不好的,特别是对于OLTP类型的应用系统而言,因为这可能会导致短时间内的硬解析数量剧增,进而影响系统的性能。

下面使用DBMS_SHARED_POOL.PURGE来删除共享池中的该游标:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
LHR@orclasm > SELECT A.SQL_TEXT, A.SQL_ID,A.VERSION_COUNT,A.EXECUTIONS,A.ADDRESS,A.HASH_VALUE FROM V$SQLAREA A WHERE A.SQL_TEXT LIKE 'SELECT COUNT(1) FROM T_BP_20170609_LHR T%'; 

SQL_TEXT                                                                                             SQL_ID        VERSION_COUNT EXECUTIONS ADDRESS          HASH_VALUE
---------------------------------------------------------------------------------------------------- ------------- ------------- ---------- ---------------- ----------
SELECT COUNT(1) FROM T_BP_20170609_LHR T WHERE T.OBJECT_ID BETWEEN 100 AND 102                       5q51c7s4z0dp9             1          1 00000000A9490728  166737577
SELECT COUNT(1) FROM T_BP_20170609_LHR T WHERE T.OBJECT_ID BETWEEN :X AND :Y                         gya9jjznchps5             2          2 00000000A937CD78 3905443589
SELECT COUNT(1) FROM T_BP_20170609_LHR T WHERE T.OBJECT_ID BETWEEN 100 AND 60000                     gpbkt45132r8x             1          1 00000000A948FCA8 1110531357

LHR@orclasm > EXEC SYS.DBMS_SHARED_POOL.PURGE('00000000A937CD78,3905443589','C');

PL/SQL procedure successfully completed.

LHR@orclasm > SELECT A.SQL_TEXT, A.SQL_ID,A.VERSION_COUNT,A.EXECUTIONS,A.ADDRESS,A.HASH_VALUE FROM V$SQLAREA A WHERE A.SQL_TEXT LIKE 'SELECT COUNT(1) FROM T_BP_20170609_LHR T%'; 

SQL_TEXT                                                                                             SQL_ID        VERSION_COUNT EXECUTIONS ADDRESS          HASH_VALUE
---------------------------------------------------------------------------------------------------- ------------- ------------- ---------- ---------------- ----------
SELECT COUNT(1) FROM T_BP_20170609_LHR T WHERE T.OBJECT_ID BETWEEN 100 AND 102                       5q51c7s4z0dp9             1          1 00000000A9490728  166737577
SELECT COUNT(1) FROM T_BP_20170609_LHR T WHERE T.OBJECT_ID BETWEEN 100 AND 60000                     gpbkt45132r8x             1          1 00000000A948FCA8 1110531357

--可以看到目标SQL的确被删除了,现在保持X的值不变,修改Y的的值为60000LHR@orclasm > EXEC :Y :=60000;

PL/SQL procedure successfully completed.

LHR@orclasm > SELECT COUNT(1) FROM T_BP_20170609_LHR T WHERE T.OBJECT_ID BETWEEN :X AND :Y; 

  COUNT(1)
----------
     59539

LHR@orclasm > SELECT A.SQL_TEXT, A.SQL_ID,A.VERSION_COUNT,A.EXECUTIONS FROM V$SQLAREA A WHERE A.SQL_TEXT LIKE 'SELECT COUNT(1) FROM T_BP_20170609_LHR T%';

SQL_TEXT                                                                                             SQL_ID        VERSION_COUNT EXECUTIONS
---------------------------------------------------------------------------------------------------- ------------- ------------- ----------
SELECT COUNT(1) FROM T_BP_20170609_LHR T WHERE T.OBJECT_ID BETWEEN 100 AND 102                       5q51c7s4z0dp9             1          1
SELECT COUNT(1) FROM T_BP_20170609_LHR T WHERE T.OBJECT_ID BETWEEN :X AND :Y                         gya9jjznchps5             2          1
SELECT COUNT(1) FROM T_BP_20170609_LHR T WHERE T.OBJECT_ID BETWEEN 100 AND 60000                     gpbkt45132r8x             1          1

LHR@orclasm > SELECT A.PLAN_HASH_VALUE,A.CHILD_NUMBER,A.EXECUTIONS FROM V$SQL A WHERE A.SQL_ID='gya9jjznchps5';

PLAN_HASH_VALUE CHILD_NUMBER EXECUTIONS
--------------- ------------ ----------
      196260839            0          1

--可以看到,EXECUTIONS的值为1说明Oracle在执行此SQL时确实是在用硬解析,但这里VERSION COUNT的值为什么会是2?应该是1才对。从V$SQL查询结果可以看到,上述目标SQL对应的Parent Cursor下确实只挂了一个Child Cursor,所以VERSION_COUNT的值应该是1而不是2(这里也许是Oracle的Bug,不再深究)。
--执行计划为:
LHR@orclasm > SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('gya9jjznchps5',0,'advanced'));

PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------
SQL_ID  gya9jjznchps5, child number 0
-------------------------------------
SELECT COUNT(1) FROM T_BP_20170609_LHR T WHERE T.OBJECT_ID BETWEEN :X AND :Y

Plan hash value: 196260839

------------------------------------------------------------------------------------
| Id  | Operation          | Name          | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |               |       |       |     2 (100)|          |
|   1 |  SORT AGGREGATE    |               |     1 |     5 |            |          |
|*  2 |   FILTER           |               |       |       |            |          |
|*  3 |    INDEX RANGE SCAN| IDX_OBJID_LHR |   195 |   975 |     2   (0)| 00:00:01 |
------------------------------------------------------------------------------------

Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------

   1 - SEL$1
   3 - SEL$1 / T@SEL$1

Outline Data
-------------

  /*+
      BEGIN_OUTLINE_DATA
      IGNORE_OPTIM_EMBEDDED_HINTS
      OPTIMIZER_FEATURES_ENABLE('11.2.0.3')
      DB_VERSION('11.2.0.3')
      OPT_PARAM('_optim_peek_user_binds' 'false')
      ALL_ROWS
      OUTLINE_LEAF(@"SEL$1")
      INDEX(@"SEL$1" "T"@"SEL$1" ("T_BP_20170609_LHR"."OBJECT_ID"))
      END_OUTLINE_DATA
  */

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

   2 - filter(:X<=:Y)
   3 - access("T"."OBJECT_ID">=:X AND "T"."OBJECT_ID"<=:Y)

Column Projection Information (identified by operation id):
-----------------------------------------------------------

   1 - (#keys=0) COUNT(*)[22]


48 rows selected.

从上述显示内容可以看出,Oracle此时选择的执行计划还是走对索引IDX_OBJID_LHR的索引范围扫描,而且Oracle评估出来执行这个索引范围扫描所返回结果集的Cardinality的值依然是195。这意味着当把绑定变量窥探关闭后,无论对绑定变量X和Y传入的值是多少,都不会影响Oracle对于目标SQL执行计划的选择。如果不使用绑定变量窥探,那么对于那些可选择率可能会随着具体输入值的变化而变化的谓词条件而言,Oracle会使用默认的可选择率(5%)。

下面来计算一下cardinality,

若禁用了绑定变量窥探且WHERE条件为“目标列 BETWEEN X AND Y”的selectivity和Cardinality的计算公式为如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Cardinality=NUM ROWS*Selectivity
Selectivity=0.05*0.05

注意,WHERE条件为“目标列 BETWEEN X AND Y",相当于“目标列 >= X AND目标列 <= Y"。对于“目标列 >=X ”和“目标列 <= Y”而言,Oracle均会使用5%的可选择率,所以“目标列 >= X AND目标列 <= Y”的总的可选择率就是0.05*0.05=0.0025。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
LHR@orclasm > SELECT ROUND(78170*0.0025) FROM DUAL; 

ROUND(78170*0.0025)
-------------------
                195

可见和执行计划中的一致。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-06-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DB宝 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【DB笔试面试582】在Oracle中,什么是绑定变量窥探(上)?
目标SQL若不使用绑定变量,则当具体输入值一旦发生了变化,目标SQL的SQL文本就会随之发生变化,这样Oracle就能很容易地计算出对应Selectivity和Cardinality的值,进而据此来选择执行计划。但对于使用了绑定变量的目标SQL而言,情况就完全不一样了,因为现在无论对应绑定变量的具体输入值是什么,目标SQL的SQL文本都是一模一样的。对于使用了绑定变量的目标SQL而言,Oracle可以选择如下两种方法来决定其执行计划:
AiDBA宝典
2019/09/29
1.5K0
【DB笔试面试586】在Oracle中,什么是自适应游标共享(2)?
另外,在目标列有Frequency类型直方图的前提条件下,如果对目标列施加等值查询条件,且该查询条件的输入值等于该列的某个实际值时,则该谓词条件的可选择率的计算公式为如下所示:
AiDBA宝典
2019/09/29
5400
【DB笔试面试586】在Oracle中,什么是自适应游标共享(1)?
绑定变量窥探的副作用就在于,使用了绑定变量的目标SQL只会沿用之前硬解析时所产生的解析树和执行计划,即使这种沿用完全不适合于当前的情形。在Oracle 10g及其后续的版本中,Oracle会自动收集直方图统计信息,这意味着与之前的版本相比,在Oracle 10g及其后续的版本中Oracle有更大的概率会知道目标列实际数据的分布情况,也就是说绑定变量窥探的副作用将会更加明显。当Oracle执行绑定变量窥探操作时绑定变量所对应的输入值是否具有代表性就至关重要了(这里“代表性”是指该输入值所对应的执行计划和该SQL在大多数情况下的执行计划相同),因为这会直接决定此目标SQL在硬解析时所选择的执行计划,进而决定后续以软解析/软软解析重复执行时所沿用的执行计划。
AiDBA宝典
2019/09/29
7040
【DB笔试面试586】在Oracle中,什么是自适应游标共享(3)?
从如下查询结果可以看到目标SQL对应的列VERSION_COUNT的值从之前的5变为了现在的6,列EXECUTIONS的值为7,说明Oracle在第7次执行目标SQL时依然用的是硬解析。从查询结果可以看到,Oracle此时新生成了一个CHILD_NUMBER为5的Child Cursor,并且把存储相同执行计划的CHILD_NUMBER为4的原有Child Cursor标记为非共享。
AiDBA宝典
2019/09/29
3590
【DB笔试面试586】在Oracle中,什么是自适应游标共享(4)?
从上述计算结果可以看出,现在计算出的可选择率范围为[0.014172,0.017322],在CHILD_NUMBER为5的原有Child Cursor对应的可选择率范围[0.000023,0.052317]之内,所以刚才Oracle在执行上述SQL时(即第8次执行目标SQL)用的就是软解析/软软解析,并且此时重用的就是CHILD_NUMBER为5的Child Cursor中存储的解析树和执行计划。
AiDBA宝典
2019/09/29
5720
【DB笔试面试642】在Oracle中,什么是基数反馈(Cardinality Feedback)?
基数反馈(Cardinality Feedback,CFB)是Oracle 11gR2出现的一个新特性,它的出现是为了帮助Oracle优化器依据更精准的基数生成更加优秀的执行计划。基数的评估准确与否,对于优化器异常重要,直接影响到后续的JOIN COST等重要的成本计算评估。若评估不当则会造成CBO选择不当的执行计划。此技术对于仅执行一次的SQL无效,在SQL第一次执行时,记录存储实际的基数和评估的基数之间的差异,如果差异较大,在第二次执行时,优化器会依据实际的基数重新决策生成执行计划,但是需要注意的是,当使用更准确的基数重新生成执行计划时,生成的执行计划与第一次时使用的执行计划完全有可能是相同的。这个技术的出现是由于优化器在一些情况下不能很好的去计算基数的数值,比如:统计信息缺失或陈旧、多谓词、直方图缺失等等。
AiDBA宝典
2019/09/29
7820
【DB笔试面试583】在Oracle中,什么是绑定变量分级?
绑定变量分级(Bind Graduation)是指Oracle在PL/SQL代码中会根据文本型绑定变量的定义长度而将这些文本型绑定变量分为四个等级,不同等级分配的内存大小不同,如下表所示:
AiDBA宝典
2019/09/29
7230
【DB笔试面试585】在Oracle中,什么是常规游标共享?
游标共享(Cursor Sharing)是指共享游标(Shared Cursor)之间的共享,游标共享可以实现重用存储在子游标(Child Cursor)中的解析树和执行计划而不用从头开始做硬解析,从而提高系统性能。特别对于同一类型的目标SQL更应该实现游标共享,而使用绑定变量就可以实现游标共享。
AiDBA宝典
2019/09/29
8940
【DB笔试面试598】在Oracle中,如何得到真实的执行计划?
在Oracle数据库中判断得到的执行计划是否准确,就是看目标SQL是否被真正执行过,真正执行过的SQL所对应的执行计划就是准确的,反之则有可能不准,因此,通过10046事件及如下的几种方式得到的执行计划是最准确的,而从其它方式获取到的执行计划都有可能不准确。
AiDBA宝典
2019/09/29
7090
Oracle面对“数据倾斜列使用绑定变量”场景的解决方案
    我们知道,Oracle在传统的OLTP(在线事务处理)类系统中,强烈推荐使用绑定变量,这样可以有效的减少硬解析从而增加系统的并发处理能力。甚至在有些老旧系统,由于在开始开发阶段缺乏认识没有使用到绑定变量,后期并发量增长且无法改造程序时,运维DBA还会不得已去设置cursor_sharing=force来强制使用系统的绑定变量(这是一个万不得已的方案,并不是最佳实践)。
Alfred Zhao
2019/08/27
1.8K0
【DB笔试面试570】在Oracle中,SQL优化在写法上有哪些常用的方法?
一般在书写SQL时需要注意哪些问题,如何书写可以提高查询的效率呢?可以从以下几个方面去考虑:
AiDBA宝典
2019/09/29
3.6K0
什么是Oracle的高版本游标(High Version Count)?如何排查?
一个父游标下对应的子游标个数被称为Version Count,每个子游标对应一个执行计划。对于一个特定的游标有多少个版本(Version Count)就属于高版本游标是没有明确定义的。对于不同的系统有不同的数量界定。High Version Count不仅产生的原因是多种多样的,而且会导致各种令人头痛的问题,轻则导致数据库的性能急剧下降,CPU利用率剧增,重则导致数据库挂起,触发ORA-04031或者其它BUG导致宕机。
AiDBA宝典
2024/04/16
3720
什么是Oracle的高版本游标(High Version Count)?如何排查?
Oracle 绑定变量窥探
    Bind Peeking是Oracle 9i中引入的新特性,一直持续到Oracle 10g R2。它的作用就是在SQL语句硬分析的时候,查看一下当前SQL谓词的值 ,以便生成最佳的执行计划。而在oracle 9i之前的版本中,Oracle 只根据统计信息来做出执行计划。
Leshami
2018/08/14
1.7K0
【DB笔试面试578】在Oracle中,什么是会话游标?会话游标和共享游标的区别有哪些?会话游标分为哪几类?
在Oracle中,什么是会话游标?会话游标和共享游标的区别有哪些?会话游标分为哪几类?
AiDBA宝典
2019/09/29
1.5K0
【DB笔试面试578】在Oracle中,什么是会话游标?会话游标和共享游标的区别有哪些?会话游标分为哪几类?
【DB笔试面试584】在Oracle中,如何得到已执行的目标SQL中的绑定变量的值?
当Oracle解析和执行含有绑定变量的目标SQL时,如果满足如下两个条件之一,那么该SQL中的绑定变量的具体输入值就会被Oracle捕获:
AiDBA宝典
2019/09/29
3.1K0
什么是Oracle的高版本游标(High Version Count)?如何排查?(持续更新)
一个父游标下对应的子游标个数被称为Version Count,每个子游标对应一个执行计划。对于一个特定的游标有多少个版本(Version Count)就属于高版本游标是没有明确定义的。对于不同的系统有不同的数量界定。High Version Count不仅产生的原因是多种多样的,而且会导致各种令人头痛的问题,轻则导致数据库的性能急剧下降,CPU利用率剧增,重则导致数据库挂起,触发ORA-04031或者其它BUG导致宕机。
AiDBA宝典
2024/04/18
8240
什么是Oracle的高版本游标(High Version Count)?如何排查?(持续更新)
【DB笔试面试258】在Oracle中,执行计划里的access和filter有什么区别(下)?
有关access和filter的更多内容可以参考我的BLOG:http://blog.itpub.net/26736162/viewspace-2141522/
AiDBA宝典
2019/09/30
1.2K0
【DB笔试面试646】在Oracle中,什么是基数(Cardinality)和可选择率(Selectivity)?
在Oracle中,什么是基数(Cardinality)和可选择率(Selectivity)?
AiDBA宝典
2019/09/29
8630
【DB笔试面试646】在Oracle中,什么是基数(Cardinality)和可选择率(Selectivity)?
【DB笔试面试258】在Oracle中,执行计划里的access和filter有什么区别(上)?
一般而言,access表示这个谓词条件的值将会影响数据的访问路径(表还是索引);filter表示谓词条件的值不会影响数据的访问路劲,只起到过滤的作用。NOT IN或MIN函数等容易产生filter操作。
AiDBA宝典
2019/09/30
1.3K0
【DB笔试面试258】在Oracle中,执行计划里的access和filter有什么区别(上)?
【DB笔试面试517】在Oracle中,什么是临时表?它有哪些分类?有关临时表需要注意什么?
目前所有使用Oracle作为数据库支撑平台的应用,大部分是数据量比较庞大的系统,即表的数据量级一般情况下都是在百万级以上。当然,在Oracle中创建分区是一种不错的选择,但是当发现应用有多张表关联的时候,并且这些表大部分都比较庞大,而关联的时候发现其中的某一张或者某几张表关联之后得到的结果集非常小,并且查询得到这个结果集的速度非常快,那么这个时候考虑在Oracle中创建“临时表”。
AiDBA宝典
2019/09/29
1.2K0
推荐阅读
【DB笔试面试582】在Oracle中,什么是绑定变量窥探(上)?
1.5K0
【DB笔试面试586】在Oracle中,什么是自适应游标共享(2)?
5400
【DB笔试面试586】在Oracle中,什么是自适应游标共享(1)?
7040
【DB笔试面试586】在Oracle中,什么是自适应游标共享(3)?
3590
【DB笔试面试586】在Oracle中,什么是自适应游标共享(4)?
5720
【DB笔试面试642】在Oracle中,什么是基数反馈(Cardinality Feedback)?
7820
【DB笔试面试583】在Oracle中,什么是绑定变量分级?
7230
【DB笔试面试585】在Oracle中,什么是常规游标共享?
8940
【DB笔试面试598】在Oracle中,如何得到真实的执行计划?
7090
Oracle面对“数据倾斜列使用绑定变量”场景的解决方案
1.8K0
【DB笔试面试570】在Oracle中,SQL优化在写法上有哪些常用的方法?
3.6K0
什么是Oracle的高版本游标(High Version Count)?如何排查?
3720
Oracle 绑定变量窥探
1.7K0
【DB笔试面试578】在Oracle中,什么是会话游标?会话游标和共享游标的区别有哪些?会话游标分为哪几类?
1.5K0
【DB笔试面试584】在Oracle中,如何得到已执行的目标SQL中的绑定变量的值?
3.1K0
什么是Oracle的高版本游标(High Version Count)?如何排查?(持续更新)
8240
【DB笔试面试258】在Oracle中,执行计划里的access和filter有什么区别(下)?
1.2K0
【DB笔试面试646】在Oracle中,什么是基数(Cardinality)和可选择率(Selectivity)?
8630
【DB笔试面试258】在Oracle中,执行计划里的access和filter有什么区别(上)?
1.3K0
【DB笔试面试517】在Oracle中,什么是临时表?它有哪些分类?有关临时表需要注意什么?
1.2K0
相关推荐
【DB笔试面试582】在Oracle中,什么是绑定变量窥探(上)?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验