📜  查询处理中的选择操作

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

查询处理中的选择操作

在上一节中,我们了解到应该通过测量总资源消耗来估算查询计划的成本。

在本节中,我们将了解如何在查询执行计划中执行选择操作。

通常,选择操作是通过文件扫描执行的。文件扫描是用于定位和访问数据的搜索算法。它是查询处理中使用的最低级别的运算符。

让我们看看如何执行使用文件扫描的选择。

使用文件扫描和索引进行选择

在RDBMS或关系数据库系统中,仅当整个关系仅存储在一个文件中时,文件扫描才会读取一个关系。对元组存储在一个文件中的关系执行选择操作时,它将使用以下算法:

  • 线性搜索:在线性搜索中,系统扫描每条记录以测试是否满足给定的选择条件。为了访问文件的第一块,它需要一个初始查找。如果文件中的块没有以连续的顺序存储,则它需要一些额外的查找。但是,线性搜索是用于搜索的最慢的算法,但是它适用于所有类型的情况。该算法不关心选择的性质,索引的可用性或文件序列。但是其他算法并不适用于所有类型的情况。

索引选择操作

基于索引的搜索算法称为索引扫描。这样的索引结构称为访问路径。这些路径允许查找和访问文件中的数据。有以下算法在查询处理中使用索引:

  • 主索引,键上的相等性:我们使用索引来检索满足相等性条件以进行选择的单个记录。对带有主键的键属性执行相等比较。
  • 主索引,在非键上相等:在键和非键上相等之间的区别在于,我们可以获取多个记录。我们可以通过一个主键获取多个记录时的选择标准指定在非关键的相等比较。
  • 二级索引,键或非键相等:指定相等条件的选择可以使用二级索引。使用二级索引策略,当相等在键上时,我们可以检索单个记录,或者在相等条件在非键上时检索多个记录。检索单个记录时,时间成本等于主索引。如果有多个记录,它们可能驻留在不同的块中。这导致每个获取的记录执行一个I / O操作,并且每个I / O操作都需要进行查找和块传输。

选择操作与比较

为了基于关系中的比较进行选择,我们可以通过以下方式使用线性搜索或通过索引进行选择:

  • 主索引,比较:当用户给出的选择条件是一个比较时,则我们使用主排序索引,例如主B + -tree索引。例如,当关系R的A属性与给定值v比较为A> v时,我们使用A上的主索引直接检索元组。文件扫描从头到尾开始搜索,并输出所有满足给定选择条件的元组。
  • 二级索引,比较:二级索引用于满足涉及<,>,≤或≥的选择操作。在这种情况下,文件扫描搜索最低级索引的块。 (<≤):在这种情况下,它从最小值扫描到给定值v。 (>,≥):在这种情况下,它从给定值v扫描到最大值。但是,应限制使用二级索引来选择一些记录。因为这样的索引提供了指向每个记录的指针,所以用户可以轻松地通过分配的指针来获取记录。由于记录可以存储在文件的不同块中,因此此类检索到的记录可能需要I / O操作。因此,如果获取的记录数很大,那么二级索引就变得很昂贵。

实施复杂选择操作

处理更复杂的选择涉及三个选择谓词,称为“合取”,“析取”和“否定”。

联合:联合选择是具有以下形式的选择:

σθ1ꓥθ2ꓥ…ꓥθn (r)

连接是满足上述选择条件的所有记录的交集。

析取:析取选择是具有以下形式的选择:

σθ1ꓦθ2ꓦ…ꓦθn (r)

析取是满足给定选择条件θi的所有记录的并集。

否定:选择σθ (r)的结果是给定关系r的元组集合,其中选择条件的评估结果为false。但空值不存在,并且该组只是在集合关系r不在σθ(r)元组。

使用这些讨论的选择谓词,我们可以使用以下算法来实现选择操作:

  • 使用一个索引的联合选择:在这种类型的选择操作实现中,我们首先确定属性是否有任何访问路径。如果找到一个,则基于索引的算法将更好地工作。通过测试每个选择的记录是否满足其余简单条件,可以完成选择操作的进一步完成。所选算法的成本提供了该算法的成本。
  • 通过复合索引进行联合选择:复合索引是在多个属性上提供的索引。对于某些联合选择可能会出现这样的索引。如果给定的选择操作在两个或更多属性的相等条件下证明是正确的,并且在这些组合的属性字段上存在一个组合索引,则直接搜索索引。这种索引类型评估合适的索引算法。
  • 通过标识符的交集进行联合选择:此实现涉及记录指针或记录标识符。它在各个选择条件所涉及的那些字段上使用带有记录指针的索引。它在每个索引中扫描满足各个条件的元组的指针。因此,所有检索到的指针的交集是满足合取条件的元组指针的集合。该算法使用这些指针来获取实际记录。但是,在每个单独条件下都没有索引的情况下,它会针对其他剩余条件测试检索到的记录。
  • 通过标识符的联合进行不连续选择:此算法扫描那些整个索引,以找到满足单个条件的元组的指针。但前提是访问路径在所有析取选择条件下均可用。因此,所有已取记录的并集为所有满足或证明析取条件的元组提供了指针集。此外,它利用指针来获取实际记录。不知何故,如果任何条件都不存在访问路径,则需要使用线性搜索来找到满足条件的元组。因此,最好使用线性搜索来确定此类测试。

费用估算

在这里,算法的总成本是通过将各个索引扫描的成本和在检索到的指针列表的交集中获取记录的成本相加而构成的。我们可以通过对指针列表进行排序并获取已排序的记录来最大程度地降低成本。因此,我们发现了以下两点成本估算:

  • 我们可以使用单个I / O操作来获取该块的所有选定记录,因为该块中的每个指针都一起出现。
  • 当按顺序读取块时,磁盘臂的移动会最小化。

各种选择算法的成本估算图

在此,b r是文件中的块数。

h i表示索引的高度

b是保存具有指定搜索键的记录的块数

n是获取的记录数

Selection Algorithms Cost Why So?
Linear Search ts + br * tT It needs one initial seek with br block transfers.
Linear Search, Equality on Key ts + (br/2) * tT It is the average case where it needs only one record satisfying the condition. So as soon as it is found, the scan terminates.
Primary B+-tree index, Equality on Key (hi +1) * (tr + ts) Each I/O operation needs one seek and one block transfer to fetch the record by traversing the height of the tree.
Primary B+-tree index, Equality on a Nonkey hi * (tT + ts) + b * tT It needs one seek for each level of the tree, and one seek for the first block.
Secondary B+-tree index, Equality on Key (hi + 1) * (tr + ts) Each I/O operation needs one seek and one block transfer to fetch the record by traversing the height of the tree.
Secondary B+-tree index, Equality on Nonkey (hi + n) * (tr + ts) It requires one seek per record because each record may be on a different block.
Primary B+-tree index, Comparison hi * (tr + ts) + b * tT It needs one seek for each level of the tree, and one seek for the first block.
Secondary B+-tree index, Comparison (hi + n) * (tr + ts) It requires one seek per record because each record may be on a different block.