我想运行各种选择查询1亿次,我有aprox。表中有100万行。因此,我正在寻找运行所有这些选择查询的最快方法。
到目前为止,我尝试了三种不同的方法,结果相似。
以下三种方法当然没有做任何有用的事情,但纯粹是为了比较性能。
第一种方法:
for i in range (100000000):
cur.execute("select id from testTable where name = 'aaa';")
第二种方法:
cur.execute("""PREPARE selectPlan AS
SELECT id FROM testTable WHERE name = 'aaa' ;""")
for i in range (10000000):
cur.execute("""EXECUTE selectPlan ;""")
第三种方法:
def _data(n):
cur = conn.cursor()
for i in range (n):
yield (i, 'test')
sql = """SELECT id FROM testTable WHERE name = 'aaa' ;"""
cur.executemany(sql, _data(10000000))
And the table is created like this:
cur.execute("""CREATE TABLE testTable ( id int, name varchar(1000) );""")
cur.execute("""CREATE INDEX indx_testTable ON testTable(name)""")
我认为使用预先准备好的语句功能会真正加快查询速度,但似乎不会发生这种情况,我认为你可以给我一些暗示其他方法。
答案 0 :(得分:1)
这种基准测试不太可能产生任何有用的数据,但第二种方法应该是最快的,因为一旦准备好语句,它就会被数据库服务器存储在内存中。进一步调用重复查询不需要传输查询文本,因此节省了一小部分时间。
这可能没有实际意义,因为查询非常小(可能与重复发送查询文本的数据包数量相同),查询缓存将为每个请求提供相同的数据。
答案 1 :(得分:0)
一次检索大量数据的目的是什么?我不知道你的情况,但我肯定会使用限制和偏移来分页结果。看一眼: 7.6. LIMIT and OFFSET
答案 2 :(得分:0)
如果您只想对所有内容进行基准测试,而不是将Python混合到等式中,请尝试pgbench。
http://developer.postgresql.org/pgdocs/postgres/pgbench.html
你的目标是什么?