Python psycopg何时执行游标命令
我正在使用psycopg2对数据库进行简单查询。目前,它是一个只有几个条目的测试数据库,但我担心我执行的命令在迁移到一个实际的数据库(可能很大)时会变得过于内存紧张Python psycopg何时执行游标命令,python,postgresql,psycopg2,Python,Postgresql,Psycopg2,我正在使用psycopg2对数据库进行简单查询。目前,它是一个只有几个条目的测试数据库,但我担心我执行的命令在迁移到一个实际的数据库(可能很大)时会变得过于内存紧张 import psycopg2 connection = psycopg2.connect('<database_url>') cur = connection.cursor() cur.execute("SELECT * FROM test;") entries = cur.fetchmany(limit) 所以
import psycopg2
connection = psycopg2.connect('<database_url>')
cur = connection.cursor()
cur.execute("SELECT * FROM test;")
entries = cur.fetchmany(limit)
所以我的问题是。psycopg2是在执行行运行数据库查询,在这种情况下,大型数据库将消耗大量客户机内存,还是在fetchmany行之前不运行查询,在这种情况下,我可以控制python内存消耗
如果是前者,我可能需要将SQL查询更改为只返回x行。要详细说明@Arihant的注释,调用execute时将运行该语句。这将触发数据库上的内存消耗。您可能不需要担心,但大小适中的数据库可以有效地处理数百万行;尽管如果查询本身变得复杂,内存开销可能会成为一个问题,但仍有许多优化和内存管理策略在使用 一旦开始提取数据,客户机内存就会发挥作用。我使用两种策略之一来控制内存使用: 使用fetchmany而不是fetchall vs将光标用作iterable。限制/偏移查询可以获得相同的基本结果,但您需要执行许多这样的查询以在大型数据集中分页,这会在服务器上产生不必要的成本
with conn.cursor() as stmt:
stmt.execute('select * from big_table')
rows = stmt.fetchmany(10000)
while rows:
for row in rows:
#do something clever with the row
rows = stmt.fetchmany(10000)
用户可以使用服务器端游标。这在服务器上的开销稍高,但会使客户机上的内存完全平坦,除非您试图保存所有记录
with conn.cursor('my_cursor') as stmt:
stmt.execute('select * from big_table')
for row in stmt:
#do something clever with the row
不管采用何种方法,关键的是如何处理返回的记录。如果您试图将它们保存在内存中,则内存将耗尽。分块处理数据。psycopg2在执行行中运行数据库查询。在查询中,您可以添加限制,但它不会以限制块的形式提供所有要处理的数据。您必须决定速度和内存的权衡。