高效的方式为数百万个数据运行选择查询

时间:2011-04-08 12:32:48

标签: python postgresql psycopg2

我想运行各种选择查询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)""")

我认为使用预先准备好的语句功能会真正加快查询速度,但似乎不会发生这种情况,我认为你可以给我一些暗示其他方法。

3 个答案:

答案 0 :(得分:1)

这种基准测试不太可能产生任何有用的数据,但第二种方法应该是最快的,因为一旦准备好语句,它就会被数据库服务器存储在内存中。进一步调用重复查询不需要传输查询文本,因此节省了一小部分时间。

这可能没有实际意义,因为查询非常小(可能与重复发送查询文本的数据包数量相同),查询缓存将为每个请求提供相同的数据。

答案 1 :(得分:0)

一次检索大量数据的目的是什么?我不知道你的情况,但我肯定会使用限制和偏移来分页结果。看一眼: 7.6. LIMIT and OFFSET

答案 2 :(得分:0)

如果您只想对所有内容进行基准测试,而不是将Python混合到等式中,请尝试pgbench。

http://developer.postgresql.org/pgdocs/postgres/pgbench.html

你的目标是什么?