假设我有一个像这样的 oracle 数据库模式:
锦标赛(id,名称)玩家(id,名称)游戏信息(id,pid(参考 player.id),tid(参考锦标赛.id),日期)
所以一行gameinfo 表表示某个玩家在给定日期在锦标赛中玩了某个游戏。锦标赛有大约 20 条记录,大约 160 000 名玩家和大约 200 万的游戏信息。我必须编写一个查询,列出锦标赛(tid 在 1-4 范围内)以及在该锦标赛中首次参加比赛的玩家数量。
我想出了以下查询:
select tid, count(pid)
from gameinfo g
where g.date = (select min(date) from gameinfo g1 where g1.player = g.player)
and g.tid in (1,2,3,4)
group by tid;
这显然不是最理想的(它运行了大约 58 分钟)。我有另一个想法,我可以看到:
select pid, tid, min(date)
from gameinfo
where tid in(1,2,3,4)
group by pid, tid;
并在这个视图上运行我的查询,因为它只有大约 600 000 条记录,但这似乎仍然不是最佳的。
您能否就如何优化这一点提供任何建议?