[英]Query optimization in Oracle SQL
假设我有一个像这样的oracle数据库架构:
比赛(id,name)玩家(id,name)gameinfo(id,pid(引用players.id),tid(引用tourns.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()
函数将枚举每个用户的锦标赛。 第一个seqnum
为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
表中,因为这似乎是使用数据库的重要信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.