我目前正在编写一个必须多次执行相同查询的应用程序。该查询有一个(可能很大)数组作为参数,如下所示:
SELECT
m.a, SUM(m.b) as b, SUM(m.c) as c, SUM(m.d) as d
FROM table_m m JOIN table_k k ON (k.x IN %s AND k.id = m.y)
WHERE m.b > 0
GROUP BY m.a
我在 Postgresql 9.1 上使用 Psycopg2。对于每个查询,我创建一个新游标并用数字列表作为参数执行()查询(该查询在我的测试转换中执行了大约 5000 次)。输入列表的长度在 1 到 5000 项之间变化。
平均而言,查询的运行时间略低于 50 毫秒,最慢的执行时间约为 500 毫秒。
我对此有两个问题:
- 我能做些什么来优化这个查询吗?
- 有什么方法可以准备一次查询并执行多次(或者 Psycopg2 是否在内部执行此操作)?
架构table_k
Column | Type | Modifiers
---------------+--------+-----------
id | bigint | not null
x | bigint |
Indexes:
"table_k_pkey" PRIMARY KEY, btree (id)
"table_k_id_x_idx" btree (id, x)
"table_k_x_idx" btree (x)
架构table_m
Column | Type | Modifiers
---------------------+-----------------------------+-----------
id | bigint | not null
y | bigint |
a | bigint |
b | integer |
c | integer |
d | double precision |
Indexes:
"table_m_pkey" PRIMARY KEY, btree (id)
"table_m_y_idx" hash (y)
"table_m_a_idx" btree (a)
"table_m_b_idx" btree (b)
希望这是足够的信息。