我是靠谱客的博主 阳光世界,最近开发中收集的这篇文章主要介绍ORACLE交换分区时,最好不使用without validation,容易造成查询紊乱某日测试发现以下两个sql,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
某日测试发现以下两个sql
select * from tableName where risk_date = 20181201; --有数据 select * from tableName where risk_date = '20181201'; --无数据
这两个SQL一般来说,效率上会有一定差别,但是结果不应有差别
后来发现,20181201这天的数据不在P20181201这个分区,而存放在P20181131这个分区,而正常情况下这天的数据应该是存放不进去的,因为根据分区策略P20181131这个分区存放的是大于等于2018年11月31日,小于2018年12月1日的数据。
而2018年12月1日的数据的确错误的存放在P20181131分区中,出现这种情况的唯一可能性是交换分区,且带上了without validation选项。
那么为什么第一个SQL有数据,而第二个SQL没有数据呢???
在第一个SQL中,20181201没有单引号,即数字类型,所以一定走的是全表扫描,且在全表扫描的过程中将20181201转换成与risk_date一样的类型,即字符型,扫描到P20181131的时候发现数据。
而第二个SQL,由于是字符型,与risk_date类型一致,所以走的是分区扫描,扫描的分区是P20181201,而这个分区的确是没有数据的,所以整个sql没有记录返回。
所以在使用交换分区的时候,最好不要加上without validation 选项,否则可能查询紊乱。
最后
以上就是阳光世界为你收集整理的ORACLE交换分区时,最好不使用without validation,容易造成查询紊乱某日测试发现以下两个sql的全部内容,希望文章能够帮你解决ORACLE交换分区时,最好不使用without validation,容易造成查询紊乱某日测试发现以下两个sql所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复