以涉及两个SELECT
的psycopg2调用为例:
import psycopg2
with psycopg2.connect("dbname=test user=postgres") as conn:
with conn.cursor() as cur:
cur.execute("SELECT a, b, c FROM table WHERE a > 5 and d < 10;")
r1 = cur.fetchall()
cur.execute("SELECT a, b, c FROM table WHERE a > 5 and d > 20;")
r2 = cur.fetchall()
这有点低效;可能的O(N)检查WHERE a > 5
执行了两次,但似乎只能执行一次,子查询是在中间结果上执行的。你知道吗
通过psycopg2api的标准方法是什么?你知道吗
比如:
with psycopg2.connect("dbname=test user=postgres") as conn:
with conn.cursor() as cur:
cur.execute("SELECT a, b, c FROM table WHERE a > 5")
# ...
cur.execute("SELECT a, b, c FROM temp_table WHERE d < 10;")
r1 = cur.fetchall()
cur.execute("SELECT a, b, c FROM temp_table WHERE d > 20;")
r2 = cur.fetchall()
最好的解决方案是使用文字"CREATE TEMP TABLE..."
?你知道吗
我是从Django ORM的角度来讨论这个问题的,查询集的后续计算将重用缓存的结果。psycopg2api是否提供了类似的功能?你知道吗
您可以执行单个查询并将结果拆分为两个列表:
在结果集不是很大的情况下,上述解决方案应该是最有效的。或者,可以创建临时表:
连接关闭时,临时表将自动删除。你知道吗
如果结果集太大,无法在客户端实际处理,请使用server-side cursor.在循环中获取单个行时,这些行实际上是在存储桶中从服务器获取的。可以通过设置^{}. 来定义存储桶的大小。你知道吗
相关问题 更多 >
编程相关推荐