分区表查询带分区条件,没有分区消除

1、数据库中交易流水表越来越大,对流水表以create_time列做了分区,开发配合对sql改进,加了create_time做查询条件。但是观察sql执行情况,查询sql的where条件中虽然有create_time,但是却是全表扫描所有分区,性能甚至低于分区之前

 分区情况如下:

 

 sql文本和执行计划如下:

 

 对应的java代码如下,其中使用了timestamp类型:

 

2、注意到Predicate Information部分有INTERNAL_FUNCTION函数,这代表对应列是加密列或者对应列与绑定值之间做了隐式类型转换,使用了内部函数。此列非加密列,因此怀疑此列做了隐式类型转换

      我们对对应sql语句使用explain plan for解释其执行计划,如下:

    

     看到使用explain plan for看到的执行计划并没有INTERNAL_FUNCTION字样,并且Pstart和Pstop也说明走了分区消除

3、create_time列是date类型,造成隐式类型转换的原因可能是绑定值使用了其他类型,例如上面的timestamp类型,现在使用date类型再次测试如下:

 

可以看到,分区消除起作用了,java代码如下:

 

4、sql文本没有任何变化,只是代码中变量类型有所变化,影响sql执行计划

5、此问题但从数据库看不出问题所在,数据字典里显示sql使用绑定变量,并且从数据库各个方面均可分区消除,但是应用的实际sql没有分区消除,此时明白INTERNAL_FUNCTION代表的含义至关重要,了解程序代码也有所帮助

      因此sql的书写一定要注意前后台数据类型一致,此处是不能分区消除,也有可能造成索引未使用等问题,影响性能


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Oracle数据库中,分区表查询时是允许进行更新操作的。分区表是一种将数据分割成多个逻辑部分的表,每个部分都被称为分区。这种分割可以根据特定的条件进行,例如按照日期、地理位置、客户等。分区表的设计和使用可以提高查询性能并简化维护。 当我们需要更新分区表时,可以使用UPDATE语句来修改表中的数据。只需提供指定的分区或特定的查询条件即可对分区表中的数据进行更改。更新操作可以针对单个分区进行,也可以同时更新多个分区。 需要注意的是,分区表进行更新操作时,要确保更新的数据符合分区规则。换句话说,被更新的数据所在的分区必须与更新操作的条件相匹配。如果不满足分区规则,更新操作可能会失败或者更新的数据不会生效。 另外,对于包含全局索引的分区表进行更新操作时,需要特别注意。全局索引是在整个表上创建的索引,而不是在各个分区上分别创建的索引。在更新分区表时,如果更新操作会导致分区键的变化,那么全局索引也需要相应地更新。这就需要进行一些额外的操作,以确保全局索引的一致性和正确性。 总结来说,Oracle的分区表是允许进行更新操作的,但要注意更新的数据必须符合分区规则,并且在更新包含全局索引的分区表时需要额外的操作来维护索引的一致性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值