知识卡片
模型与实现的区分及"连接很慢"为何没有意义
内容
数据模型(第一种含义)指的是一套自包含的抽象逻辑定义——数据结构加上一组运算符,
构成一台供用户交互的”抽象机器”;实现则是这台抽象机器在真实物理机器上的具体落地
(存储编码、索引、访问路径、物理I/O等)。理解一个关系、一次连接或一个键”是什么”,
属于模型层面,是用户必须掌握的;理解它们在物理层面如何被存储、编码、加速,属于
实现层面,用户完全不需要了解也能正确使用关系模型。这个区分带来一个反直觉但重要的
推论:性能从根本上说是实现层面的问题,不是模型层面的问题——”连接是很慢的”这句
判断本身没有意义,因为模型本身没有速度可言,只有某个具体产品对某次具体连接、
在具体数据上的具体实现,才谈得上快或慢,而且是相对于另一产品的实现而言的相对
判断。但这不意味着好的实现能免除用户对模型的正确使用——反面教材是手写嵌套循环
伪代码去模拟连接(逐个遍历S的元组,再为每个元组遍历SP中SNO匹配的元组,手动拼接
结果),这种写法会彻底击败查询优化器,保证得到差劲的性能,正确做法是直接写
S JOIN SP 这样的关系表达式,把”怎么高效执行”完全交给实现层去处理。
参考来源
- 位置:《SQL与关系数据库理论——如何编写健壮的SQL代码》第1章"做好准备"1.5节
"模型vs.实现"(源文件:OEBPS/text00011.html)
- 结论依据:原文明确"数据模型……是数据结构以及运算符的一种抽象的、自包含的逻辑
定义……实现,是模型的组成部分在真实机器上的一种物理实现""'连接是很慢的'是一种
毫无意义的说法……模型本身没有性能可言,只有具体的实现才谈得上性能",并给出手写
嵌套循环的反面示例与"建议:别这么做"。
- 原始内容:"连接是很慢的"是一种毫无意义的说法……模型本身没有性能可言,只有具体的
实现才谈得上性能……建议:别这么做(指手写嵌套循环代替JOIN表达式)。