📜  高级查询优化

📅  最后修改于: 2020-12-13 05:20:48             🧑  作者: Mango

高级查询优化

有许多主题将查询优化推向高级水平。

在本节中,我们将讨论一些这样的主题。

Top-K优化

数据库系统用于从中获取数据。但是,用户已经给出了一些查询,访问结果按某些属性排序,并且对于某些K仅要求前K个结果。而且,某些查询支持bound K或limit K子句,可访问前K个结果。但是,某些查询不支持绑定的K。对于此类查询,优化器会指定一个提示,该提示指示检索到的查询结果应仅是前k个结果。查询是否生成更多结果(包括前k个结果)并不重要。在某些情况下,K的值很小,然后,如果查询优化计划生成整个结果集,则对它们进行排序并生成前K个结果。由于可能会丢弃大部分计算出的中间结果,因此这一步骤既没有效果又没有效率。因此,我们使用几种方法来优化此类前k个查询。

两种这样的方法是:

  • 使用流水线查询评估计划来按排序顺序生成结果。
  • 估计将出现在前K个结果中的排序属性上的最大值,并引入用于消除较大值的选择谓词。

无论如何,除了top-K结果之外,还会生成一些额外的元组。此类元组将被丢弃,并且如果生成的元组太少而未达到前K个结果,则我们需要再次执行查询,并且还需要更改选择条件。

加入最小化

有不同的联接操作用于处理给定的用户查询。在某些情况下,当通过视图生成查询时,为了计算查询,需要加入比实际需求更多数量的关系。为了解决这种情况,我们需要从联接中删除这种关系。这种类型的解决方案或方法称为联接最小化。我们仅讨论了其中一种情况。类似情况的数量也更多,我们也可以在其中应用联接最小化。

优化更新

更新查询用于对已经保存的数据进行更改。更新查询通常涉及集合中的子查询以及where子句。因此,在优化更新的同时,这两个子查询也必须包含在内。例如,如果用户要在roll_no为102的学生中将学生的分数更新为97,则将使用以下更新查询:

更新学生设定分数= 97,其中roll_no = 102

但是,如果更新涉及对已更新列的选择,则我们需要谨慎处理此类更新。如果更新是在索引扫描执行的选择过程中完成的,那么我们需要在扫描之前在索引中重新插入更新的元组。此外,在子查询的更新中可能会出现一些问题,其结果会受到更新的影响。

万圣节问题

之所以这样命名,是因为该问题最早是在IBM的万圣节当天发现的。影响与更新相关联的查询的执行的更新问题,称为万圣节问题。但是,我们可以通过执行以下步骤来分解执行计划来避免此问题:

  • 首先执行定义更新的查询
  • 创建受影响的元组列表
  • 最后,更新元组和索引。

因此,遵循这些步骤会增加查询评估计划的执行成本。

我们可以通过检查是否可能发生万圣节问题,以及是否无法解决万圣节问题来优化更新计划,请在查询处理期间执行更新。但是,它减少了更新开销。我们可以通过一个示例来理解这一点,假设如果索引属性不受更新影响,则万圣节问题不会发生。但是,如果这样做并且更新也减小了该值,那么即使以递增顺序扫描索引,在这种情况下,它也不会在扫描过程中再次遇到更新的元组。但是在这种情况下,即使正在执行查询,它也可以更新索引。因此,它将减少总成本并导致优化的更新。

优化产生或得出大量更新的此类更新查询的另一种方法是通过将所有更新批量收集。收集之后,将这些更新批处理分别应用于每个受影响的索引。但是,在将更新批处理应用于索引之前,需要按该索引的索引顺序对批处理进行排序。因此,批次的这种分类将减少随机I / O的数量,而在较大的高度更新索引是必需的。

因此,我们可以在大多数数据库系统中执行此类更新优化。

多查询优化和共享扫描

当用户提交查询批处理时,我们可以理解多查询优化。查询优化器利用不同查询之间的公共子表达式。这样做是为了对它们进行一次评估,并在需要时重新使用它们。因此,对于复杂的查询,我们也可以利用子表达式,从而降低了查询评估计划的成本。因此,我们需要针对不同的查询优化子表达式。优化的一种方法是消除公共子表达式,这称为“公共子表达式消除” 。通用子表达式消除方法通过计算和存储结果来优化子表达式。此外,只要出现子表达式,就重新使用结果。只有少数数据库执行评估计划中公共子表达式的利用,这些评估是针对每批查询选择的。

在某些数据库系统中,实现了另一种形式的多查询优化。这种实现方式称为查询之间的关系扫描共享。了解以下步骤以了解共享扫描的工作方式:

  • 它不会以重复的方式从磁盘读取该关系。
  • 对于每个需要扫描关系的查询,它仅从磁盘读取一次数据,一次读取一次。
  • 最后,它通过管道传递到每个查询。

当多个查询对事实表或单个大关系执行扫描时,这种共享扫描优化方法非常有用。

参数查询优化

在参数查询优化方法中,在不指定参数值的情况下执行查询优化。优化器针对不同的参数值输出多个最佳计划。仅在对于某些可能的参数值最佳的情况下才输出计划。此后,优化器将存储替代计划的输出集。然后找到并选择最便宜的计划。这样的选择比重新优化过程花费的时间少得多。通过这种方式,优化器可以优化参数并获得优化且具有成本效益的输出。