在Python的sqlite中并行化选择查询似乎不会提高性能

wljmcqd8  于 2023-03-03  发布在  SQLite
关注(0)|答案(1)|浏览(248)

bounty将在3小时后过期。回答此问题可获得+50声望奖励。Mathew希望引起更多人关注此问题。

在阅读this post之后,我一直在尝试比较sqlite中的并行化和非并行化。我正在使用Python的sqlite3库创建一个数据库,其中包含一个名为randNums的表,该表包含两列,一个id和一个瓦尔。val是0到1之间的一个随机数。然后我选择val大于一半的所有行。为了比较并行版本和非并行版本的运行时间,我已经做了两次,但是它们花费的时间是一样的。我想知道我是否错误地使用了关键字'PARALLEL',或者我是否需要首先使用python命令启用并行化。
最后,我还想知道不同的数据库,例如mysql和postgresql,并行化有何不同。

import sqlite3
from time import time

con = sqlite3.connect('mydatabase.db')
cursorObj = con.cursor()

cmd  = ['PRAGMA table_info(randNums);']
cmd += ['SELECT count (*) from randNums where val>.5;']
cmd += ['SELECT count /*+ PARALLEL(4) */ (*) from randNums where val>.5;']

for c in cmd:
    t = time()
    cursorObj.execute(c)
    print('command: %s' % c)
    print(cursorObj.fetchall())
    print('run time in seconds: %.3f\n\n' % (time()-t))

运行包含上述代码的Python脚本会产生以下输出:

command: PRAGMA table_info(randNums);
[(0, 'id', 'INTEGER', 0, None, 1), (1, 'val', 'REAL', 0, None, 0)]
run time in seconds: 0.000

command: SELECT count (*) from randNums where val>.5;
[(49996009,)]
run time in seconds: 3.604

command: SELECT count /*+ PARALLEL(4) */ (*) from randNums where val>.5;
[(49996009,)]
run time in seconds: 3.598

我首先使用以下代码生成数据库:

import sqlite3
from random import uniform as rand

con = sqlite3.connect('mydatabase.db')
cursorObj = con.cursor()
cursorObj.execute("CREATE TABLE IF NOT EXISTS randNums(id integer PRIMARY KEY, val real)")
try:
    for i in range(10**8):
        if i%10**5==0: print(i)
        cursorObj.execute("INSERT INTO randNums VALUES(%d, '%f')" % (i,rand(0,1)))
except:
    print('datbase is already filled with data')
    pass
con.commit()
5tmbdcev

5tmbdcev1#

SQLite不支持开箱即用的并行化,您在代码中使用的PARALLEL关键字对查询的执行没有影响。并行和非并行查询花费相同时间的原因可能是SQLite不是为并行执行而设计的,并且仅限于在单个线程上运行查询。
要使用SQLite实现并行化,您可以探索使用外部库或工具的可能性,例如用于并行查询的SQLite Virtual Table extension,或者利用Python中的多线程来并行运行多个查询。

相关问题