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