通过嵌套单个查询内联vs临时表

时间:2015-12-18 23:30:14

标签: postgresql left-join temp-tables postgresql-performance

我查询了以下基本表格。

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版本的查询效率更高,我将不胜感激。

谢谢!

0 个答案:

没有答案