python - 为数百万数据运行选择查询的有效方法

标签 python postgresql psycopg2

我想运行各种选择查询 1 亿次,我有大约。表中有 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)""")

我认为使用准备好的语句功能确实可以加快查询速度,但由于这似乎不会发生,所以我认为您可以给我一些其他方法的提示。

最佳答案

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

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

关于python - 为数百万数据运行选择查询的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5595071/

相关文章:

Python (1..n) 语法?

java - 如何使用 Spring 在 Postgresql 中存储 java.util.ArrayList

arrays - PostgreSQL:将动态 ARRAY 插入函数

python - 将查询结果赋值给变量

performance - 将 Python 的 Postgres psycopg2 查询性能提高到与 Java 的 JDBC 驱动程序相同的水平

python - 去掉边缘的黑线

Python 2.3调用父类(super class)方法

python - 如何在 HTTP 请求中发送带有 urllib2 的自定义 header ?

sql - 如何解释 Postgresql rank() 关系

php - 从 php 调用 python/psycopg2 - 获取连接到数据库的权限被拒绝错误