繁体   English   中英

Oracle SQL中的查询优化

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM