知识卡片

EXTEND可以替代SUMMARIZE,映像关系在EXTEND中更有用

普通读书笔记卡

内容

SUMMARIZE运算符从Tutorial D诞生之初就存在,但引入[[映像关系的精确定义与 双感叹号运算符]]后它就变得多余了——绝大部分汇总都能用[[EXTEND扩展运算符与 SQL_SELECT_FROM_WHERE模板的局限]]中的EXTEND加映像关系更简洁地表达。例如 “每个供应商的供货零件种类计数”,SUMMARIZE写法SUMMARIZE SP PER(S{SNO}): {PCT:=COUNT(PNO)}可以直接改写成EXTEND S{SNO}:{PCT:=COUNT(!!SP)}——因为 {SNO,PNO}是SP的键,甚至不需要先对映像关系做{PNO}投影,COUNT可以直接作用在 !!SP这整个映像关系上。这个替代关系揭示了SUMMARIZE语法本身一个不太自洽的 地方:SUMMARIZE前面写的”COUNT(PNO)“并不是对COUNT聚集运算符的调用(因为聚集 运算符的参数应该是关系而不是单个属性),而是一种只在SUMMARIZE专属语境下才 有意义的特殊语法结构,这种”看起来像聚集调用、实际不是”的设计正是书中批评 “完全去掉SUMMARIZE是不错的想法”的一条独立理由。更重要的是,书中指出映像关系 在EXTEND语境(而不是WHERE语境)里的实用价值可能更大:EXTEND可以一次性对多个 聚集指标做多重扩展(如同时算出货总量、单笔最大出货量、单笔最小出货量),还 可以配合WITH子句避免长子表达式在多个聚集指标间被重复书写和重复计算——这条 “用WITH共享公共子表达式,让DBMS只计算一次而不是多次”的写法,是本章少数明确 涉及性能考量、并期望系统据此优化的实践建议之一。

参考来源

- 位置:《SQL与关系数据库理论——如何编写健壮的SQL代码》第7章"SQL和关系代数 II:附加运算符"7.9节"再议汇总"(源文件:OEBPS/text00082.html) - 结论依据:原文明确"在引入映像关系之后,这个运算符就变得多余了……绝大部分 汇总都可以用EXTEND更为简洁的表达……SUMMARIZE前面的COUNT是个属性……这个 语法结构实在是非常特殊,它在合适的SUMMARIZE语境中才会有意义……可以证明 映像关系在这种上下文环境中比在WHERE子句中更有用处……应该期望系统……只针对 相关子表达式计算一次而非多次"。 - 原始内容:在引入映像关系之后,这个运算符就变得多余了……绝大部分汇总都可以 用EXTEND更为简洁的表达……可以证明映像关系在这种上下文环境中比在WHERE子句 中更有用处。