📅  最后修改于: 2020-12-13 05:17:18             🧑  作者: Mango
在上一节中,我们了解到应该通过测量总资源消耗来估算查询计划的成本。
在本节中,我们将了解如何在查询执行计划中执行选择操作。
通常,选择操作是通过文件扫描执行的。文件扫描是用于定位和访问数据的搜索算法。它是查询处理中使用的最低级别的运算符。
让我们看看如何执行使用文件扫描的选择。
在RDBMS或关系数据库系统中,仅当整个关系仅存储在一个文件中时,文件扫描才会读取一个关系。对元组存储在一个文件中的关系执行选择操作时,它将使用以下算法:
基于索引的搜索算法称为索引扫描。这样的索引结构称为访问路径。这些路径允许查找和访问文件中的数据。有以下算法在查询处理中使用索引:
为了基于关系中的比较进行选择,我们可以通过以下方式使用线性搜索或通过索引进行选择:
处理更复杂的选择涉及三个选择谓词,称为“合取”,“析取”和“否定”。
联合:联合选择是具有以下形式的选择:
σθ1ꓥθ2ꓥ…ꓥθn (r)
连接是满足上述选择条件的所有记录的交集。
析取:析取选择是具有以下形式的选择:
σθ1ꓦθ2ꓦ…ꓦθn (r)
析取是满足给定选择条件θi的所有记录的并集。
否定:选择σθ (r)的结果是给定关系r的元组集合,其中选择条件的评估结果为false。但空值不存在,并且该组只是在集合关系r不在σθ(r)的元组。
使用这些讨论的选择谓词,我们可以使用以下算法来实现选择操作:
在这里,算法的总成本是通过将各个索引扫描的成本和在检索到的指针列表的交集中获取记录的成本相加而构成的。我们可以通过对指针列表进行排序并获取已排序的记录来最大程度地降低成本。因此,我们发现了以下两点成本估算:
在此,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. |