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万条记录,但这似乎仍然不是最优的.
你能就如何优化这个提出任何建议吗?
我的第一个建议是首先尝试分析函数.该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表中,因为它似乎是使用数据库的重要信息.