满足三大条件,但不触发Exadata智能扫描的场景

个人简介:石云华,Exadata中国用户组联合创始人,2019年被ORACLE官方授予ACE称号。毕业后一直从事Oracle数据库第三方运维服务工作,拥有十余年电信运营商、保险、税务、电力行业核心系统数据库运维经验。现就职于北京海天起点技术服务股份有限公司,oracle数据库专家组成员,Exadata部门负责人。个人著作有《Exadata实施运维指南》,另外一本《Oracle Exadata性能优化》即将面世。

我们知道Exadata智能扫描特性有三大先决条件(全扫描、直路径读取、Exadata存储设备),注意,这三大条件不是充分条件,在某些情况下,即使满足了以上的三大条件,也有可能存在不触发智能扫描特性。满足条件但不触发智能扫描的情景,具体如下所示。

  • 数据库参数CELL_OFFLOAD_PROCESSING设置为FALSE
  • 正在扫描的表或分区太小。
  • 优化器没有使用直接路径读取。
  • cluster表上执行扫描。
  • 在索引组织的表上执行扫描。
  • 对压缩的索引执行快速全扫描。
  • 对反转索引执行快速全扫描。
  • 该表已启用行依赖关系或正在提取rowscn
  • 优化器扫描希望以ROWID顺序返回行。
  • CREATE INDEX命令使用了nosort选项。
  • 正在选择或查询LOBLONG列。
  • 对表执行版本查询的flashback操作。
  • 表对象未进行压缩,或者是BASIC模式压缩,或者是OLTP模式压缩,查询该表时访问的列个数超过了255个列。(注意:Exadata混合列压缩压缩表上的这些查询将被卸载。)
  • 表空间被加密,并且CELL_OFFLOAD_DECRYPTION参数被设置为FALSE。为了使Exadata存储单元执行解密,Oracle数据库需要将解密密钥发送到Exadata存储单元。如果将密钥通过网络发送到Exadata存储单元时存在安全问题,那么会禁用存储节点解密功能。
  • 表空间并未完全存储在Oracle Exadata存储服务器上。
  • 谓词评估是在一个虚拟的列上。

上述的不触发智能扫描的十几种情景来自于Exadata官方文档,除了Exadata官方文档中提及的情况之外,MOS文档《Exadata Smart Scan FAQ》(Doc ID 1927934.1)中另外提及了其他几种不会触发智能扫描特性的情况,具体如下。

  • 被访问的表设置了cache属性。
  • 隐含参数_serial_direct_read设置成never
  • 串行的DML语句。
  • 不能对SQL语句进行隔离。
  • 串行查询的SQL语句不能来自于共享模式的会话。
  • 串行直接路径读取无效,当出现以下几种情景:① table函数中的SQL语句。② dbms_sql包中的SQL语句。③ PL/SQL触发器中的SQL语句。
  • 存储节点的CPU使用率非常高。

下面,我们通过示例来验证表对象设置了cache属性对智能扫描特性的影响,见代码清单1.14

代码清单1.14 验证表对象设置了cache属性对智能扫描特性的影响(1)

这段代码的测试意图是当测试表test.test未设置cache属性时,计算data_object_id字段的平均值花费了4.81秒;然后对测试表设置cache属性,再次计算data_object_id字段的平均值时,仍然花费了4.33秒。

代码清单1.14 验证表对象设置了cache属性对智能扫描特性的影响(2)

我们获取两个SQL语句的SQL_ID,查询发现两条SQL语句都执行了智能扫描,所以花费的时间相当。

这个测试示例与官方的说法有些出入,在进一步说明之前,我们先来熟悉一下表对象cache属性的工作原理:当使用全表扫描时,则该表中的数据块会放置在LRU列表的最近最少使用尾部(LRU),因此很快就被淘汰出局。如果表设置了cache属性,即使对该表使用全表访问时,则该表对象的块仍然被放置在LRU列表最近最多使用的尾部(MRU)


注意:设置了cache属性的对象,并不是立刻就将该对象所涉及的数据块keep到内存里,而只是尽可能的延长该对象驻留内存的时间,它将数据块存放在BufferCache中的default子池中,如果将一张表保留到存放在BufferCache中的keep子池中,则该表的数据块基本上会永久驻留在内存里。除非数据库重启,或新keep到内存的数据将以前的数据块挤出。


在设置cache属性时,并不会将立即将数据块缓存到内存中,所以它并不能立即阻止智能扫描,设置cache属性,仅仅是数据块更趋于缓存到内存中,在内存中缓存的时间更久,只有当内存中缓存的数据块达到一定的数量,才有可能会阻止智能扫描,具体见后面章节中关于”串行直路径算法”。同样,如果将对象驻留到keep子池也是一样的道理,只有当内存中缓存的数据块达到一定的数量,才会阻止智能扫描。所以说”被访问的表设置了cache属性就会导致无法智能扫描”这种说法并不是十分严谨。

未经允许不得转载:Oracle一体机用户组 » 满足三大条件,但不触发Exadata智能扫描的场景

相关推荐