我有一张桌子,可以在一天内保存多辆车的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)
所以,我要运行表明这样的不同时间对同一查询:
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秒。 桌上有大约100万条记录。
花费时间(25秒)是否正常?
如何提高这个时间?
我试图做一个指数像下面,但什么都没有改变:
CREATE INDEX INDEX_TABLE_NAME ON TABLE_NAME (DATE);
注:我使用的是Oracle数据库11g企业版11.2.0.1.0版64位(在Windows上,只是为了测试目的)
根据太多的事情推理它花费的秒数可能不是最好的方法;这将是有用的,如果你可以发布两个查询的解释计划(有和没有索引) – Aleksej