知识卡片

模型与实现的区分及"连接很慢"为何没有意义

普通读书笔记卡

内容

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

参考来源

- 位置:《SQL与关系数据库理论——如何编写健壮的SQL代码》第1章"做好准备"1.5节 "模型vs.实现"(源文件:OEBPS/text00011.html) - 结论依据:原文明确"数据模型……是数据结构以及运算符的一种抽象的、自包含的逻辑 定义……实现,是模型的组成部分在真实机器上的一种物理实现""'连接是很慢的'是一种 毫无意义的说法……模型本身没有性能可言,只有具体的实现才谈得上性能",并给出手写 嵌套循环的反面示例与"建议:别这么做"。 - 原始内容:"连接是很慢的"是一种毫无意义的说法……模型本身没有性能可言,只有具体的 实现才谈得上性能……建议:别这么做(指手写嵌套循环代替JOIN表达式)。