-1

假设我有一个像这样的 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 条记录,但这似乎仍然不是最佳的。

您能否就如何优化这一点提供任何建议?

4

1 回答 1

5

我的第一个建议是先尝试分析函数。该row_number()函数将枚举每个用户的锦标赛。第一个的 aseqnum为 1:

select gi.*
from (select gi.*,
             row_number() over (partition by gi.player order by date) as seqnum
      from gameinfo gi
     ) gi
where tid in(1,2,3,4) and seqnum = 1

我的第二个建议是将第一次锦标赛的日期放入players表格中,因为这似乎是使用数据库的重要信息。

于 2013-04-27T23:41:38.160 回答