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