PostgreSQL原始查询vs“函数返回TABLE” – 性能上的疯狂差异.为什么?

前端之家收集整理的这篇文章主要介绍了PostgreSQL原始查询vs“函数返回TABLE” – 性能上的疯狂差异.为什么?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我使用Postgresql,它用于报告.目前配置的方式如下:

有一个复杂的查询返回报告数据,如下所示:

  1. select Column1 as Name1,Column2 as Name2
  2. from soMetable tbl
  3. inner join ...
  4. where ...
  5. and ...
  6. and $1 <= somedate
  7. and $2 >= somedate
  8. group by ...
  9. order by ...;

有一个使用此查询函数,并按此定义

  1. CREATE OR REPLACE FUNCTION GetMyReport(IN fromdate timestamp without time zone,IN todate timestamp without time zone)
  2. RETURNS TABLE(Name1 character varying,Name2 character varying) AS
  3. $BODY$
  4.  
  5. --query start
  6. select Column1 as Name1,Column2 as Name2
  7. from soMetable tbl
  8. inner join ...
  9. where ...
  10. and ...
  11. and $1 <= somedate
  12. and $2 >= somedate
  13. group by ...
  14. order by ...;
  15. --query end
  16.  
  17. $BODY$
  18. LANGUAGE sql VOLATILE
  19. COST 10
  20. ROWS 1000;

最后,当报告应用程序调用函数时,它会发送以下sql

  1. select null::text as Name1,Name2 from GetMyReport ('2012-05-28T12:19:39.0000000+11:00'::timestamp,'2012-05-28T12:19:44.0000000+11:00'::timestamp);

我的问题是:

>当我对数据库运行“查询”时,它运行得非常快.事实上,如果返回的数据相当小,只需几秒钟
>当我运行从报告应用程序传递的sql时,每次运行都需要花费精力.事实上,查询返回的相同数据在几秒钟内超过10分钟.
>实际上,我可以运行原始查询,需要几毫秒,运行函数 – 需要大约10分钟,再次运行查询 – 毫秒,运行函数 – 再次10分钟,所有参数完全相同.

可能是什么原因?

好的,这很容易.事实证明数据库必须在知道参数之前准备查询计划,这会导致不良结果.解决方案是使用plpgsql并返回QUERY EXECUTE.现在性能与预期一致.
  1. CREATE OR REPLACE FUNCTION GetMyReport(IN fromdate timestamp without time zone,Name2 character varying) AS
  2. $BODY$
  3.  
  4. BEGIN
  5. RETURN QUERY EXECUTE'
  6. select Column1 as Name1,Column2 as Name2
  7. from soMetable tbl
  8. inner join ...
  9. where ...
  10. and ...
  11. and $1 <= somedate
  12. and $2 >= somedate
  13. group by ...
  14. order by ...;' USING $1,$2
  15. END
  16.  
  17. $BODY$
  18. LANGUAGE plpgsql VOLATILE
  19. COST 10
  20. ROWS 1000;

猜你在找的Postgre SQL相关文章