查询优化

Query optimization from various aspects

//尽早消除不需要的属性,减少查询处理的中间结果。

(一)查询优化技术(摘自<<数据库系统原理>>)

一   关系代数等价变换规则,关系代数等价变换规则仅保证表达式的等价变形,变换结果的磁盘存取复杂性可能降低,也可能增加

 1 选择串接率: σc1 and …and cn(A)σc1(σc2(…(σcn(A))…))
其中A是关系代数表达式,ci是选择条件。
即:这种复合条件的选择可以转换为逐次选择操作。

2 选择交换率: σc(σd(A))σd(σc(A)),c和d是选择条件。
即:逐次选择操作与选择顺序无关。

3 投映串接率:∏L1(∏L2(…(∏Ln(A))…))∏L1(A),其中,L1L2Ln .即:逐次投影操作可一次投影到投影域交集。

4 选择投映交换率:关于选择与投影连续操作的次序交换问题,若条件c仅包括投映域L中的属性,则∏L(σc(A))σc(∏L(A))
若条件c包括投映域L外的属性x,则∏L(σc(A))∏L(σc(∏L,x(A)))

5 连接和笛卡儿乘积的交换率:A×BB×A,A∞cBB∞cA

6 集合操作的交换率:A∪BB∪A,A∩BB∩A

二   启发式代数优化规则 等价变形时的五条启发式代数优化规则(策略),目的是为了使变换结果有较低的磁盘存取复杂性。

[规则1] 选择和投映尽早执行,(在笛卡儿乘积或连接操作之前尽量排除无关数据);
[规则2] 把某些选择操作与邻接的笛卡儿乘积结合为连接操作,(节省了两次操作之间的磁盘存取,特别是笛卡儿乘积大量的中间数据);

[规则3] 同时执行对同相同关系的多个选择和投映操作,(可以避免对相同关系的重复扫描);
[规则4] 把投映操作与连接操作结合起来执行,(节省了单独投影操作所需的关系扫描);
[规则5] 提取公共表达式,储存中间结果,减少重复计算。
        (适合于结果数据量少、但计算量大的公共表达式,对此公共表达式的调用越频繁,效益就越大)。

三  启发式代数优化算法

该算法的两个步骤:
    步骤1:把查询的高级表示(例如SQL)转换为查询的内部表示,这个转换也分两步走:

1) 查询高级表示→关系代数表达式;

2) 关系代数表达式→查询树。查询树是查询的一种内部表示形式。在查询树中,内点表示关系代数操作,叶点表示关系。执行方向自底向上。

例如,SQL语句
select A from R,S,T where P=15 and N=‘user’;
转换为关系代数示式∏A(σP=15and N=‘user’(R×S×T)),再表示为左图所示的查询树。 

步骤2:运用关系代数等价变换规则和关系代数优化规则,对查询树进行变形,产生一个优化的查询方案。查询树优化变形的实质,是对构成查询的各个关系代数操作进行优化重组。

启发式代数优化算法的非形式描述
输入:关系代数表达式
输出:计算输入关系代数表达式的程序
方法:顺序执行下列步骤(按优化规则对查询树作等价变形)

  1. 使用规律1把选择操作σc1 and …and cn(E)改为σc1(σc2(…(σcn(E))…)),
    (目的是增加灵活性);
  2. 使用规律2、4、8、10,把选择操作沿树下移,靠近叶结点,
    (目的是尽早选择);
  3. 使用规律3、4、9、11,把投映操作沿树下移,靠近叶结点,
    (目的是尽早投映);
  4. 使用规律1、3、4,把多个邻接的投映选择合并为单个操作,
    (目的是减少访问磁盘次数);
  5. 优先执行具有最小选择操作(具最小选择结果关系)的叶结点,
    (目的是减少中间结果);
  6. 将紧邻的笛卡儿乘积和选择操作并为连接操作,
    (目的是避免出现笛卡儿乘积结果);
  7. 划分子树,使每个子树的操作由单个存取程序一次完成;
  8. 产生一个计算最后查询树的程序,每步计算一个子树。

启发式代数优化算法的例子

图书馆数据库例
图书boo(ti,au,pn,nc)
      (属性的含义是:书名,作者,出版社,书号)
出版社pub(pn,pa,pc)
      (属性的含义是:社名,地址,城市)
读者bor(na,ad,ci,cn)
      (姓名,地址,城市,证号)
借阅loa(cn,nc,da)
      (属性的含义是:证号,书号,日期)

查询:显示94年2月1日前借出的书的书名。
高级语言请求 select TI from BOO,BOR,LOA
where BOO.NC=LOA.NC
  and BOR.CN=LOA.CN
  and DA<2/1/1994;
关系代数示式:∏T1(σC1(∏L(σC2((loa×bor)×boo))))

 

四   基于复杂性估计的查询优化方法

于复杂性估计的查询优化方法分为两个阶段:
阶段1:用前两节的启发性方法产生逻辑级优化的查询计划P;
阶段2:为P中每个关系代数选择具最小复杂性的实现算法,
      即确定查询计划P的优化执行策略。
      集中式数据库中影响查询执行效率有三个因素:
        1) 访问磁盘的块数;
        2) 中间结果占用磁盘空间;
        3) 处理机时间。

    这三个因素的度量就是查询执行策略的复杂性。但对于大规模数据库而言,由于主要因素是访问磁盘的块数,故把它作为查询执行策略的复杂性。一个查询计划的执行策略复杂性,就是它调用的所有关系代数操作的磁盘存取块数的总和。

五 语义查询优化方法

    利用关系的完整性约束,压缩查询对象的搜索范围,然后使用一般性的查询算法。

关键是找出与给定查询有关的完整性约束条件。
可应用人工智能领域的方法.

[例1]查询所有编号>100000000的图书。
    若存在关于编号范围的完整性约束,则可能可以压缩搜索范围。

[例2]查询居住在A城的所有读者所借阅的图书。
    若数据库有如下约束:读者只能借阅本地图书分馆的图书,则调出A城分馆的图书编号范围进行搜索,效率显然较高。

 

(二)复杂度问题

NP完全性问题

P(Polynomial问题)。在计算机里面,对一个问题寻求一种多项式的算法是一个很好的解答。从理论上来说,如果一个问题能够有多翔

实的解法的话,就算是一个很好的算法了。这种问题总可以找到一个DTM(Deterministic Turing Machine)

 

NP(Nondeterministic Polynomial问题)。但是对于很多问题来说,他们找不到一个多项式的解决方法,他们只能对应一个NDTM(Nondeterministic Turing Machine)来解决。可以这样想想:对于下一步的动作,他们也不知道确切的应该怎么办,只能“尝试”很多种方案 才能够得出一个答案,这显然是很费时的,这种问题就是NP问题。

 

NPC(NP Complete)问题,可以这么认为,这种问题只有把解域里面的所有可能都穷举了之后才能得出答案,这样的问题是NP里面最难的问题,这种问题就是NPC问题。

 

一般说来,如果要证明一个问题是NPC问题的话,可以拿已经是NPC问题的一个问题经过多项式时间的变化变成所需要证明的问题,那么要证明的问题就是一个NPC问题了。

 

NPC问题是一个问题族,如果里面任意一个问题有了多项式的解,那么所有的问题都可以有多项式。

 

 

展开阅读全文

没有更多推荐了,返回首页