我有以下三个表(实际上有更多的字段,但这应该让我知道我想要实现的目标):
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)
,但似乎效果不佳。
答案 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);
希望这会有所帮助。