📅  最后修改于: 2021-01-07 05:26:40             🧑  作者: Mango
一旦导出了用于计算相关代数表达式的替代访问路径,便确定了最佳访问路径。在本章中,我们将研究集中式系统中的查询优化,而在下一章中,我们将研究分布式系统中的查询优化。
在集中式系统中,查询处理是出于以下目的进行的:
最小化查询的响应时间(将结果生成到用户查询所花费的时间)。
最大化系统吞吐量(在给定的时间内处理的请求数)。
减少处理所需的内存和存储量。
增加并行度。
最初,将扫描SQL查询。然后解析它以查找语法错误和数据类型的正确性。如果查询通过此步骤,则该查询将分解为较小的查询块。然后将每个块翻译为等效的关系代数表达式。
查询优化涉及三个步骤,即查询树生成,计划生成和查询计划代码生成。
步骤1-查询树生成
查询树是表示关系代数表达式的树数据结构。查询的表表示为叶节点。关系代数运算表示为内部节点。根表示整个查询。
在执行期间,只要其操作数表可用,就会执行内部节点。然后将该节点替换为结果表。对于所有内部节点,此过程将继续进行,直到执行根节点并将其替换为结果表为止。
例如,让我们考虑以下架构-
雇员
EmpID | EName | Salary | DeptNo | DateOfJoining |
部门
DNo | DName | Location |
让我们考虑以下查询。
$$ \ pi_ {EmpID}(\ sigma_ {Ename = \ small“ ArunKumar”} {(EMPLOYEE)})$$
相应的查询树将是-
让我们考虑另一个涉及联接的查询。
$ \ pi_ {EName,Salary}(\ sigma_ {DName = \ small“ Marketing”} {(部门)})\ bowtie_ {DNo = DeptNo} {(EMPLOYEE)} $
以下是上述查询的查询树。
第2步-查询计划生成
生成查询树后,将制定查询计划。查询计划是扩展的查询树,其中包括查询树中所有操作的访问路径。访问路径指定应如何执行树中的关系操作。例如,选择操作可以具有访问路径,该路径提供有关使用B +树索引进行选择的详细信息。
此外,查询计划还说明如何将中间表从一个运算符传递给下一个运算符,应如何使用临时表以及如何对操作进行流水线/合并。
第3步-代码生成
代码生成是查询优化的最后一步。它是查询的可执行形式,其形式取决于基础操作系统的类型。生成查询代码后,执行管理器将运行查询代码并产生结果。
在查询优化方法中,主要使用穷举搜索和基于启发式的算法。
在这些技术中,对于查询,首先生成所有可能的查询计划,然后选择最佳计划。尽管这些技术提供了最佳解决方案,但由于解决方案空间大,因此具有成倍的时间和空间复杂性。例如,动态编程技术。
基于启发式的优化使用基于规则的优化方法进行查询优化。这些算法的多项式时间和空间复杂度低于基于穷举搜索的算法的指数复杂度。但是,这些算法不一定能产生最佳的查询计划。
一些常见的启发式规则是-
在加入操作之前执行选择和项目操作。这是通过将选择和项目操作向下移到查询树中来完成的。这减少了可用于联接的元组的数量。
首先执行限制性最强的选择/项目操作,然后再执行其他操作。
避免跨产品操作,因为它们会导致非常大的中间表。