postgres-动态SQL查询执行性能

时间:2019-03-18 13:23:59

标签: sql database postgresql postgis database-performance

我在postgres上有一个数据库,其中包含国家/地区特定的表格,即xx_data,其中xx是国家/地区。现在我正在通过sql函数读取这些表,并正在对postgres进行空间计算。

我已经为每个国家/地区创建了函数,即xx_function(param1,param2)和其他重载(每个国家/地区为4个版本)的版本。我有13个表和13 * 4函数。效果很好。

现在,我想根据新要求更改功能,并且必须更新所有52个功能。然后,我想到了将国家/地区作为sql函数的参数并动态创建sql查询。它将减少功能计数到4。我确实创建了一个以country作为参数的功能并运行了查询。新旧功能的执行时间有些相似(我都两次查询了多次),但是新功能的查询计划成本比旧功能高出很多倍。

我做了一些阅读,发现开销与执行时间没有直接关系(意味着更高的查询开销并不总是意味着更长的执行时间)。

我的问题是动态查询执行肯定会降低性能,还是我应该尝试进行负载测试并决定结果。新功能如何与查询计划混淆。任何其他解决此问题的建议将不胜感激。

新功能如下所示。 (旧功能没有国家/地区参数,而是使用国家/地区名称对查询进行硬编码,并且每个国家/地区都有自己的功能。)

CREATE OR REPLACE FUNCTION dummy.new_function(longitude double precision, latitude double precision, country varchar)
 RETURNS TABLE(output1 boolean, output2 smallint, output3 smallint)
 LANGUAGE plpgsql
AS $function$DECLARE
  point geometry;
  tabname varchar;
  BEGIN
      point := ST_SetSRID(ST_Point(longitude, latitude), 4326);
      tabname := CONCAT('dummy.',country,'data');

 RETURN QUERY 
 execute 'select i.output1, i.output2,  i.output3 from (
  SELECT a.output1, a.output2,  ST_Value(rast, $1)::smallint as output3  FROM ' || tabname || ' a WHERE
  ST_Intersects(rast, $1)) i
  where i.output3 > 0' using point;

  END $function$

0 个答案:

没有答案
相关问题