本文内容来自YashanDB官网,原文内容请见 https://www.yashandb.com/newsinfo/7817899.html?templateId=1718516
问题现象
收集统计信息时报错:
SQL> exec DBMS_STATS.GATHER_TABLE_STATS('USER', 'T', null, 1, FALSE, 'FOR ALL COLUMNS SIZE AUTO', 8, 'GLOBAL', TRUE);
YAS-00507 date/timestamp value overflow
问题的风险及影响
统计信息无法收集成功
问题影响的版本
所有的YashanDB版本
问题发生原因
表中的timestamp列实际存储的数据,超出了timestamp的范围。
timestamp的范围为 1-1-1 00:00:00.000000 ~ 9999-12-31 23:59:59.999999
解决方法及规避方式
1、在收集统计信息时指定列(method_opt指定为for colums (col_1) size auto),确认是哪一列导致的问题。
示例:exec DBMS_STATS.GATHER_TABLE_STATS('USER', 'T', null, 1, FALSE, 'for columns (b) size auto', 8, 'GLOBAL', TRUE);
2、使用jdbc查询此列,结果集用getString方法获取,查看实际存储的值。
示例:
PreparedStatement ps = conn.prepareStatement("select b from ggg order by b desc");
ResultSet rs = ps.executeQuery();
while(rs.next()){
System.out.println(rs.getString(1));
}
最后控制台输出中,年的部分大于9999的,就是异常数据。
示例(前两行为异常数据):
10001-01-12 01:01:01.0
10000-01-12 01:01:01.0
9999-01-12 01:01:01.0
9998-01-12 01:01:01.0
3、找到异常的数据行后,可以将此行数据删除;或者将对应列的数据更新为合法的值。操作完成后即可正常收集统计信息。