PostgreSQL7.0手册-程序员手册 -42. Postgres 规则系统
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
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] 下一页

