与数字数据类型进行日期比较时性能下降
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
【讨论】:
以上是关于与数字数据类型进行日期比较时性能下降的主要内容,如果未能解决你的问题,请参考以下文章