【发布时间】:2019-09-16 20:17:41
【问题描述】:
我使用的是 Oracle 12C,我有以下代码:
SELECT *
FROM
(
SELECT
*
FROM
t.tablea
WHERE
name = 'FIS'
) A
LEFT JOIN (
SELECT
*
FROM
t.tableb
WHERE
enabled = 1
) B ON b.id = a.id
AND TO_CHAR(b.createdate, 'dd-mm-yy hh24:mi') = TO_CHAR(a.createdate, 'dd-mm-yy hh24:mi')
a 和 b createdate 都是时间戳数据类型。
优化器在执行计划中的 TO_CHAR(b.createdate, 'dd-mm-yy hh24:mi') = TO_CHAR(a.createdate, 'dd-mm-yy hh24:mi') 处返回一个 internal_function
如果我像这样比较:'AND b.createdate = a.createdate',它将丢失 1000 行看起来像这样的 '11-JUN-18 04.48.34.269928000 PM'。如果我将 269928000 更改为 269000000 它将起作用
现在,我不想使用 to_char 来避免 internal_function(必须创建基于函数的索引)
谁能帮帮我?
【问题讨论】:
-
为什么你会在你的执行计划中看到函数
to_char()?您在查询中明确使用它。 -
@a_horse_with_no_name 我并不感到惊讶,我只是想避免它以避免创建基于函数的索引
-
基于函数的索引有什么问题?
-
@a_horse_with_no_name 我的老板从不同意基于函数的索引,先生