Oracle SQL中的查询优化

Teg*_*egi -1 sql oracle query-optimization

假设我有一个像这样的oracle数据库模式:
tournaments(id,name)player(id,name)gameinfo(id,pid(引用players.id),tid(引用tournaments.id),日期)
所以在gameinfo表意味着某个玩家在给定日期的比赛中玩某个游戏.锦标赛有大约20个记录,玩家大约有16万,游戏信息大约有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;

并在此视图上运行我的查询,因为它只有大约60万条记录,但这似乎仍然不是最优的.

你能就如何优化这个提出任何建议吗?

Gor*_*off 5

我的第一个建议是首先尝试分析函数.该row_number()功能将枚举每个用户的锦标赛.第一个有seqnum1:

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
Run Code Online (Sandbox Code Playgroud)

我的第二个建议是将第一场比赛的日期放入players表中,因为它似乎是使用数据库的重要信息.