获取记录需要很长时间
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 时按预期工作