ORACLE交换分区时,最好不使用without validation,容易造成查询紊乱

某日测试发现以下两个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 选项,否则可能查询紊乱。

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java后台参数验证通常使用JSR-303或JSR-349规范中定义的Bean Validation API来实现。以下是使用Bean Validation API进行后台参数验证的步骤: 1. 在实体类中使用注解来定义字段的验证规则,例如 @NotNull、@Size、@Pattern等。这些注解定义了字段的验证规则并指定了错误信息。 2. 在controller层中使用@Valid注解来验证参数。当参数验证失败,会抛出ConstraintViolationException异常。 3. 在异常处理器中处理ConstraintViolationException异常,将验证失败的错误信息返回给前端。 下面是一个示例代码: 实体类: ``` public class User { @NotNull(message = "用户名不能为空") private String username; @Size(min = 6, max = 20, message = "密码长度必须在6-20个字符之间") private String password; @Pattern(regexp = "\\w+@\\w+(\\.\\w+)+", message = "邮箱格式不正确") private String email; // getter和setter方法省略 } ``` Controller层: ``` @RestController public class UserController { @PostMapping("/user") public String addUser(@RequestBody @Valid User user) { // 处理用户添加逻辑 return "success"; } // 省略其他代码 } ``` 异常处理器: ``` @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(ConstraintViolationException.class) @ResponseBody public Map<String, Object> handleValidationException(ConstraintViolationException e) { Map<String, Object> map = new HashMap<>(); e.getConstraintViolations().forEach(violation -> { String field = violation.getPropertyPath().toString(); String message = violation.getMessage(); map.put(field, message); }); return map; } } ``` 上述代码中,@Valid注解用于验证User对象的参数,当验证失败会抛出ConstraintViolationException异常。异常处理器中通过获取异常中的ConstraintViolation对象,将错误信息以Map的形式返回给前端。 总之,Java后台参数验证是一个非常重要的功能,它可以有效地保证后台数据的正确性和安全性。使用Bean Validation API可以快速、方便地实现参数验证,提高代码的可维护性和可读性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值