2016-08-19 12 views
-2

私は〜300万チェスのゲームのデータセットを持っています(既存の列にはプレイヤの名前、日付、結果、トーナメント名が含まれています)。ランダムフォレストを使ってチェスゲームの結果を予測したい。大規模なデータセット(〜3Mのエントリ)にPostgreSQLを使用したフィーチャエンジニアリング

この目的のために、私はいくつかのフィーチャエンジニアリングを行いたいと思います。強力な予測変数と思われるいくつかの変数があります。これまでのトーナメントでの試合結果、ゲームの90日前の試合数

列:

- date DATE 
- namew TEXT 
- nameb TEXT 
- whiterank INTEGER 
- blackrank INTEGER 
- tournament TEXT 
- t_round INTEGER 
- result REAL 
- id BIGINT 
- chess_data2_pkey(id) 

指標:

game_index INDEX chess_data2 (namew ASC, tournament ASC, date ASC) 

は、残念ながら、私のクエリはかなり遅かった(私は、でも1は、8日に完成したではない14を書き、小さいデータセットでそれらをテストしました) 。以下は簡略化したものですが、2時間前に入れてもまだ結果はありません。

SELECT Sum(result) 
INTO temp 
FROM chess_data2 t1 
WHERE id IN (SELECT t2.id 
       FROM chess_data2 t2 
       WHERE t1.tournament = t2.tournament 
       AND t1.namew = t2.namew 
       AND t1.date < t2.date) 

私の質問:

  1. は、私は私のi7-4710HQとRAMの12ギガバイトの10日未満で完全な14と同様のクエリ、のように速く(SQLに速くこの作業を行うことができますか? )。おそらく事前に明示的にソートすることによって?
  2. 私の目標をより速く達成できる方法は他にありますか?私はPythonでこのループを使用してコードを素朴にしようとしましたが、パフォーマンスはさらに悪化しましたが、Cがこのようなものには優れていると聞きました。

私は推定にはPython 3.5を使用し、SQLにはpsycopg2を使用します。

編集:ありがとうございました。インデックスの使用を成功させ、クエリの一部を非常に高速にしました。この1つ:

これ以上受け入れられるのは約60秒です。私は間違った方法でインデックスを使用しているI推測

# Number of games that the white player has so far played in the tournament 
(SELECT count(*) from chess_data t2 where (t1.namew = t2.namew) and 
t1.tournament = t2.tournament and t1.date > t2.date and t1.date < t2.date + 90) 
+ (SELECT coalesce(count(*),0) from chess_data2 t2 
where (t1.namew = t2.nameb) and t1.tournament = t2.tournament 
and t1.date > t2.date and t1.date < t2.date + 90) AS games_t_w from chess_data2 t1 

を私:しかし、何らかの理由で、カウントはこの1つのように選択した時間半以上かかる計算するために(私は長く待つことはありませんでした)何が間違っているのか分かりませんが、これは基本的に以前と同じですが、結果の列を合計するのではなく、行の合計を計算します...それはまったく意味がありますか?

+1

をしたいです。 [** READ **](http://stackoverflow.com/questions/12915209/how-to-understand-an-explain-analyze) –

+0

データベースのスキーマと定義済みのインデックスを確認できますか? – halfer

+0

@halfer私は列とindeces(pycharmからコピー)についての情報を追加しました、それはあなたが期待していたものですか? – JohnnyQ

答えて

1

クエリの実行速度を上げたい場合は、結合のために使用する列の索引(外部キーと列を使用してclausuleを使用)を作成できます。 しかし、インデックスを追加すると、挿入と更新が遅くなり、スペースディスクに必要な量が増えます。

+0

ねえ、実際に助けてくれました!少なくともある程度は...私はsum()クエリを動作させることができましたが、何らかの理由でcount()クエリもうまくいきませんでした...どのように進めるか(詳細は私の編集を参照してください) ? – JohnnyQ

1

なぜそのINを使用するのか分かりません。私はあなたのクエリを簡素化しようとし、より多くのロジックを失ってしまいました。

私は

SELECT sum(result) INTO temp 
FROM chess_data2 t1 

と同等です信じてあなたは、おそらくあなたは、クエリ性能もを改善しようとしたときANALYZE`をEXPLAIN `チェックする必要があります

SELECT tournament, namew, sum(result) 
FROM chess_data2 t1 
GROUP BY tournament, namew 

または

SELECT tournament, namew, sum(result) 
FROM chess_data2 t1 
WHERE tournament = @tournament 
    AND namew = @namew 
+0

私は長いクエリを避けるために簡略化したバージョンを置いていますが、WHERE句にはt1.date JohnnyQ

+0

'EXPLAIN ANALYZE'をチェックしましたか? dbスキーマのサンプルデータと期待される結果を提供する必要があります。それ以外の場合は、単に推測ゲームです。 [** How-to-Ask **](http://stackoverflow.com/help/how-to-ask) \t \t [** START **](http ://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/)質問品質を向上させ、より良い回答を得る方法を学ぼう。 –

+0

また、テーブルにインデックスを作成しましたか? –

関連する問題