我查询了以下基本表格。
SELECT DISTINCT
a.field1,
b.field2,
c.agg_values
FROM a
INNER JOIN b ON a.something = b.something
LEFT JOIN (
SELECT
array_to_string(array_agg(label), ';;') AS agg_values,
some_table.some_field
FROM some_table
WHERE some_table.some_field = 'some-fixed-value'
GROUP BY some_field
) AS c ON a.some_field = c.some_field
WHERE a.some_other_field = 'some-other-fixed-value'
这个查询没什么特别的。漂亮的磨坊!
这个查询在我的Postgres 9.4.5(~4分钟)中运行得非常慢,我可能总共返回了15k条记录。 some_table
可能有大约1万条记录。
如果我将该LEFT JOIN
子查询的内容移动到临时表并从临时表中离开连接,我的性能会大幅提高。我的查询现在可能只需要15秒,而240秒。更明确一点,如果我删除SELECT array_to_string ... GROUP BY some_field
查询,并将该查询放入临时表中,那么快速连接到该临时表BAM上。
CREATE TEMP TABLE temp_table_c ( ... );
INSERT INTO temp_table_c SELECT ... same query nested in LEFT JOIN from before ...;
SELECT DISTINCT
a.field1,
b.field2,
c.agg_values
FROM a
INNER JOIN ON a.something = b.something
LEFT JOIN temp_table_c AS c ON a.some_field = c.some_field
WHERE a.some_other_field = 'some-other-fixed-value'
如果有人能够解释为什么TEMP TABLE
版本的查询效率更高,我将不胜感激。
谢谢!