操作系统: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中几何建筑物与几何道路偏移之间的几何交叉。