如何在没有任何主键,唯一键或外键的情况下优化表的性能?

时间:2016-02-11 12:59:10

标签: sql oracle indexing oracle11g

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

1 个答案:

答案 0 :(得分:4)

您希望加快查询速度,然后使用表达式索引:

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

然后,Oracle将能够将此索引用于您的where子句。