首页 > 解决方案 > 如何计算扫描的索引页面和扫描的关系页面

问题描述

我有一些作业问题需要我计算查询的总成本。对查询所做的一些假设是:

  1. 所有成本都以磁盘页面、扫描索引的成本以及从关系中读取匹配元组的成本(如果需要)。

  2. 如果从关系中读取元组,请使用最坏的情况:所有元组都位于不同的磁盘页面中。

  3. 假设所有索引都有 3 个级别(根、内部节点和叶级别),并且所有索引的根都在内存中,因此扫描根不会产生任何成本。大多数搜索将有一个来自内部级别的节点和许多叶节点。

  4. Postgresql 使用下面的查询根据页数返回索引的大小。对于 B 树索引,假设提供的数字是叶节点的数量。

我的教授还给了我们一个示例查询来获取成本,但我不知道他是如何得到这些数字的。有问题的数据库如下所示:

create table series (
seriesid int primary key
, title varchar(400)
, yearreleased int
, contentrating varchar(40) -- age group the movie is intended for
, imdbrating float -- imdb rating
, rottentomatoes int -- rotten tomatoes rating
, description text
, seasons int -- how many seasons are available
, date_added date -- date series is added to Netflix
) ;

计算成本的查询如下所示:

qa: select director from seriesdirectors where seriesid <= 100;

引用的索引是 seriesdirectors_pkey,它有 2 个关系页面,查询总共返回 5 个元组。

使用这些数字,我的教授以某种方式得出结论,扫描的索引页数为 3,扫描的关系页数为 0。

原因是:“因为有 5 个元组匹配此查询(1 个内部节点,最坏情况下为 2 个叶节点),并且索引包含所有必要的信息(因此需要读取零个元组)。” 我一直在尝试理解索引页的概念以及我的教授是如何获得这些数字的,这样我就可以解决剩下的问题。如果需要更多上下文,我会告诉你。

编辑:在这种情况下,索引页面的定义是一种从具有唯一标识符的数据库中存储元组的方法(即数据库的标准索引,更多信息请参见:https ://en.wikipedia.org/wiki/Database_index ) .

我遇到的一个大问题是如何计算查询的索引页总数和查询的关系页数。上面的示例查询 ( qa) 使用了索引 seriesdirectors_pkey,它有 2 个关系页面并返回 5 行的结果。我不知道我们是如何从那里得知查询了 3 个索引页面和查询了 0 个关系页面的。

标签: databasepostgresqlindexingb-tree

解决方案


推荐阅读