我在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都有索引。
我如何找出问题所在?
答案 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秒的时间内出现