提取记录需要很长时间

时间:2018-07-31 04:23:35

标签: sql oracle performance query-optimization

我在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都有索引。

我如何找出问题所在?

3 个答案:

答案 0 :(得分:0)

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

假设DBTM上有一个索引,则搜索一定范围的日期时间应该更快。例如,如果您正在查看在'07 -05-1396 11:01'发生的任何事情,那么您会寻找> = '07 -05-1396 11:01'和<'07 -05-1396 11:02' 。只需将您的转换放在文字而不是数据库列上,以确保可以使用列上的索引。

答案 1 :(得分:0)

时间上的差异可能是由于缓存所致。

我将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)上使用复合索引。

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

答案 2 :(得分:0)

我将nls_date_format更改为我想要的

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

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