知识卡片

声明式查询语言优于命令式的三个原因

普通读书笔记卡

内容

命令式代码告诉计算机”按什么顺序执行什么操作”(逐行遍历、判断条件、更新变量); 声明式查询语言(如SQL)只描述”想要什么结果、结果要满足什么条件”,完全不管数据库 具体怎么实现。这个差异带来三个实质性好处。第一,隐藏实现细节使系统可以自由优化: 命令式代码里如果按特定顺序遍历一个列表,数据库就不能确定这段代码是否依赖这个顺序, 因而不敢在后台随意移动数据(比如回收磁盘空间);声明式的SQL不承诺任何特定顺序, 数据库可以在不改变查询结果的前提下自由调整内部实现来提升性能,而完全不需要修改 查询本身。第二,更适合并行执行:命令式代码指定了指令必须按特定顺序执行,天然难以 在多核、多机器间并行化;声明式语言只描述结果的模式而不描述达成结果的算法,给了 数据库更大的自由度去并行实现查询。第三,更简洁也更符合直觉。一个具体的类比是Web 浏览器里CSS和JavaScript DOM操作的对比:用CSS声明式地给某个选中的导航项标蓝,浏览器 会自动检测规则何时不再适用并撤销样式;而用JavaScript命令式地设置样式,如果选中状态 被移除,蓝色背景不会自动消失、代码必须重新运行才能撤销,这就是命令式方案额外承担的 维护负担。这三点共同解释了为什么SQL这类声明式语言比IMS/CODASYL式的命令式遍历API 最终笑到了最后。

参考来源

- 位置:《数据密集型应用系统设计》第二章《数据模型与查询语言》"数据查询语言""Web上 的声明式查询"(源文件:_epub-src/ch2_split_002.html) - 结论依据:原文说明声明式语言隐藏实现细节使数据库可在不改查询的前提下优化性能、 更适合并行执行,并用CSS选择器自动撤销样式 vs JavaScript命令式设置样式不会自动 撤销的对比来说明声明式方案的额外优势,直接支撑本卡片的三点归纳。 - 原始内容:声明式查询语言是迷人的,因为它通常比命令式API更加简洁和容易。但更重要 的是,它还隐藏了数据库引擎的实现细节,这使得数据库系统可以在无需对查询做任何 更改的情况下进行性能提升……声明式语言往往适合并行执行……如果选定的类被移除…… 即使代码重新运行,蓝色背景也不会被移除……使用CSS,浏览器会自动检测规则何时不再 适用,并在选定的类被移除后立即移除蓝色背景。