2016-08-24 15 views
0

私はpythonとsqliteを使用するのは非常に初心者です。私は、テーブル(rawdata)からデータを読み込んで、それから新しいテーブルに保存されるいくつかの計算を実行するスクリプトを作成しようとしています。その日の前に特定のトラックポジションで選手が獲得したレース数を数え、パーセンテージを計算しています。合計で15のトラックポジションがあります。全体的にスクリプトは非常に遅いです。スピードを上げるための提案。私はすでにPRAGMAパラメータを使用しています。Sqliteのクエリ速度を向上させる

以下はスクリプトです。

for item in result: 
     l1 = str(item[0]) 
     l2 = item[1] 
     l3 = int(item[2]) 

     winpost = [] 
     key = l1.split("|") 
     dt = l2 

     ###Denominator-------------- 
     cursor.execute(
      "SELECT rowid FROM rawdata WHERE Track = ? AND Date< ? AND Distance = ? AND Surface =? AND OfficialFinish=1", 
      (key[2], dt, str(key[4]), str(key[5]),)) 
     result_den1 = cursor.fetchall() 
     cursor.execute(
      "SELECT rowid FROM rawdata WHERE Track = ? AND RaceSN<= ? AND Date= ? AND Distance = ? AND Surface =? AND OfficialFinish=1", 
      (key[2], int(key[3]), dt, str(key[4]), str(key[5]),)) 
     result_den2 = cursor.fetchall() 
     totalmat = len(result_den1) + len(result_den2) 

     if totalmat > 0: 

      for i in range(1, 16): 
       cursor.execute(
        "SELECT rowid FROM rawdata WHERE Track = ? AND Date< ? AND PolPosition = ? AND Distance = ? AND Surface =? AND OfficialFinish=1", 
        (key[2], dt, i, str(key[4]), str(key[5]),)) 
       result_num1 = cursor.fetchall() 
       cursor.execute(
        "SELECT rowid FROM rawdata WHERE Track = ? AND RaceSN<= ? AND Date= ? AND PolPosition = ? AND Distance = ? AND Surface =? AND OfficialFinish=1", 
        (key[2], int(key[3]), dt, i, str(key[4]), str(key[5]),)) 
       result_num2 = cursor.fetchall() 
       winpost.append(len(result_num1) + len(result_num2)) 

      winpost = [float(x)/totalmat for x in winpost] 
      rank = rankmin(winpost) 
      franks = list(rank) 
      franks.insert(0, int(key[3])) 
      franks.insert(0, dt) 
      franks.insert(0, l1) 
      table1.append(franks) 
      franks = [] 

    cursor.executemany("INSERT INTO posttable VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", table1) 
+1

私は目標は、SQLマシンは仕事ではなく、Pythonのいずれかを実行できるようにするべきだと思う:

W3Schoolsのは、これらの機能がどのように動作するかのための素晴らしいリソースです。 SQLクエリの量を減らすようにしてください。 – karlosss

答えて

1

SQLクエリの送信と取得は時間の点で「高価」です。物事をスピードアップする最も簡単な方法は、SQL関数を使用してクエリの数を減らすことです。

たとえば、最初の2つのクエリをCOUNT()、UNION、およびAliasesを使用して1回の呼び出しに減らすことができました。私たちは、UNION文でそれらを組み合わせてその組合に別名 『totalmatch』を与えると、すべてのカウント(「...」の代わりにあなたの条件で)元の2つのクエリを取る。この場合

SELECT COUNT(*) 
FROM 
(SELECT rowid FROM rawdata where ... 
    UNION 
    SELECT rowid FROM rawdata where ... 
) totalmatch 

その中の行

第2セットのクエリでも同じことができます。 2回のクエリで16回循環する代わりに(SQLエンジンに対して32回の呼び出しを行う)、GROUP BYを使用して1回のクエリで置き換えることができます。この場合

SELECT PolPosition, COUNT(PolPosition) 
FROM 
(SELECT PolPosition FROM rawdata WHERE ... 
    UNION 
    SELECt PolPosition FROM rawdata WHERE ... 
) totalmatch 
GROUP BY PolPosition 

我々は、各グループにある行数を表示するにはCOUNTを使用して、PolPositionことによってそれを以前のようにまったく同じクエリを取り、グループ。 http://www.w3schools.com/sql/default.asp

+0

UNION ALLはUNIONよりも高速です。 –

+0

ありがとう@TripleD。あなたは本当に助けられた提案です。クエリの数を34個から1個に減らしました。しかし、もう1つの助けが必要です.dbが1M行になるとすれば、sqliteは良い解決策ではないと思います。他の解決策はありますか? –

+0

@Cl私はそれを知らなかった。ありがとう。 – TripleD

関連する問題