代码之家  ›  专栏  ›  技术社区  ›  nnmmss

获取记录需要很长时间

  •  0
  • nnmmss  · 技术社区  · 6 年前

    我在Oracle中有一个表,其中有超过100869984条记录。当我在中运行此查询时 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 回复  |  直到 6 年前
        1
  •  0
  •   TomC    6 年前

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

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

        2
  •  0
  •   Gordon Linoff    6 年前

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

    我会重写 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
  •  0
  •   nnmmss    6 年前

    我把nls_date_格式改成了我想要的格式

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

    之后,我省略了Select命令中不必要的函数。不到0.1秒答案就出现了