自定义函数 与 视图 在使用上有什么区别?


测试环境: PostgreSQL
测试用例:


 CREATE TABLE a (
    aid serial PRIMARY KEY,
    name varchar(20)
);    
CREATE TABLE b (
    bid serial PRIMARY KEY,
    name varchar(20)
);      
CREATE TABLE ab (
    abid serial PRIMARY KEY,
    aid serial REFERENCES a(aid),
    bid serial REFERENCES b(bid)
);     

CREATE VIEW v_ab
  AS
SELECT a.name AS "aname",
       b.name AS "bname",
       ab.abid AS "abid"
  FROM a, b, ab
 WHERE a.aid = ab.aid
   AND b.bid = ab.bid;

CREATE FUNCTION f_ab(int) 
    RETURNS TABLE(aname varchar, bname varchar) AS $$ 
        SELECT a.name AS "aname",
               b.name AS "bname"
          FROM a, b, ab
         WHERE a.aid = ab.aid
           AND b.bid = ab.bid
           AND ab.abid = $1 
$$ LANGUAGE SQL;

INSERT INTO a VALUES (1, 'a');
INSERT INTO b VALUES (2, 'b');
INSERT INTO ab VALUES (12, 1, 2);

这两篇文章把我搞糊涂了: 慎用自定义函数 通过自定义函数提高服务器性能
抱着"存在即合理"的想法,我想知道到底什么时候该使用自定义函数?
另外,当数据量较大时,下面这两条语句执行效率上有区别吗?


 SELECT aname, bname FROM v_ab WHERE abid = 12;
SELECT aname, bname FROM f_ab(12);

sql PostgreSQL 数据库 数据库性能优化

翠香poi 11 years, 10 months ago

你的文章是SQL server的,PostgreSQL我倒没用过。

在SQL server中视图仅仅是SQL的映射,它一般事不含有程序运算,仅用于查询。 自定义函数是程序块,它支持参数,并且返回类型多样化。

数据库一般提供数据存储的作用,业务逻辑运算却由其它应用程序处理,例如JAVA。如果业务逻辑比较复杂而且高度依赖数据库里的各种数据,这样JAVA与数据库之间可能需要通讯多次,才可以把流程完成。这样无疑会产生交互的时间,所以如果把复杂的运算直接让数据库中计算出来,那效率就会相当高,所以就有了自定义函数。

怒吼吧蛋蛋 answered 11 years, 10 months ago

Your Answer