Sql 即使查询不同,Postgres是否也会缓存计划?
我正在尝试优化我的PostgreSQL查询。我尝试过的优化之一是删除函数,正如我读到的那样,Sql 即使查询不同,Postgres是否也会缓存计划?,sql,postgresql,query-optimization,Sql,Postgresql,Query Optimization,我正在尝试优化我的PostgreSQL查询。我尝试过的优化之一是删除函数,正如我读到的那样,coalesce等函数会降低查询性能 我运行了查询 EXPLAIN ANALYZE SELECT DISTINCT t1.user_id FROM table1 t1 LEFT JOIN table2 t2 ON t2.org_id = t1.org_id AND t2.user_id = t1.user_id AND t2.service = t1.service LEFT JO
coalesce
等函数会降低查询性能
我运行了查询
EXPLAIN ANALYZE
SELECT DISTINCT t1.user_id
FROM table1 t1
LEFT JOIN table2 t2
ON t2.org_id = t1.org_id AND t2.user_id = t1.user_id AND t2.service = t1.service
LEFT JOIN table3 t3
ON t3.org_id = t1.org_id AND t3.user_id = t1.user_id AND t3.service = t1.service
WHERE t1.org_id = :orgId
AND t1.service = 's1'
AND COALESCE(t2.rgid, '') = :rgid
AND t1.status IN ('active', 'error');
然后替换coalesce
函数并运行
EXPLAIN ANALYZE
SELECT DISTINCT t1.user_id
FROM table1 t1
LEFT JOIN table2 t2
ON t2.org_id = t1.org_id AND t2.user_id = t1.user_id AND t2.service = t1.service
LEFT JOIN table3 t3
ON t3.org_id = t1.org_id AND t3.user_id = t1.user_id AND t3.service = t1.service
WHERE t1.org_id = '1234567'
AND t1.service = 's1'
AND (t2.rgid = :rgid OR ( t2.rgid IS NULL AND :rgid =''))
AND t1.status IN ('active', 'error');
我看到了一个很好的性能改进,因为改变,并认为优化工作。但几天后,我再次运行了第二个命令,它比上次花费了更多的时间。我想知道,速度是否因为缓存而提高
但是,由于这两个查询不同,它如何将一个查询的缓存结果用于另一个查询
编辑:在
coalesce
中的列上没有索引,也不打算创建索引。您能说出解释(分析、成本、详细、缓冲区)的结果吗?“速度增加是因为缓存吗”-您运行了多少次查询?我不知道PostgreSQL和您的硬件,但我看到,由于磁盘缓存(这通常表明服务器上的RAM不足),对相同数据的类似后续查询速度更快。我不认为任何数据库使用来自不同查询的缓存结果。更有可能的是,您刚刚将数据加载到内存中。@GordonLinoff,这有什么不同?这和缓存不一样吗?@Denise。区别在于将输入缓存到查询中,而不是结果集。我把你的问题解释为询问结果集而不是输入数据的热缓存。你能描述一下解释的结果(分析、成本、详细、缓冲区)?Re“缓存导致速度提高了吗”-你运行了多少次查询?我不知道PostgreSQL和您的硬件,但我看到,由于磁盘缓存(这通常表明服务器上的RAM不足),对相同数据的类似后续查询速度更快。我不认为任何数据库使用来自不同查询的缓存结果。更有可能的是,您刚刚将数据加载到内存中。@GordonLinoff,这有什么不同?这和缓存不一样吗?@Denise。区别在于将输入缓存到查询中,而不是结果集。我将您的问题解释为询问结果集,而不是输入数据的热缓存。