2015-12-23 34 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函數只會對性能產生負面影響。