获取记录需要很长时间

Posted

技术标签:

【中文标题】获取记录需要很长时间【英文标题】: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 的问题是检索一条记录所需的时间长度,我真的不确定您为什么认为分页可能会有所帮助。 【参考方案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 秒内

【讨论】:

以上是关于获取记录需要很长时间的主要内容,如果未能解决你的问题,请参考以下文章

用于从表中获取记录的 SQL 查询需要很长时间,但是当我运行 exec sp_updatestats 时按预期工作

选择查询需要很长时间执行 - 查询优化

删除大量记录需要很长时间

Hibernate - 第一个 Sql 插入需要很长时间

将 JSON 数据插入 Core Data 存储需要很长时间

BigQuery - 删除重复记录有时需要很长时间