在 Oracle 中使用 datediff 函数时查询速度慢

风之爱123

作为我的标题,我有以下代码:

 SELECT
        *
    FROM
        de.Department
    WHERE
        de.flag = 1
        AND   de.DepartmentNum IN (10,4)
        AND   de.status IN (0,-1,100)
        AND   datediff('dd',de.datequit,'30-SEP-19') > 9

datediff 函数使我的查询运行很慢(11 条记录需要 16 秒),而且成本也很高(~43k)。

这是我的 datediff 函数代码

create or replace FUNCTION       DATEDIFF 
(
  P_TYPE_DATE IN VARCHAR2 
, P_START_DATE IN TIMESTAMP 
, P_END_DATE IN TIMESTAMP 
) RETURN NUMBER AS 
  v_Result NUMBER := -1;
BEGIN

  IF P_TYPE_DATE IS NOT NULL AND P_START_DATE IS NOT NULL AND P_END_DATE IS NOT NULL THEN
    CASE UPPER(P_TYPE_DATE) 
        WHEN 'DD' THEN RETURN ROUND(TRUNC(P_END_DATE,'DD') - TRUNC(P_START_DATE,'DD'),0);
        WHEN 'HH' THEN RETURN ROUND((TRUNC(P_END_DATE,'HH') - TRUNC(P_START_DATE,'HH')) * 24,0);
        WHEN 'MI' THEN RETURN ROUND((TRUNC(P_END_DATE,'MI') - TRUNC(P_START_DATE,'MI')) * 24 * 60,0);
        WHEN 'SS' THEN RETURN ROUND((TRUNC(P_END_DATE,'MI') - TRUNC(P_START_DATE,'MI')) * 24 * 60 * 60 + extract(second from (P_END_DATE - P_START_DATE)),0);
        ELSE RETURN NULL;
    END CASE;
  END IF;
  RETURN NULL;
  EXCEPTION
    WHEN OTHERS THEN
       raise_application_error(-20001,'An error was encountered - '||SQLCODE||' -ERROR- '||SQLERRM);
END DATEDIFF;

我使用 SELECT * 是因为我想在 Department 表中获得几乎一列,所以如果我选择一些我需要的列,它就不会再改变了。

我可以重写以提高性能和成本吗?

梅尼谢谢!

MT0

我在 SQL 中创建了一个名为 datediff 的函数作为 datediff 函数,先生

不要使用自定义函数,因为它们会阻止 Oracle 在列上使用索引;而只是将列与静态值进行比较:

SELECT *
FROM   Department
WHERE  flag = 1
AND    DepartmentNum IN (10,4)
AND    status IN (0,-1,100)
AND    datequit > DATE '2019-09-30' + INTERVAL '9' DAY

要么

AND    datequit > DATE '2019-09-30' + NUMTODSINTERVAL( 9, 'DAY' )

要么

AND    datequit > DATE '2019-09-30' + 9

这是我的 datediff 函数代码

...
WHEN 'DD' THEN RETURN ROUND(TRUNC(P_END_DATE,'DD') - TRUNC(P_START_DATE,'DD'),0);
...

如果您想对使用TRUNC忽略时间分量进行等效比较,则从使用大于比较更改为使用大于或等于,并将一个时间单位(在您的示例中为天)添加到预期差异。例如:

SELECT *
FROM   Department
WHERE  flag = 1
AND    DepartmentNum IN (10,4)
AND    status IN (0,-1,100)
AND    datequit >= DATE '2019-09-30' + INTERVAL '10' DAY

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Oracle中的DATEDIFF函数

来自分类Dev

为什么使用UItouch绘制PNG图像时响应速度慢?

来自分类Dev

我需要使用DATEDIFF进行几个查询

来自分类Dev

如何在querydsl中使用SQLExpression.datediff()返回的NumberExpression

来自分类Dev

在SELECT中使用DATEDIFF

来自分类Dev

SQL Server:使用MILLISECOND时,datediff函数导致溢出

来自分类Dev

在Oracle中使用FK时查询FOR UPDATE NOWAIT

来自分类Dev

在Oracle中使用变量循环查询

来自分类Dev

在Oracle中使用LISTAGG函数

来自分类Dev

按datediff对行进行分组,然后使用diff函数

来自分类Dev

在VB.NET中使用datediff时发生转换错误

来自分类Dev

cx_Oracle连接速度慢

来自分类Dev

在pyspark中的oracle查询中使用参数

来自分类Dev

在Select ORACLE SQL中使用函数

来自分类Dev

在Oracle 11的子查询中使用rownum

来自分类Dev

使用AVG(DATEDIFF)和CASE进行SQL查询

来自分类Dev

在Oracle Connection SQL查询中使用变量

来自分类Dev

在经典ASP中使用oracle date参数调用oracle函数

来自分类Dev

DATEDIFF结果的汇总函数

来自分类Dev

在Oracle中使用datediff

来自分类Dev

使用DATEDIFF进行MySQL查询

来自分类Dev

DateDiff函数错误

来自分类Dev

Tesseract:仅当并行运行多个进程时,CPU使用率高且速度慢

来自分类Dev

如何在MySQL中使用datediff函数过滤行?

来自分类Dev

在CodeFluent中使用列表时收集速度慢

来自分类Dev

MySQL查询速度慢,EXPLAIN显示正在使用临时;使用文件排序

来自分类Dev

SQL DATEDIFF 函数

来自分类Dev

oracle中的Dateadd和Datediff函数

来自分类Dev

Oracle-在函数中使用可选参数?