了解数据库查询成本优化

时间:2016-06-29 03:23:56

标签: database query-optimization

我一直在学习“Elmasri和Navathe的数据库系统基础知识(第6版)”中的查询优化,我无法理解如何在等式中推导出一些变量。

教科书提到了一行:

(1..40).inject(:*) / ((1..20).inject(:*) ** 2)
# => 137846528820

和二级指数(B +树)的公式是:

The number of levels (x) of each multilevel index (primary, secondary, or
clustering) is needed for cost functions that estimate the number of block 
accesses that occur during query execution. In some cost functions the  
number of first-level index blocks (bI1) is needed.

我的第一个问题是,x实际上指的是什么?

因为在这种情况下,如果你有一个包含可用于识别二级索引(B +树)的根节点的信息的块,为什么需要先将级别数作为级别数量-level索引是可以理解的,因为可能必须找到所有可能的第一级内部节点来标识包含数据指针的叶节点的位置。

我的第二个问题是关于连接操作公式,其中

 Cost(C) = x+s;(on equality, =) and 
 Cost(C) = x + (bI1/2) + r/2 
 (for conditions <,<=,>,>=)
 where r = number of records (tuples)

采取上述公式和假设,

根据我的理解,如果有三个内存缓冲区,为什么每次与第二个缓冲区中的元组进行比较时,都会给出嵌套连接循环中的初始项br ...为什么再次读取所有br值用于使用关系s执行的连接操作,这是在教科书中提到的第二个内存缓冲区中发生的事情?

假设有六个关系块R并且有五个内存缓冲区,从第一个缓冲区中获取R的元组不会更好,在第二个中使用S元组执行连接操作在单循环连接的情况下将结果元组保存在第三个内存缓冲区中?因为缓冲区不能容纳整个关系本身而你可能需要多次加载不必要的数据,因此会增加成本?

如果我的基本理解存在缺陷,请原谅我

0 个答案:

没有答案