【问题标题】:fetching records takes a long time获取记录需要很长时间
【发布时间】:2018-07-31 04:23:34
【问题描述】:

我在 Oracle 中有一个表,其中包含超过 100,869,984 条记录。当我在Oracle SQL Developer 中运行此查询时,需要一分钟,这对于获取一条记录来说是相当长的时间

select 
    * 
from
    E_MW_01MIN_MIT
Where  
    replace(substr(TO_CHAR (DBTM, 'HH24:MI:SS'), 1, 5), '00:00', '24:00') = '11:01'
    and TO_CHAR (DBTM, 'DD-MM-YYYY') = '07-05-1396'  
    and AVNR = 2075;

有时在第一次运行后,它会更快地获取数据,它会减少到 5 秒。 我有一个关于 DBTM 和 AVNR 的索引。

如何找出问题所在?

【问题讨论】:

  • 您正在尝试在 WHERE 子句中使用函数,这会使查询变慢。尝试为此 where 子句设置单独的持久计算列。
  • 您可以尝试更改 where 语句的顺序。先检查AVNR
  • 为什么不使用分页,意味着你在一个查询中获取一半记录,在第二个查询中获取一半,通过使用行号,即从行号 >0 和行号 1000 和行号
  • 第二次执行速度更快可能是由于缓存。在没有看到存在哪些索引的情况下不确定,但乍一看,我会读到与@VenkataramanR 相同的内容——where 子句中的函数触发完全扫描而不是索引访问。你可以考虑基于函数的索引docs.oracle.com/database/121/ADFNS/adfns_indexes.htm#ADFNS00505
  • @PranayRana - 由于 OP 的问题是检索一条记录所需的时间长度,我真的不确定您为什么认为分页可能会有所帮助。

标签: sql oracle performance query-optimization


【解决方案1】:

只返回一条记录是无关紧要的。这取决于需要扫描多少行或索引条目才能找到它。

假设在 DBTM 上有一个索引,搜索一个日期时间范围应该会快得多。例如,如果您正在查看在 '07-05-1396 11:01' 发生的任何事情,那么您将寻找 >= '07-05-1396 11:01' 和

【讨论】:

    【解决方案2】:

    时间上的差异可能是缓存造成的。

    我会将where 重写为:

    Where replace(substr(TO_CHAR(DBTM, 'HH24:MI:SS'), 1, 5), '00:00', '24:00') = '11:01' and
          dbtm >= date '1396-05-07' and
          dbtm < date '1396-05-08' and 
          avnr = 2075
    

    那么我建议在(avnr, dbtm) 上建立一个复合索引。

    我不确定第一个条件试图做什么,但该索引将根据其余条件进行过滤,这应该会加快查询速度。

    【讨论】:

      【解决方案3】:

      我将 nls_date_format 更改为我想要的格式

        alter session set nls_date_format = 'DD-MM-YYYY HH24:MI:SS'
      

      之后我省略了 Select Command 中不必要的功能。然后答案出现在不到 0.1 秒内

      【讨论】:

        猜你喜欢
        • 2013-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-21
        • 2023-03-11
        • 1970-01-01
        • 2020-05-02
        • 1970-01-01
        相关资源
        最近更新 更多