-1

次のような oracle データベース スキーマがあるとし ます

gameinfo テーブルは、特定のプレイヤーが特定の日にトーナメントで特定のゲームをプレイしたことを意味します。Tournaments には約 20 のレコード、約 160,000 人のプレイヤー、約 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;

約 600,000 レコードしかないので、このビューでクエリを実行しますが、これはまだ最適とは言えません。

これを最適化する方法について何かアドバイスをいただけますか?

4

1 に答える 1

5

私の最初の推奨事項は、最初に分析関数を試すことです。この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

players2 つ目の提案は、データベースを使用する上で重要な情報と思われるため、最初のトーナメントの日付をテーブルに入れることです。

于 2013-04-27T23:41:38.160 に答える