【发布时间】: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