我有一张桌子可以在一天内保存多辆车的GPS位置。所以它有多个ID,一些关于位置的信息,一些其他信息和日期(时间戳日期+时间)。
DESCRIBE TABLE_NAME;
DESCRIBE TABLE_NAME;
Name Null Type
----------- -------- --------------
ID_1 NOT NULL NUMBER(38)
ID_2 NOT NULL VARCHAR2(12)
ID_3 NOT NULL VARCHAR2(12)
ID_4 NOT NULL VARCHAR2(12)
INFO_1 NOT NULL NUMBER(38)
LAT NOT NULL FLOAT(126)
LNG NOT NULL FLOAT(126)
DATE NOT NULL TIMESTAMP(6)
INFO_2 NOT NULL NUMBER(38)
INFO_3 NOT NULL NUMBER(38)
INFO_4 NOT NULL NUMBER(38)
INFO_5 NOT NULL NUMBER(38)
INFO_6 NOT NULL NUMBER(38)
INFO_7 NOT NULL NUMBER(38)
TEXTMSG VARCHAR2(4000)
所以,我必须运行相同的查询,指出不同的TIME:
SELECT
to_char(ID_1) as ID_1,
ID_2,
ID_4,
to_char(INFO_1) as INFO_1,
substr(LAT, 1, 32767) as LAT,
substr(LNG, 1, 32767) as LNG,
to_char(DATE,'dd/MM/yy HH24:MI:SS') as DATE,
to_char(INFO_2) as INFO_2,
to_char(INFO_3) as INFO_3,
to_char(INFO_4) as INFO_4,
to_char(INFO_5) as INFO_5,
to_char(INFO_6) as INFO_6,
to_char(INFO_7) as INFO_7,
TEXTMSG
FROM TABLE_NAME
WHERE to_char(DATE, 'hh24:mi:ss') = '09:10:25';
此查询总是需要大约25秒。 桌上有大约1百万条记录。
时间是否正常(25秒)? 怎么能改善这个时间?
我尝试做了如下的索引,但没有改变:
CREATE INDEX INDEX_TABLE_NAME ON TABLE_NAME (DATE);
注意:我使用的是Oracle Database 11g企业版11.2.0.1.0 64位(在Windows上,仅用于测试目的)
答案 0 :(得分:4)
您希望加快查询速度,然后使用表达式索引:
create index idx_tablename_exp on table_name(to_char(DATE, 'hh24:mi:ss'))
然后,Oracle将能够将此索引用于您的where
子句。