数据库在执行SQL操作的时候,经过语法分析、SQL重写、生成物理查询计划等步骤。语法分析也即查询编译,生成SQL树。SQL重写根据代数规则(如结合律、交换律等)变换SQL执行计划。物理查询计划设计到具体的算法,如表扫描选择顺序扫描还是索引扫描;join算法选择nest loop join、merge join还是hash join等。
在生成物理查询计划的时候,需要由优化器来衡量最佳的执行算法。耗时=IO+内存+CPU,对于数据库查询来说,主要的耗时在于IO,所以焦点就是如何减少IO扫描次数。
衡量查询代码的模型:
数据条数(T):也即数据行数,数据表元组的数目
数据量块个数(B):多行记录以数据块为单元保存磁盘上,如PostgresQL为8kB的数据库块,按一行记录100b计算,大概每个数据块可放655行。
内存块个数(M):次数假设每个内存块和数据块的大小一致
一趟算法:
基于元组的:
...
基于关系的:
...
二趟算法: