Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 即使查询不同,Postgres是否也会缓存计划?_Sql_Postgresql_Query Optimization - Fatal编程技术网

Sql 即使查询不同,Postgres是否也会缓存计划?

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

我正在尝试优化我的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 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。区别在于将输入缓存到查询中,而不是结果集。我将您的问题解释为询问结果集,而不是输入数据的热缓存。