与数字数据类型进行日期比较时性能下降

Posted

技术标签:

【中文标题】与数字数据类型进行日期比较时性能下降【英文标题】:Slow performance with date comparison with number datatype 【发布时间】:2020-10-27 21:08:16 【问题描述】:
Select * from table
WHERE to_date(a.date_key, 'YYYY-MM-DD') BETWEEN to_date('&date3', 'YYYY-MM-DD') AND to_date('&date4', 'YYYY-MM-DD');

这里 a.date_key 是一个数字,我正在更改格式。但是应用上述过程会降低性能。

这是正确的做法还是我们可以用不同的方式让它变得更好。

任何帮助将不胜感激。

【问题讨论】:

是按 date_key 分区的表。如果是这样,那么在分区键上应用 to_date 将阻止分区修剪发生。 date_key 是什么数字格式?是 ddmmyyyy 吗?如果它在 yyyymmdd 中,那么我认为您可以尝试使用所需范围的关系运算符。 【参考方案1】:

这不是最好的方法。假设 date_key 是 YYYY-MM-DD 形式的字符串,则将比较作为字符串进行:

WHERE a.date_key BETWEEN '&date3' AND '&date4'

比较将是准确的,Oracle 可以使用date_key 上的索引、分区和统计信息。

这引出了一个问题,为什么你有一个密钥而不是使用 date 数据类型。但这是另一个问题。

【讨论】:

OP 说它是数字,而不是字符串。这可能是真的,因为它可以使用'yyyy-mm-dd'格式掩码真正转换为日期:select to_date(20200130,'yyyy-mm-dd') from dual @xt.and.r 。 . .在这种情况下,传入看起来像字符串的数字,比如 20200707。 我会避免隐式转换 :) @xt.and.r 。 . .我也会。传入的参数应该与date_key的类型匹配。【参考方案2】:

由于您的数字列是YYYY-MM-DD格式,您可以直接使用如下:

SELECT * FROM your_table
 WHERE
    A.DATE_KEY BETWEEN '&date3' AND '&date4'

【讨论】:

【参考方案3】:

这里 a.date_key 是一个数字

如果真的是数字,你可以简单地使用

where a.date_key between 19810101 and 19891231

【讨论】:

以上是关于与数字数据类型进行日期比较时性能下降的主要内容,如果未能解决你的问题,请参考以下文章

高性能mysql 第4章 Schema与数据类型优化

高性能MySQL—Schema与数据类型优化

MYSQL性能调优07_MySQL数据类型选择数值类型日期和时间字符串

MySQL数据类型之数字相关

Hibernate比较数字

mysql - varchar类型与数字的比较和转换