大多数查询优化器将查询计划用“计划节点”树表示。计划节点封装执行查询所需的单个操作。节点被布置为树,中间结果从树的底部流向顶部。每个节点具有零个或多个子节点 - 这些子节点是输出作为父节点输入的节点。例如,连接节点将具有两个子节点,它们表示两个连接操作数,而排序节点将具有单个子节点(要排序的输入)。树的叶是通过扫描磁盘产生结果的节点,例如通过执行索引扫描或顺序扫描。
连接排序
查询计划的执行主要取决于表的连接顺序。例如,当分别连接大小为10行,10,000行和1,000,000行的3个表A,B,C时,首先将B和C连接起来的查询计划需要执行时间可能比先连接A和C多几个数量级的时间。大多数查询优化器通过由IBM的System R数据库项目开创的动态规划算法确定连接顺序。该算法分为两个阶段:
1,首先,计算查询中每个关系访问所有方法。可以通过顺序扫描访问查询中的每个关系。如果关系中有一个索引可以用来回答查询中的谓词,也可以使用索引扫描。对于每个关系,优化器记录扫描关系的最便宜方法,以及扫描以特定排序顺序生成记录的关系的最便宜方式。
2,优化器然后考虑组合存在连接条件的每对关系。对于每一对,优化器将考虑由DBMS实现的可用连接算法。除了以最便宜方式加入根据特定排序顺序生成其输出的每对关系之外,它将保留加入每对关系的最便宜方式。
3,然后,通过将上一阶段生成的双关系计划与查询中的剩余关系相加来计算所有三关系查询计划。
排序顺序可以避免在处理查询后进行冗余排序操作。第二,特定的排序顺序可以加速后续联接,因为它以特定的方式聚集数据。
嵌套SQL查询的查询规划
对现代关系DBMS的SQL查询不仅仅是选择和连接。 特别地,SQL查询通常通过分组进行存在或不存在操作,所以嵌套多个SPJ块(Select-Project-Join)层。 在某些情况下,这样的嵌套SQL查询可以被平坦化为select-project-join查询,但并不总是。 也可以使用与连接排序相同的动态编程算法来选择嵌套SQL查询的查询计划,但这可能会导致更多查询优化时间。 因此,一些数据库管理系统使用使用查询图模型的替代的基于规则的方法。
费用估算
查询优化中最困难的问题之一是准确估计替代查询计划的成本。优化器使用查询执行成本的数学模型对查询计划进行成本,这大大依赖于查询计划中流经每个边缘的基数或元组数量的估计。基数估计依赖于查询中谓词选择因子的估计。传统上,数据库系统通过对各列中值的分布进行相当详细的统计来估计选择性,如直方图。这种技术对于各个谓词的选择性的估计效果很好。然而,许多查询具有联系的谓词,例如select count(*) from R where R.make='Honda' and R.model='Accord'。查询谓词通常是高度相关的(例如,model ='Accord'意味着make ='Honda'),并且很难估计结合的选择性。查询优化器选择较差的查询计划的主要原因之一是基数估计和未被捕获的相关性较差。这就是为什么数据库管理员应该定期更新数据库统计信息的原因之一,特别是在主要数据加载/卸载之后。
古典查询优化假设查询计划根据一个单一成本度量,通常是执行时间进行比较,并且每个查询计划的成本可以在不确定的情况下进行计算。这两个假设有时在实践中被违反[,并且在克服这些限制的研究文献中已经研究了经典查询优化的多个扩展。这些扩展的问题变体在如何模拟单个查询计划的成本以及其优化目标方面有所不同。
参数化查询优化
古典查询优化将每个查询计划与一个标量成本值相关联。参数查询优化假设查询计划成本取决于优化时间未知的参数。例如参数是可变的查询谓语表示在优化时间未完全指定但将在执行时提供。因此,参数查询优化将每个查询计划与从多维参数空间映射到一维成本空间的成本函数相关联。
优化的目标通常是生成可以优化的任何参数值组合的所有查询计划。这产生一组相关的查询计划。在运行时,一旦知道真实参数值,就从该组中选出最佳方案。参数查询优化的优点是在运行时避免了优化(通常是非常昂贵的操作)。
多个目标的查询优化
除了执行时间之外,还有其他成本指标与比较查询计划相关。例如,在云计算方案中,应该比较查询计划,不仅在执行时间多少,还要考虑执行成本多少钱。或者在近似查询优化的上下文中,可以对随机选择的输入数据样本执行查询计划,以便在减少执行开销的情况下获得近似结果。在这种情况下,替代查询计划必须在其执行时间方面进行比较,而且还要根据其生成的数据的精度或可靠性进行比较。
多目标查询优化将查询计划的成本建模为成本向量,其中每个向量分量根据不同的成本度量代表成本。经典查询优化可以被认为是多目标查询优化的特殊情况,其中成本空间的维度为一(即,成本矢量分量的数量)。
不同的成本指标可能会相互冲突(例如,可能有一个计划的执行时间最短,并且在云计算方案中具有最小的货币执行费用的不同计划)。因此,优化的目标不能是找到最小化所有成本指标的查询计划,而是必须找到实现不同成本指标之间最佳折衷的查询计划。什么最好的妥协取决于用户偏好(例如,一些用户可能更喜欢更便宜的计划,而另一些用户喜欢在云方案中更快的计划)。因此,优化的目标是根据作为优化器的输入提供的用户偏好的一些规范来找到最佳查询计划(例如,用户可以定义不同成本度量之间的权重来表示相对重要性或在某些度量上定义硬成本界限)或者产生一组帕累托最优查询计划的近似值(即,计划,使得没有其他计划根据所有度量具有更好的成本),使得用户可以从该计划集合中选择优选成本折衷。
多目标参数查询优化多目标参数查询优化[1]概括了参数和多目标查询优化。计划根据多个成本指标进行比较,计划成本可能取决于优化时间值未知的参数。因此,查询计划的成本被建模为从多维参数空间到多维成本空间的函数。优化的目标是生成对于参数值和用户偏好的每个可能组合可以是最佳的查询计划集合。
多个目标的参数化查询优化
多目标参数查询优化概括了参数化和多个目标的查询优化。 计划根据多个成本指标进行比较,计划成本可能取决于优化时间值未知的参数。 因此,查询计划的成本被建模为从多维参数空间到多维成本空间的函数。 优化的目标是生成对于参数值和用户偏好的每个可能组合可以是最佳的查询计划集合。
翻译自https://en.wikipedia.org/wiki/Query_optimization#General_consideration