QL语句的一大特色是只说明了what the data you want to return, 但没定义how to get those data. 对于返回给用户的数据,sql并没有给出执行策略。这就好比,sql只指出要从北京到上海,但并没有告诉你怎么去。这和面向过程的高级编程语言有本质的区别,sql只有目标没有过程。


SQL = scheduler + parser + optimizer + executor



sql优化器的工作,就是一种帮助DBMS决策如何执行的一种机制。主要是从若干种执行策略(专业术语:path)中选取一种(估计)执行最快的方案(路径)。这就好比在北京去上海的方案中(飞机去,火车去,汽车去,步行去)选取最快的飞机方案。


具体的优化器主要负责两部分工作:

  1. 单表扫描:对于单表上的算子,主要是scan操作。具体的策略有sequencial scan和index scan等。

  2. 两表连接:两张表之间主要是join操作。具体的工作包含两表之间是采用嵌套连接/排序合并连接/哈希连接

  3. 多表顺序。多表join是2表join的递归计算。但多表join的顺序严重影响计算性能。


Access Path Selection问题主要就是一个cost-based search问题。


优化器概述_java


Patricia G. Selinger Patricia G. Selinger, Morton M. Astrahan, Donald D. Chamberlin, Raymond A. Lorie, Thomas G. Price: Access Path Selection in a Relational Database Management System. SIGMOD Conference 1979: 23-34

针对该问题最经典的文章是IBM团队对system R系统的sql优化器介绍:这篇文章对单表扫描、两表连接、多表顺序的问题进行全面的讨论,是比较早期全面的讨论优化器的文章。

Yannis E. Ioannidis Yannis E. Ioannidis, Eugene Wong: Query Optimization by Simulated Annealing. SIGMOD Conference 1987: 9-22

采用模拟退火的方法搜索多表顺序

此外,pgsql在表数量很大时,采用遗传算法解决多表顺序问题

Guy M. Lohman: Grammar-like Functional Rules for Representing Query Optimization Alternatives. SIGMOD Conference 1988: 18-27

TARBURST OPTIMIZER的实

Goetz Graefe, William J. McKenna: The Volcano Optimizer Generator: Extensibility and Efficient Search. ICDE 1993: 209-218
Goetz Graefe: The Cascades Framework for Query Optimization. IEEE Data Eng. Bull. 18(3): 19-29 (1995)