高效查询百万数据的方法
我想要执行各种选择查询100百万次,而我的表里大约有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
如果你只是想单独测试SQL的性能,不想把Python混进来,可以试试pgbench。
http://developer.postgresql.org/pgdocs/postgres/pgbench.html
另外,你的目标是什么呢?
0
一次性获取这么多数据有什么用呢?我不太清楚你的具体情况,但我建议你可以使用限制和偏移的方法来分页显示结果。可以看看这个链接:7.6. LIMIT 和 OFFSET
1
这种基准测试不太可能产生有用的数据,但第二种方法应该是最快的,因为一旦准备好语句,它就会被数据库服务器存储在内存中。之后再调用这个查询时,就不需要再传输查询的文本了,这样可以节省一点时间。
不过这可能并不重要,因为这个查询非常小(在网络上传输的数据包数量可能和重复发送查询文本是一样的),而且查询缓存会为每个请求提供相同的数据。