关于sql:获取记录需要很长时间

fetching records takes a long time

我在Oracle中有一个表,其中有100,869,984条记录。当我在Oracle SQL Developer中运行此查询时,需要一分钟,这对于获取一条记录来说是很长的时间

1
2
3
4
5
6
7
8
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上都有一个索引。

如何找出问题所在?


我将nls_date_format更改为我想要的

1
  ALTER SESSION SET nls_date_format = 'DD-MM-YYYY HH24:MI:SS'

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


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

我会将where重写为:

1
2
3
4
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)上使用复合索引。

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


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

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