在Sqlite中提高查询速度

时间:2016-08-24 20:42:51

标签: python sqlite

我是使用python和sqlite的新手。我正在尝试创建一个从表(rawdata)读取数据的脚本,然后执行一些计算,然后将其存储在新表中。我计算一名球员在该日期之前在特定赛道位置赢得的数字竞赛并计算百分比。共有15个轨道位置。整体而言,脚本非常慢。任何提高速度的建议。我已经使用过PRAGMA参数。

以下是剧本。

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 个答案:

答案 0 :(得分:1)

发送和检索SQL查询是非常昂贵的&#34;就时间而言。加快速度的最简单方法是使用SQL函数来减少查询次数。

例如,前两个查询可以使用COUNT(),UNION和Aliases减少为单个调用。

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

在这种情况下,我们采用两个原始查询(用您的条件代替&#34; ...&#34;)将它们与UNION语句合并,为该联合提供别名&#34; totalmatch&# 34;,并计算其中的所有行。

第二组查询可以完成同样的事情。而不是通过2次查询循环16次(导致32次调用SQL引擎),您可以使用GROUP BY将其替换为一个查询。

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

在这种情况下,我们采用与以前完全相同的查询,并按PolPosition对其进行分组,使用COUNT显示每组中的行数。

W3Schools是这些功能如何运作的绝佳资源: http://www.w3schools.com/sql/default.asp