一、填空题
1.在关系数据库系统中,由于实现了查询优化,用户只要提出 做什么 ,不必指出 怎样做 。
2.查询处理分为查询编译和 查询执行 两大步骤,而查询编译又可细分为 查询分析 与 处理 、 查询优化 和 代码生成 等步骤。
3.在RDBMS中,查询编译器将查询语句经过分析与检查后转换为某种内部格式,并可用 关系代数 等价地表示。
4.代数优化是由查询优化器将关系代数初始查询树转换成一个预期所需执行时间较小的 等价 的关系代数查询树,目标是得到一个可被转换成最有效的物理查询计划的一个“优化” 的逻辑查询计划。
5.关系代数表达式(查询树)的优化就是指按照一定的规则,改变关系代数表达式中操作的 顺序 和 组合 ,将其转换为一个可以更高效执行的关系代数表达式。
6.每一个操作符的 算法 的选择是将逻辑查询计划转变为物理查询计划过程中的一个必不可少的部分。
7.在关系代数运算中, 笛卡尔积 和 连接 运算是最耗费时间和空间的。究竟应采用什么样的策略才能节省时间和空间,这就是优化的准则。
二、选择题
1.设E是关系代数表达式,F是选择条件表达式,并且只涉及A1, …,An属性,则有 A
A.бF (πA1,A2,…,An(E))≡ πA1,A2,…,An(бF(E))
B.бF (πA1,A2,…,An(E))≡бF (πA1,A2,An(E))
C.бF (πA1,A2,…,An(E))≡πA1 (бF(E))
D.бF (πA1,A2,…,An(E))≡πA1,A2,…,An(бF (πA1,A2, …,An,B1,B2, …,Bm(E)))
2.设E是关系代数表达式,若F中有不属于A1, …,An的属性B1,…,Bm,则有 D 。
A.(бF (πA1,A2, …,An,B1,B2, …,Bm(E)) ≡бF(π A1,A2, …,An (E))
B.(бF (πA1,A2, …,An,B1,B2, …,Bm(E)) ≡бF(π A1,A2, A3 (E))
C.(бF (πA1,A2, …,An,B1,B2, …,Bm(E)) ≡πA1 (бF(E))
D.(бF (πA1,A2, …,An,B1,B2, …,Bm(E)) ≡πA1,A2, …,An,B1,B2, …,Bm(бF (E))
3.如果条件F不仅涉及L中的属性,而且还涉及不在L中的属性L1,则有 B 。
A.π L( бF(E))≡π L(бF(π L∧L1(E)))
B.π L( бF(E))≡π L(бF(π L∨L1(E)))
C.π L( бF(E))≡бF(π L∧L1(E))
D.π L( бF(E))≡бF(π L∨L1(E))
4.如果条件F形如F1∧ F2,F1仅涉及E1中的属性,F2涉及到E1 和E2中的属性,则有 D 。
A.бF(E1×E2) ≡б F1(E1)×бF2 (E2)
B.бF(E1×E2) ≡б F1(б F1(E1)×бF2 (E2) )
C. бF(E1×E2) ≡бF2(б F1(E1)×бF2 (E2) )
D.бF(E1×E2) ≡бF2(б F1(E1)×E2 )
三、简答题
1.试述为什么要对关系代数表达式进行优化。
对于用户输入的具有相同语义的SQL查询,若表达的方式不同,系统可以用不同的等价的关系代数表达式来表示这一查询。对于实现同一查询的不同的关系代数表达式,其操作的次序不同,查询效率不同,查询时间相差很大。DBMS的查询优化器需按照一定的规则改变关系代数表达式中操作的次序和组合,将其转换为一个可以更高效执行的关系代数表达式,而不管用户书写的SQL查询是什么形式。
2.基于代数等价的启发式优化中应用的主要启发式规则有哪些?
基于代数等价的启发式优化一般采用如下一些启发式优化方法对关系代数表达式(查询树)进行优化。
①选择运算应尽可能先做。尽早完成选择操作来减少参与运算的元组个数,减少后 续的连接或笛卡儿积等操作的运算量,可使运算的中间结果大大减小,减少存储中间结果关系所需的磁盘空间,进而减少对其进行存取的磁盘I/O次数,提高查询执行效率。
②投影运算和选择运算同时进行。对同一关系的若干投影和选择操作,可在读取关系文件的同时完成所有这些运算,以避免重复读取关系。
③将投影运算与其前面或后面的双目运算结合。这样不必为投影运算单独读取关系文件,减少读取关系文件的遍数。
④将某些选择运算同在其前面执行的笛卡儿积结合成为一个连接运算。使选择与乘积一道完成,以避免做完乘积后,需要再读取一个大的乘积中间结果关系来进行选择运 算。连接运算要比同样关系上的笛卡儿积运算之后对乘积进行选择节省很多时间。
⑤提取公共子表达式。对于常用的公共子表达式(如视图定义),如果其结果不是很大的关系,则可先计算一次公共子表达式,并把结果写人中间结果文件,将其从外存读入 可能比每次都计算其结果的时间少得多。
4. 一个查询的实际执行所需的代价包括哪些因素?哪些因素最常用作为代价估算的基础?
:一个查询的实际执行所需的代价包括如下几个因素。
①磁盘访问代价:读写数据记录所在磁盘块的代价,通常取决于数据文件的存取结构。
②存储代价:存储由查询执行计划产生的中间结果文件的代价。
③计算代价:在查询执行过程中对内存磁盘缓冲区中的数据进行操作的代价,包括 检索记录、排序记录、归并记录以完成连接,以及基于属性值完成计算等。
④内存使用代价:与执行查询所需内存缓冲区数相关的代价。
⑤通信代价:将查询或查询结果从一个数据库站点传送到另一个站点(或发出查询的终端)的代价。
对于大型数据库,查询优化的重点是最小化对磁盘的访问代价。简单的代价估计会 忽略其他因素,只是根据磁盘与内存之间传输的磁盘块数来比较不同的查询执行计划。对于较小的数据库,查询涉及的文件中的大部分数据都可以完整地存储在内存中,所以重点是最小化计算代价。分布式数据库涉及多个站点,需要最小化通信代价。由于为代价因素指定合适的加权系数的难度很大,因此很难在代价估计中把所有的代价因素都包括在内,通常仅仅考虑磁盘访问代价一个因素。
5.选择操作的实现算法有哪些?其查询代价如何?
6.连接操作的实现算法有哪些?其查询代价如何?
实现连接操作的算法主要有一趟扫描、嵌套循环、排序-归并、基于散列和基于索引的连接。
若进行连接的关系R(X,Y)与S(Y,Z),其中Y表示R和S的所有公共属性.且假设S是较小的关系,提供连接运算的内存为M个缓冲块,关系®的大小为B®,关系®中元组的数目为T®,关系®的一个属性列(a)上不同值的数目为V(R,a)。则各算法实现连接操作的代价如下。
①一趟连接运算将较小的关系S存入内存的M-1缓冲块中,将R的每一磁盘块中的元组依次读到内存中剩下的那一个缓冲块中,对于R的每一个元组t,找到S中与t在Y的所有属性上相符合的元组,将连接结果元组移到输出文件中。算法只需从磁盘读取关系R和S各一遍,需要B(S)+B®次磁盘I/O。
②嵌套循环连接算法对外层循环关系(如S)中的每个元组,检查内层循环关系(如R)中的每个元组是否满足连接条件,如果满足条件,则连接后作为结果输出,直到外层循环关系中的元组处理完为止。假定B(S)>M,使用尽可能多的内存来存储属于较小关系S的元组,S是外层循环中的关系。则外循环的循环次数是B(S)/(M-1),在每次循环 中,读取S的M一1个块和R的B®个块,因此读取数据的磁盘I/O次数是B(S)(M-1+B®)/(M-1),或者B(S)+(B(S)B®)/(M-1)。如果B(S)≤M-1,与一趟连接算法的代价是一样的。
③排序-归并连接算法通过建立聚集索引等方式使关系R和S按照连接属性Y有序聚集存储。按照存储顺序对关系R和S并发地进行顺序扫描读取,按照连接属性Y值的顺序连接内存中R和S的具有相同y值的所有元组.直到依次处理完两个关系中具有相同y值的所有元组。算法仅对各关系中的元组扫描一次,只需要B(S)+B®次磁盘I/O。该算法可能要考虑使用某种排序算法对关系R和S进行排序的代价。
④基于散列的连接算法使用一个合适的散列函数,按连接属性对操作对象进行散列,将能够进行连接操作的所有元组分配到相同桶号的桶中。然后通过一次处理具有相同散列值的一对桶的方式执行连接操作。只要每一个桶对中有一个能全部装人M-1个 缓冲区中,则连接操作仅需从磁盘读取一次数据,需要B(S)+B®次磁盘I/O。
⑤基于索引的连接算法(假设有索引的关系为S)读人R的一个磁盘块,对于块中每 一个元组t,ty是元组t中y属性的值,利用关系S属性Y上的索引,找到其所有在Y属 性上具有相同ty的那些元组所在的磁盘块,将这些磁盘块读人内存与R中的元组t进行 连接,直到处理完R中的所有元组。读取R的所有元组需要B®次磁盘I/O。对于R 的每一个元组,将平均读取S的T(S)/V(S,Y)个元组。如果S在Y上的索引是非聚集 的,那么读取S所需的磁盘I/O的次数是T®T(S)/V(S,Y),如果S在Y上的索引是 聚集的,那么仅需T®B(S)/V(S,Y)次磁盘I/O。算法可能需要考虑读取相关索引文件的代价。
(7)以选择和连接操作为例,基于启发式规则进行物理优化的一些常用启发式规则 有哪些?
答:对于某些操作(如选择和连接操作)有多种执行这个操作的算法,DBMS对查询进行物理优化时,可以根据一些启发式规则选择代价较小的实现操作的算法,从一个根据启发 式选定的物理计划开始搜索代价更小的查询计划。一些常用的启发式规则如下。
①对于选择操作
a.若关系R的元组数较小,例如T®<M,可采用简单的全表扫描方法。
b.对于形如o-.®的选择操作,且关系R在属性a上有索引,则使用索引扫描方法。
C.对于涉及a=v的一个条件以及其他条件的选择,可以先进行一次索引扫描,然后对选中的元组作进一步过滤。
②对于连接操作
a.如果两个关系都已经按照连接属性排序,则选用排序-归并算法。
b.如果一个关系在连接属性上有索引,则选用索引连接方法,其中该关系在算法内层循环中。
c.如果前两个规则不适用,而其中一个关系较小,则可以选用散列连接方法。
d.最后再考虑选用嵌套循环方法,并选择其中较小的关系作为算法外循环中的关系。
7.以选择和连接操作为例,基于启发式规则进行物理优化的一些常用启发式规则有哪些?
四、计算题
1.假设B(R)= B(S)=10000,并且M=1000。计算嵌套循环连接的磁盘I/O代价。
解答:
为便于计算,建议将M值改为1001.则基于块的嵌套循环连接的磁盘I/O代价(读数据)为:
B(S)+ (B(S)B(R))/ (M-1)=10000+10000*10000/1000=110000(次)
2.假设B(R)=10000,T(R)=500000,R.a上有一个索引,令V(R,a)=k,k是某个常数。在下面的情况下,给出σa=0(R)的代价,表示为k的一个函数。忽略访问索引自身所需的磁盘I/O。
(1)索引是非聚集的;
(2)索引是聚集的;
(3)R是聚集的,而且不使用索引。
解答:
B(R)=10000,T(R)=500000,V(R,a)=k,
则a=0的元组大约有T(R)/V(R,a)= 500000/k个。可聚集存储在B(R)/V(R,a)= 10000/k磁盘块上。则
(1)若索引是非聚集的,则a=0的元组可随机分布在T(R)/V(R,a)磁盘块中,利用索引估计要读取T(R)/V(R,a)次磁盘,即500000/k次。
(2)索引是聚集的,则a=0的元组将顺序存储在连续的B(R)/V(R,a) 磁盘块中,利用索引估计要读取σa=0 (R)所需的磁盘I/O 的次数将大约是B(R)/V(R,a),即10000/k次。
(3)若R是聚集的,而且不使用索引,则a=0的元组可随机分布在B(R) 中,读取σa=0 (R)所需的磁盘I/O 的次数将大约是B(R)次。
3. 考虑一个关系R(a,b,c,d),该关系有一个a上的聚集索引以及每一个其他属性上的非聚集索引。相关参数为:T(R)=5000,B(R)=500,V(R,a)=50,V(R,b)=1000,V(R,c)=5000,V(R,d)=500。给出下列选择运算的最佳查询计划及其磁盘I/O开销:
(1)σa=1 AND b=2 AND c≥3 (R)
(2)σa=1 AND b≤2 AND c≥3 (R)
(3)σa=1 AND b=2 AND c=3 (R)
解答:
T(R)=5000,B(R)=500,V(R,a)=50,V(R,b)=1000,V(R,c)=5000,V(R,d)=500。有一个a上的聚集索引以及每一个其他属性上的非聚集索引。则a=1的元组平均聚集存储在B(R)/V(R,a)=500/50=10个磁盘块中。则b=2的元组随机存储在T(R)/V(R,b)=5000/1000=5个磁盘块中。则c=3的元组随机存储在T(R)/V(R,c)=5000/5000=1个磁盘块中。
因存在索引,只考虑索引扫描方法,表扫描方法代价较高,不考虑。
(1)σa=1 AND b=2 AND c≥3 (R)
可能的查询计划的代价估算:
①使用a的索引进行索引扫描,找出a=1的元组,再从中过滤出b=2和c≥3的元组。则代价大约为10次磁盘I/O。
②使用b的索引进行索引扫描,找出b=2的元组,再从中过滤出a=1和c≥3的元组。则代价大约5次磁盘I/O。
③使用c的索引进行索引扫描,找出c≥3的元组,再从中过滤出a=1和b=2的元组。由于索引不是聚集的,因此需要大约T(R)/2 =2500次磁盘I/O。
因此,最佳查询计划是使用b的索引进行索引扫描,代价大约5次磁盘I/O。
(2)σa=1 AND b≤2 AND c≥3 (R)
可能的查询计划的代价估算:
①使用a的索引进行索引扫描,找出a=1的元组,再从中过滤出b≤2和c≥3的元组。则代价大约为10次磁盘I/O。
②使用b的索引进行索引扫描,找出b≤2的元组,再从中过滤出a=1和c≥3的元组。由于索引不是聚集的,因此需要大约T(R)/2 =2500次磁盘I/O。
③使用c的索引进行索引扫描,找出c≥3的元组,再从中过滤出a=1和b=2的元组。由于索引不是聚集的,因此需要大约T(R)/2 =2500次磁盘I/O。
因此,最佳查询计划是使用a的索引进行索引扫描,代价大约10次磁盘I/O。
(3)σa=1 AND b=2 AND c=3 (R)
①使用a的索引进行索引扫描,找出a=1的元组,再从中过滤出b=2和c=3的元组。则代价大约为10次磁盘I/O。
②使用b的索引进行索引扫描,找出b=2的元组,再从中过滤出a=1和c=3的元组。则代价大约5次磁盘I/O。
③使用c的索引进行索引扫描,找出c=3的元组,再从中过滤出a=1和b=2的元组。则代价大约1次磁盘I/O。
因此,最佳查询计划是使用c的索引进行索引扫描,代价为1次磁盘I/O。