2016-02-11 25 views
1

我有一张桌子,可以在一天内保存多辆车的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上,只是为了测试目的)

+0

根据太多的事情推理它花费的秒数可能不是最好的方法;这将是有用的,如果你可以发布两个查询的解释计划(有和没有索引) – Aleksej

回答

4

你要要加快查询,然后使用表达式指数:

create index idx_tablename_exp on table_name(to_char(DATE, 'hh24:mi:ss')) 

之后,甲骨文将能够使用这个索引你的where条款。

+0

这真棒!少于1秒。谢谢@ gordon-linoff – Rodrick

相关问题