PostgreSQL:在循环中优化表访问

时间:2016-10-31 10:40:59

标签: postgresql loops plpgsql

操作系统:OSX El Capitan 10.11.6(15G1004)
在x86_64-apple-darwin14.5.0上的PostgreSQL 9.5.4,由Apple LLVM版本7.0.0(clang-700.1.76)编译,64位

我正在运行PostgreSQL数据库的本地实例。我有一个主表t,我想与几个表t_i一起加入,并将结果附加到一个输出表t_out中。我创建了一个PL/PGSQL函数(参见下面的示例),其中循环遍历表,获取表t_i的名称,并为每个表运行连接的SQL语句。因为t是一个非常大的表并且连接操作很长,所以我有兴趣尝试优化该功能。

我想知道,在循环内,主表是只读取一次并用于所有迭代,还是每次都读取。如果第二种情况属实,是否有办法优化函数,以便主表只读一次?

为了清楚起见,我正在添加一个示例:

 ---- CREATE SAMPLE TABLES
-- Main table
CREATE TABLE test_main (gid integer, descr text, PRIMARY KEY (gid));
INSERT INTO test_main VALUES (1,'a');
INSERT INTO test_main VALUES (2,'c');
INSERT INTO test_main VALUES (3,'b');
-- Two joining tables
CREATE TABLE test_1 (gid integer, var2 text, PRIMARY KEY (gid));
INSERT INTO test_1 VALUES (1,'xx');
INSERT INTO test_1 VALUES (2,'zx');
INSERT INTO test_1 VALUES (3,'yx');
CREATE TABLE test_2 (gid integer, var2 text, PRIMARY KEY (gid));
INSERT INTO test_2 VALUES (1,'zz');
INSERT INTO test_2 VALUES (2,'yy');
INSERT INTO test_2 VALUES (3,'yz');
-- List of joining tables 
CREATE TABLE iteration (iter text, PRIMARY KEY (iter));
INSERT INTO iteration VALUES ('test_1');
INSERT INTO iteration VALUES ('test_2');

---- Join function
CREATE FUNCTION test_pg() 
  RETURNS TABLE (gid integer, descr text, var2 text) 
  AS $$
    DECLARE 
      i text;
    BEGIN
      FOR i IN SELECT iter FROM iteration 
      LOOP
        RETURN QUERY
          EXECUTE format('SELECT t1.gid, descr, var2 
                         FROM test_main t1 
                         JOIN %s t2 
                         ON t1.gid = t2.gid', i);
        END LOOP;
    RETURN;
    END;
    $$ 
  LANGUAGE plpgsql 
  STABLE;

SELECT * FROM test_pg();

为了完成这些信息,真实案例是PostGIS中几何建筑物与几何道路偏移之间的几何交叉。

0 个答案:

没有答案
相关问题