当前位置:早雪网网络学院编程文档数据库技术Postgresql → PostgreSQL7.0手册-程序员手册 -42. Postgres 规则系统

PostgreSQL7.0手册-程序员手册 -42. Postgres 规则系统

减小字体 增大字体 作者:不详  来源:supcode.com收集整理  发布时间:2005-7-23 12:21:48
   shoelace *NEW*, shoelace_data s,
           unit u
     WHERE bpchareq(s.sl_unit, u.un_name);
把这些转换回人类可能使用的 SQL 语句 
    SELECT s.sl_name, s.sl_avail,
           s.sl_color, s.sl_len,
           s.sl_unit, s.sl_len * u.un_fact AS sl_len_cm
      FROM shoelace_data s, unit u
     WHERE s.sl_unit = u.un_name;
这是应用的第一个规则.当做完这些后,可排列元素就增加了.所以规则系统继续检查范围表入口.下一个是第2个(shoelace *OLD*). shoelace (鞋带)关系有一个规则,但这个可排列元素没有被任何分析树里的变量引用,所以被忽略.因为所有剩下的可排列元素入口要么是在 pg_rewrite 表里面没有记录,要么是没有引用,因而到达重排列元素结尾.所以重写结束,因而上面的结果就是给优化器的最终结果.优化器忽略那些在分析树里多余的没有被变量引用的可排列元素,并且由规划器/优化器生成的(运行)规划将和 Al 在上面键入的 SELECT 查询一样,而不是视图选择. 
现在我们让 Al 面对这样一个问题:Blues 兄弟到了他的鞋店想买一双新鞋,而且 Blues 兄弟想买一样的鞋子.并且要立即就穿上,所以他们还需要鞋带. 

Al 需要知道鞋店里目前那种鞋有合适的鞋带(颜色和尺寸)以及完全一样的配置的库存是否大于或等于两双.我们告诉他如何做,然后他问他的数据库: 

    al_bundy=> SELECT * FROM shoe_ready WHERE total_avail >= 2;
    shoename  |sh_avail|sl_name   |sl_avail|total_avail
    ----------+--------+----------+--------+-----------
    sh1       |       2|sl1       |       5|          2
    sh3       |       4|sl7       |       7|          4
    (2 rows)
Al 是鞋的专家,知道只有 sh1 的类型会适用(sl7鞋带是棕色的,而与棕色的鞋带匹配的鞋子是 Blues 兄弟从来不穿的). 
这回分析器的输出是分析树 

    SELECT shoe_ready.shoename, shoe_ready.sh_avail,
           shoe_ready.sl_name, shoe_ready.sl_avail,
           shoe_ready.total_avail
      FROM shoe_ready shoe_ready
     WHERE int4ge(shoe_ready.total_avail, 2);
应用的第一个规则将是用于 shoe_ready 关系的,结果是生成分析树 
    SELECT rsh.shoename, rsh.sh_avail,
           rsl.sl_name, rsl.sl_avail,
           min(rsh.sh_avail, rsl.sl_avail) AS total_avail
      FROM shoe_ready shoe_ready, shoe_ready *OLD*,
           shoe_ready *NEW*, shoe rsh,
           shoelace rsl
     WHERE int4ge(min(rsh.sh_avail, rsl.sl_avail), 2)
       AND (bpchareq(rsl.sl_color, rsh.slcolor)
            AND float8ge(rsl.sl_len_cm, rsh.slminlen_cm)
            AND float8le(rsl.sl_len_cm, rsh.slmaxlen_cm)
           );
实际上,资格/条件里的 AND 子句将是拥有左右表达式的操作符节点.但那样会把可读性降低,而且还有更多规则要附加.所以我只是把它们放在一些圆括号里,将它们按出现顺序分成逻辑单元,然后我们继续对付用于 shoe (鞋)关系的规则,因为它是引用了的下一个可排列元素并且有一条规则.应用规则后的结果是 
    SELECT sh.shoename, sh.sh_avail,
           rsl.sl_name, rsl.sl_avail,
           min(sh.sh_avail, rsl.sl_avail) AS total_avail,
      FROM shoe_ready shoe_ready, shoe_ready *OLD*,
           shoe_ready *NEW*, shoe rsh,
           shoelace rsl, shoe *OLD*,
           shoe *NEW*, shoe_data sh,
           unit un
     WHERE (int4ge(min(sh.sh_avail, rsl.sl_avail), 2)
            AND (bpchareq(rsl.sl_color, sh.slcolor)
                 AND float8ge(rsl.sl_len_cm, 
                              float8mul(sh.slminlen, un.un_fact))
                 AND float8le(rsl.sl_len_cm, 
                              float8mul(sh.slmaxlen, un.un_fact))
                )
           )
       AND bpchareq(sh.slunit, un.un_name);
最后,我们把已经熟知的用于 shoelace (鞋带)的规则附加上去(这回我们在一个更复杂的分析树上)得到 
    SELECT sh.shoename, sh.sh_avail,
           s.sl_name, s.sl_avail,
           min(sh.sh_avail, s.sl_avail) AS total_avail
      FROM shoe_ready shoe_ready, shoe_ready *OLD*,
           shoe_ready *NEW*, shoe rsh,
           shoelace rsl, shoe *OLD*,
           shoe *NEW*, shoe_data sh,
           unit un, shoelace *OLD*,
           shoelace *NEW*, shoelace_data s,
           unit u
     WHERE (    (int4ge(min(sh.sh_avail, s.sl_avail), 2)
                 AND (bpchareq(s.sl_color, sh.slcolor)
                      AND float8ge(float8mul(s.sl_len, u.un_fact), 
                                   float8mul(sh.slminlen, un.un_fact))
                      AND float8le(float8mul(s

上一页  [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13]  下一页

[数据载入中...] [返回上一页] [打 印]