使用ORDER BY子句加速Oracle多表查询

时间:2012-10-29 17:29:54

标签: sql oracle10g query-optimization

我有以下三个表(实际上有更多的字段,但这应该让我知道我想要实现的目标):

log (
  eventId INTEGER,
  objectId INTEGER,
  PRIMARY KEY (eventId)
)

objects (
  objectId INTEGER,
  typeId INTEGER,
  PRIMARY KEY (objectId, typeId)
)

statusBits (
  typeId INTEGER,
  bitNumber INTEGER,
)

log表包含大量记录(500,000+),而其他表格非常小​​。我可以使用以下查询加入表:

SELECT l.eventId, o.typeId, s.bitNumber
FROM log l, objects o, statusBits s
WHERE (l.objectId = o.objectId) AND (o.typeId = s.typeId)

此查询运行良好且快速。当我在末尾添加ORDER BY eventId子句时,它也会运行得很快。但是,当我添加ORDER BY eventId, bitNumber(因此按两个字段而不是一个字段排序)时,它变得非常缓慢。

如何优化查询以使其运行更快?我正在运行Oracle 10g XE,如果这有任何区别的话。

更新 我已经尝试CREATE INDEX ON statusBits(bitNumber),但似乎效果不佳。

1 个答案:

答案 0 :(得分:0)

首先,我将重构您的查询,如下所示:

SELECT L.eventId
    ,O.typeId
    ,S.bitNumber
FROM log L
INNER JOIN objects O ON O.objectId = L.objectId
INNER JOIN statusBits S ON S.typeId = O.typeId

它可能对您的执行时间没有帮助,但查询更具可读性,使用INNER JOIN是最佳做法。

然后,为了优化您的执行时间,首先要记住的解决方案是创建索引,但您已经测试过了。尝试连接索引而不是简单索引可能会有所帮助:

CREATE INDEX ON statusBits (typeId, bitNumber);

希望这会有所帮助。