簡體   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