一次ORACLE SQL谓词跨界导致的执行计划不准

一次ORACLE SQL谓词跨界导致的执行计划不准

首先说明谓词跨界一般出现在日期类型中,打个比方你的统计数据是8月20号的,但是今天是8月28日,在这20号到28号之间日期是没有进入统计数据的,
这样可能导致,根据统计信息计算出来的COST异常的小,这样可能导致本来该走其他字段索引的语句走到时间索引上去,导致执行计划最终错误。
在10053中可以看到如下提示:

as selectvity of out-of-range/non-existent value pred

以前多次遇到过,今天再次遇到,就记录于此,如下SQL
select *
from test
where seller_user_id = '123'
and raw_add_time >= trunc(sysdate-1, 'mi')
and raw_add_time < trunc(sysdate, 'mi')

其执行计算如下:
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 2023568823
--------------------------------------------------------------------------------
| Id  | Operation                    | Name                   | Rows  | Bytes |
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |                        |     1 |   574 |
|*  1 |  FILTER                      |                        |       |       |
|*  2 |   TABLE ACCESS BY INDEX ROWID| TEST                   |     1 |   574 |
|*  3 |    INDEX RANGE SCAN          | TEST_ADD_TIME_INDEX    |     2 |       |
--------------------------------------------------------------------------------
这里test_ADD_TIME_INDEX就是我的时间上的索引,通过查看选择率后发现seller_user_id远远
小于raw_add_time范围的选择率,应该走到seller_user_id上的索引才对,这里可能发生了
谓词跨界查看其统计数据发现是7月20号的,今天是8月28日。然后进行了一下验证

调整时间后
select *
from test
where seller_user_id = '123'
and raw_add_time >= trunc(sysdate-100, 'mi')
and raw_add_time < trunc(sysdate-99, 'mi')

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 576270446
--------------------------------------------------------------------------------
| Id  | Operation                    | Name                 | Rows  | Bytes | Cos
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |                      |     1 |   574 |
|*  1 |  FILTER                      |                      |       |       |
|*  2 |   TABLE ACCESS BY INDEX ROWID| TEST_BASE_INFO       |     1 |   574 |
|*  3 |    INDEX RANGE SCAN          | TEST_ID_INDEX |    23 |       |
--------------------------------------------------------------------------------

这里更改了时间范围在已知的统计数据范围内,执行计划正确。

我们进行10053 TRACE验证:

SINGLE TABLE ACCESS PATH 
  Single Table Cardinality Estimation for TEST[TEST] 
  Column (#14): 
    NewDensity:0.000001, OldDensity:0.000623 BktCnt:254, PopBktCnt:79, PopValCnt:7, NDV:814912
  Column (#14): SELLER_USER_ID(
    AvgLen: 21 NDV: 814912 Nulls: 855565 Density: 0.000001
    Histogram: HtBal  #Bkts: 254  UncompBkts: 254  EndPtVals: 183

  Column (#41): RAW_ADD_TIME(
    AvgLen: 8 NDV: 13533184 Nulls: 0 Density: 0.000000 Min: 2454768 Max: 2457225
  Using prorated density: 0.000000 of col #41 as selectvity of out-of-range/non-existent value pred //谓词跨界
  Table: TEST  Alias: TEST
    Card: Original: 27510606.000000  Rounded: 1  Computed: 0.00  Non Adjusted: 0.00
  Access Path: TableScan
    Cost:  618899.27  Resp: 618899.27  Degree: 0
      Cost_io: 616819.00  Cost_cpu: 43729541941
      Resp_io: 616819.00  Resp_cpu: 43729541941
  Using prorated density: 0.000000 of col #41 as selectvity of out-of-range/non-existent value pred //谓词跨界
  Access Path: index (RangeScan)
    Index: TEST_ADD_TIME_INDEX 
    resc_io: 5.00  resc_cpu: 39819
    ix_sel: 0.000000  ix_sel_with_filters: 0.000000 
    Cost: 5.00  Resp: 5.00  Degree: 1
 
 谓词跨界后选择率成为了0.000000,这样导致了执行计划错误。
 解决也很简单,按需求重新收集统计信息即可
 

时间: 2024-09-15 18:23:30

一次ORACLE SQL谓词跨界导致的执行计划不准的相关文章

可穿戴设备:跨界导致长产业链或引风险

摘要: 可浏览网页的眼镜,能收发信息的手表,携GPS定位系统的鞋子曾经只能出现在科幻电影中的场景,随着可穿戴设备的袭来已变得触手可及.这个被互联网女皇玛丽米克尔不惜赞美之词的 可浏览网页的眼镜,能收发信息的手表,携GPS定位系统的鞋子--曾经只能出现在科幻电影中的场景,随着可穿戴设备的袭来已变得触手可及.这个被"互联网女皇"玛丽·米克尔不惜赞美之词的互联网发展"第三个周期"的"明星",最吸引人的其实不只是设备,不管是投资人还是创业者,他们聚焦的点

RDS SQL Server - 专题分享 - 巧用执行计划缓存之索引缺失

title: RDS SQL Server - 专题分享 - 巧用执行计划缓存之索引缺失 author: 风移 摘要 执行计划缓存是MSSQL Server内存管理十分重要的部分,同样如何巧用执行计划缓存来解决我们平时遇到的一系列问题也是一个值得深入研究的专题.这篇文章是如何巧用执行计划缓存的开篇,分享如何使用执行计划缓存来分析索引缺失(Missing Indexes). 问题引入 缺失索引是SQL Server CPU使用率居高不下的第一大杀手,也是SQL Server数据库非常大的潜在风险点

【DBAplus】深入Oracle优化器:一条诡异执行计划的解决之道

深入Oracle优化器:一条诡异执行计划的解决之道 DBAplus社群 | 2016-05-05 19:51 CBO计算成本并选择最佳执行计划的至关重要输入物就是表和索引的统计信息,过旧或错误的统计信息则可能导致一个性能极差的执行计划被错误地选中.本文将以一个案例展示诡异的统计信息如何影响执行计划的生成. 1案例介绍 这是一个简单的sql,近两个月来对于告警明细表(分区)做月度汇总查询时,总是出现了异常缓慢的情况. 测试SQL: 字段NEALARM_TIME是固定条件,字段RELATED_EMS

RDS SQL Server - 专题分享 - 巧用执行计划缓存之Single-used plans

背景引入 执行计划缓存是SQL Server内存管理中非常重要的特性,这篇系列文章我们探讨执行计划缓存设计中遇到的single-used plans问题,以及如何发现.如何定性和定量分析single-used plans带来的影响,最后我们使用两种方法来解决这个问题. 什么是Single-used Plans 要解释清楚什么是Single-used Plans,首先需要解释SQL语句执行计划缓存是什么?SQL Server执行每一条SQL语句之前,会从执行计划缓存内存中查看是否存在本条语句的执行

SQL点滴27—性能分析之执行计划

原文:SQL点滴27-性能分析之执行计划 一直想找一些关于SQL语句性能调试的权威参考,但是有参考未必就能够做好调试的工作.我深信实践中得到的经验是最珍贵的,书本知识只是一个引导.本篇来源于<Inside Microsoft SQL Server 2008>,有经验的高手尽管拍砖把.   这个部分将讲解一些性能分析工具,这些性能分许主要关注在执行计划.   缓存执行计划  SQL Server 2008提供了一些服务器对象来分析执行计划Sys.dm_exec_cached_plans:   

批量删除数据后, 未释放empty索引页导致mergejoin执行计划变慢 case - 分析与规避方法

标签 PostgreSQL , merge join , min , max , 优化器 , 索引倾斜 , 垃圾回收 背景 PostgreSQL支持三种JOIN的方法,nestloop, merge, hash. 这三种JOIN方法的差别和原理可以参考 https://www.postgresql.org/docs/devel/static/planner-optimizer.html <PostgreSQL nestloop/hash/merge join讲解> nested loop jo

Oracle 11g r2全外连接优化执行计划(三)NATIVE_FULL_OUTER_JOIN提示

虽然上一篇介绍了NATIVE_FULL_OUTER_JOIN和NO_NATIVE_FULL_OUTER_JOIN两个HINT,但是实际上NATIVE_FULL_OUTER_JOIN并没有发挥任何的作用,因为Oracle对全外连接的优化使得新的执行计划的代价比原始执行计划要低,所以Oracle默认就选择这个执行计划,因此看不到NATIVE_FULL_OUTER_JOIN提示的效果. SQL> SET AUTOT ON SQL> SELECT T1.ID, T2.ID 2  FROM T1 FUL

Oracle 11g r2全外连接优化执行计划(二) 新增的两个相关的HINT

Oracle在推出了新的执行计划的同时,还提供了两个控制这个执行计划的提示NATIVE_FULL_OUTER_JOIN和NO_NATIVE_FULL_OUTER_JOIN. 这两个HINT的使用十分简单,不需要其他的任何参数.下面继续上一篇文章的例子: SQL> SELECT /*+ NO_NATIVE_FULL_OUTER_JOIN */ T1.ID, T2.ID 2  FROM T1 FULL OUTER JOIN T2 3  ON T1.ID = T2.ID; ID        ID -

Oracle 11g r2全外连接优化执行计划(一)

在11.2中,Oracle对于全外连接的执行计划进行了优化. 在以前的版本中,全外连接的执行计划如下: SQL> SELECT * FROM V$VERSION; BANNER ---------------------------------------------------------------- Oracle Database10gEnterpriseEdition Release10.2.0.3.0 - 64bi PL/SQL Release 10.2.0.3.0 - Product