性能调优Oracle查询

时间:2013-05-16 17:50:31

标签: oracle

我有下面的查询,通过分析会花费更多的时间预期,我想调整一些。查询的目的是从给定device_id的Messages表中获取最后3个小时的数据,并按上次消息接收(time desc)对结果进行排序。目前数据库上有一个综合索引似乎并不理想。任何索引或查询语法都会更改建议以加快此查询的速度吗?

消息表结构:

列:

id (auto incremented PK NUMBER(10))
device_id
model_id 
state
creation_date (DATE when row was inserted)
time (unix time message was transmitted)
//a bunch of other columns omitted

索引:

id
device_id, model_id, state (composite index)

查询:

select * from messages where device_id='0-12345678' and creation_date > sysdate-3/24 order by time desc

1 个答案:

答案 0 :(得分:3)

您尚未发布解释计划,但看起来您要执行全表扫描或索引范围向下扫描DEVICE_ID,然后通过rowid单独访问每一行,因为您的整个选择不是在索引中,DEVICE_ID不是唯一的。

索引创建没有硬性规则,但通常你应该按照基数(列中有多少个不同的值)的顺序索引WHERE子句中的值。当您选择一系列日期时,我建议您在DEVICE_IDCREATION_DATE上创建一个索引。

您还在使用select *。如果您不需要选择每列,don't do this。从磁盘读取的字节数更多,必须通过网络发送更多字节等。如果您只选择DEVICE_IDCREATION_DATETIME我会建议索引按此顺序更改为这三列,因此您根本不会触及该表,只需从索引中进行选择和排序。

如果业务逻辑声明此列列表应该是唯一的,那么创建一个唯一索引而不是普通索引。最后,如果你不绝对需要ORDER BY然后删除它。然后删除需要额外时间的排序。