2

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

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),但它似乎没有很大的效果。

4

1 回答 1

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);

希望这会有所帮助。

于 2014-09-05T09:57:55.147 回答