知识卡片
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子句
中更有用处。