2015-12-23 33 views
0

我最近读了DO blocksql和plpgsql函数之间的复杂性和运行时间

已知SQL函数比plpgsql函数运行得更快。所以如果一个操作可以在SQL中完成,我们宁愿用SQL来完成。

现在情况如何?

create or replace function asql() 
returns void as $$ 
    begin 
     raise notice ''hello, world!'; 
    end; 
$$ language plpgsql; 

AND:

CREATE OR REPLACE FUNCTION aplpgsql() 
    RETURNS void AS 
$BODY$ 

DO language plpgsql $$ 
BEGIN 
    RAISE NOTICE 'hello, world!'; 
END 
$$; 

$BODY$ 
    LANGUAGE sql 

如果我有比只是普通打印等更复杂的查询是什么? DO块允许任何情况下总是使用SQL函数,取所有的LOOPsIFs并将它们放在DO块中。

我错过了什么?

+1

在SQL函数内部封装一个PL/pgSQL块仍然会生成实际执行的代码PL/pgSQL。在第二种方法中,我看不出任何优势(另外,您无法将嵌入式PL/pgSQL块的任何结果返回给函数)。 –

回答

0

SQL函数不会比plpgsql函数更快。如果不内联这些函数会更慢。只有在内联成功时,SQL功能才能更快。什么是内联?例如:

CREATE OR REPLACE FUNCTION myleft(text, int) RETURNS text AS $$ 
    SELECT substring($1 FROM 1 FOR $2) 
$$ LANGUAGE sql; 

当您使用功能myleft,然后rewriter重写查询

SELECT myleft('AHOJ',2) 

SELECT substring('AHOJ FROM 1 FOR 2) 

而且spead是一样的本地C函数。但是在一些不太复杂的情况下,内联是可能的。

将PLpgSQL代码包装为SQL函数只会对性能产生负面影响。