查询处理办法和优化讲义_第1页
查询处理办法和优化讲义_第2页
查询处理办法和优化讲义_第3页
查询处理办法和优化讲义_第4页
查询处理办法和优化讲义_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

查询处理办法和优化讲义5.1引言概述查询是数据库系统中最基本、最常见和最复杂的操作。对数据库的查询一般都是以查询语言(如SQL)表示。从查询请求出发,直到得到查询结果,这一过程称为。关系数据库系统的查询语言一般是“非过程语言”,它减轻了用户选择存取路径的负担。用户只要提出‘干什么’,不必指出‘怎么干’。即用户不必关心查询的具体执行过程,而由DBMS确定合理的、有效的执行策略。DBMS在这方面的作用称为。对于使用非过程查询语言的RDBMS,查询优化是查询处理中非常重要的一环,对系统性能会产生很大的影响。5.1引言2.查询处理的一般过程

先做词法和语法分析,把查询语句变成语法树或语法图;然后进行查询优化,形成执行计划,生成可执行代码,交系统执行。 具体处理过程也可分为解释和编译两种实现方式。 解释方式如图6-1所示。 编译方式如图6-2所示。 对于常用的例行事务,编译方式可以显著地提高数据库性能。 对于那些不怎么重复使用的偶然查询,解释也不失为一种简单、实用的实现方式。这两种实现方式在现有的商用DBMS中都有应用。5.1引言3.例子首先看一个简单的例子,说明为什么要进行查询优化。例:求选修了2号课程的学生姓名。用SQL语言表达:

SELECTSname

FROMS,SC

WHERES.SNO=SC.SNOANDSC.CNO='2';假定学生-课程数据库中有l000个学生记录,l0000个选课记录,其中选修2号课程的选课记录为50个。系统可以用多种等价的关系代数表达式来完成这一查询

1.Q1=πSname(σS.sno=sc.sno∧sco='2'(S×SC))

2.Q2=πSname(σsco='2'(S|><|SC))

3.Q3=πSname(S|><|σsco='2'(SC))我们将看到由于查询执行的策略不同,查询时间相差很大。

5.1引言查询执行策略Q1代价分析计算广义笛卡尔积的代价把S和SC的每个元组连接起来。一般连接的做法是:在内存中尽可能多地装人某个表(如Student表)的若干块元组,留出一块存放另一个表(如SC表)的元组。然后把SC中的每个元组和S中每个元组连接,连接后的元组装满一块后就写到中间文件上,再从SC中读入一块和内存中的S元组连接,直到SC表处理完。这时再一次读入若干块S元组,读入一块SC元组,重复上述处理过程,直到把S表处理完。设一个块能装l0个Student元组或l00个SC元组,在内存中存放5块Student元组和l块SC元组,则读取总块数为:

1000/10+1000/(10×5)×(10000/100)=2100块其中读Student表l00块。读SC表20遍,每遍l00块。若每秒读写20块,则总计要花105(秒)。连接后的元组数为1000×10000。设每块能装l0个元组,则写出这些块要花1000000/20=50000(秒)。5.1引言查询执行策略Q1代价分析(续)选择操作的代价

依次读入连接后的元组,按照选择条件选取满足要求的的记录。假定内存处理时间忽略。这一步读取中间文件花费的时间(同写中间文件一样)需50000秒。满足条件的元组假设仅50个,均可放在内存。3) 投影操作的代价把第2步的结果在Sname上作投影输出,得到最终结果。因此第一种情况下执行查询的总时间约为105+2×5×10000秒。这里,所有内存处理时间均忽略不计。

5.1引言查询执行策略Q2代价分析计算自然连接的代价为了执行自然连接,读取Student和SC表的策略不变,总的读取块数仍为2100块,花费l05秒。但自然连接的结果比第一种情况大大减少,为10000个。因此写出这些元组时间为10000/10/20=50秒。仅为第一种情况的千分之一。读取中间文件块,执行选择运算,花费时间也为50秒。将第2步结果投影输出。

因此,第二种情况总的执行时间≈105+50+50=205秒。

5.1引言查询执行策略Q3代价分析先对SC表作选择运算,只需读一遍SC表,存取l00块花费时间为5秒,因为满足条件的元组仅50个,不必使用中间文件。读取STUDENT表,把读入的STUDENT元组和内存中的SC元组作连接。也只需读一遍STUDENT表共l00块花费时间为5秒。把连接结果投影输出。

第三种情况总的执行时间≈5+5=10秒。5.1引言假如SC表的Cno字段上有索引,第l步就不必读取所有的SC元组而只需读取CNO=‘2’的那些元组(50个)。存取的索引块和SC中满足条件的数据块大约总共3~4块。若STUDENT表在Sno上也有索引,则第2步也不必读取所有的STUDENT元组,因为满足条件的SC记录仅50个,涉及最多50个STUDENT记录,因此读取STUDENT表的块数也可大大减少。总的存取时间将进一步减少到数秒。这个简单的例子充分说明了查询优化的必要性,同时也给了我们一些查询优化方法的初步概念。如当有选择和连接操作时,应当先做选择操作,这样参加连接的元组就可以大大减少。5.1引言查询优化 代数优化:对查询语句进行变换。 依赖于存取路径的优化(物理优化):根据系统所提供的存取路径,选择合理的存取策略。 规则优化:仅根据启发式规则,选择执行的策略。 代价估算优化:对可供选择的执行策略进行代价估算,从中选用代价最小的执行策略。

5.2代数优化5.2.1关系代数等价变换规则上面的优化策略大部分都涉及到代数表达式的变换。关系代数表达式的优化是查询优化的基本课题。而研究关系代数表达式的优化最好从研究关系表达式的等价变换规则开始。两个关系表达式El和E2是等价的,可记为E1≡E2。常用的等价变换规则有:

(1)选择的串接

σF1(σF2(R))≡σF1∧F2(R)(2)选择的交换

σF1(σF2(R))≡σF2(σF1(R))5.2代数优化(3)投影的串接.πL1(πL2(…πLn(R)…))≡πL1(R)条件:L1L2…Ln(4)选择与投影的交换.πL(σF(R))≡σF(πL(R))条件:Attr(F)是L的子集(5)连接/笛卡儿积的交换律

R|><|S≡S|><|RR×S≡S×R5.2代数优化(6)选择对连接/笛卡儿积的分配律

σF(R|><|S)≡(σF(R))|><|S

条件:Attr(F)∩Attr(S)=NULLσF1∧F2(R|><|S)≡σF1(R)|><|F2(S)条件:

Attr(F1)∩Attr(S)=NULL,Attr(F2)∩Attr(R)=NULL(7)投影对连接/笛卡儿积的分配律πL1∪L2(R|><|S)≡πL1(R)|><|πL2(R)FF条件:Attr(L1)∩Attr(S)=NULL,Attr(L2)∩Attr(R)=NULLAttr(F)Attr(L1∪L2)5.2代数优化(8)选择对∪、∩、-的分配律

σF(R∪S)≡σF(R)∪σF(S)

σF(R∩S)≡σF(R)∩σF(S)

σF(R-S)≡σF(R)-σF(S)(9)投影对∪的分配率.πL(R∪S)≡πL(R)∪πL(S)(10)|><|、×、∪、∩的结合率(R|><|S)|><|T≡R|><|(S|><|T)5.2代数优化查询优化的一般策略(1)σ优先(2)使用频率高的属性建索引(3)连接属性索引/排序(4)π、σ同时进行(5)σ+×→|><|(6)公共子表达式5.2代数优化5.2.3代数优化算法步骤:SELECT子句对应π,FROM子句对应×,WHERE子句对应σ,生成查询语法树利用规则(2),(6),(8)尽可能将选择操作移到树的叶端利用投影的串接规则(3),合并投影5.2代数优化利用连接、笛卡儿积的结合率,按照小关系先执行原则,调整连接、笛卡儿积的执行顺序*将笛卡儿积与相关选择操作转换为连接操作对叶节点加必要的π

,以消除对查询无用的属性。

5.2代数优化5.2.4例子例 设有Shop(商店),Customer(顾客),SC(购物关系)三个关系,关系模式如下:

Shop(S#,Sname,Address) Customer(C#,Cname,Address) SC(S#,C#,Item,Quantity,Price)

查询是“找出西安销售给顾客“张立”彩电的商店编号和名称”,用SQL语句表达如下:SELECTS#,SnameFROMShop,SC,CustomerWHEREShop.Address=’西安’ANDCname=’张立’ANDItem=’彩 电’

ANDShop.S#=SC.S#ANDCustomer.C#=SC.C#5.2代数优化假设该查询变换成的关系代数表达式如下:ΠS#,Sname(σShop.Address=’西安’∧Cname=’张立’∧Item=’彩电’∧Shop.S#=SC.S#∧Customer.C#=SC.C#(Shop×SC×Customer))该表达式可转换为下图所示的原始查询树表示。以SELECT子句对应投影操作,FROM子句对应笛卡儿积操作,WHERE子句对应选择操作,生成原始查询树。5.2代数优化5.2代数优化现在使用优化算法对语法树进行优化。①应用规则⑴变换选择条件C,可得到单独的五个选择操作:σShop.Address=’西安’

σCname=’张立’σItem=’彩电’

σShop.S#=SC.S#

σCustomer.C#=SC.C#②根据涉及选择的规则,尽可能将选择操作沿查询树下移。由于操作σShop.Address=’西安’、σCname=’张立’、σItem=’彩电’

分别只涉及关系Shop、Customer、SC,经过一系列变换,可以作为叶子结点的直接祖先。5.2代数优化而操作σShop.S#=SC.S#分别涉及到两个关系Shop和SC,可向下移动,与笛卡儿积交换位置。操作σCustomer.C#=SC.C#分别涉及到两个关系Customer和SC,不能再向下移向树叶方向。得到表达式:ΠS#,Sname(σCustomer.C#=SC.C#(σShop.S#=SC.S#

(σShop.Address=’西安’(Shop)×σItem=’彩电’(SC))×σCname=’张立’(Customer)))经过这一步,原始语法树变成下图的形式。5.2代数优化5.2代数优化③将选择与笛卡儿积合并为连接5.2代数优化④利用规则(3)、(7)下移Π。5.2代数优化例:设有下列关系:

S(SNUM,SNAME,CITY)P(PNUM,PNAME,WEIGHT,SIZE)SP(SNUM,PNUM,DEPT,QUAN)和如下查询:

SELECTSNAMEFROMS,SP,PWHERES.SNUM=SP.SNUMANDSP.PNUM=P.PNUMANDS.CITY=‘NJ’ANDP.PNAME=‘BLOT’ANDSP.QUAN>10000;5.2代数优化

图6-3(a)Q的原始查询树(P125)

图6-3(b)将选择操作尽量下推图6-3(c)将连接条件与笛卡儿积组合成连接操作图6-3(d)另一种查询执行方案图6-3(e)用投影操作消除对查询无用的属性5.3依赖于存取路径的优化

选择操作的实现和优化选择操作的执行策略与选择条件、可用的存取路径以及满足选择条件的元组数在整个关系中所占的比例有关。选择条件可分为:等值(=)、范围(<,<=,>,>=,Between)和集合(IN)等几种。复合选择条件由简单选择条件通过AND、OR连接而成。选择操作的实现方法包括:(1)顺序扫描:适用于小的关系,满足条件的元组比例较大或无其他存取路径。(2)利用各种存取路径:包括索引(B+树),动态散列

对于选择操作可按照下列启发式规则选取存取路径:–(8)P128-1295.3依赖于存取路径的优化连接操作的实现和优化主要考虑二元连接(two-wayjoin)。多元连接(multi-mayjoin)则以二元连接为基础。实现连接操作一般有下列4种方法:嵌套循环法(nestedloop)

顺序扫描外关系的每一个元组,然后与内关系的每一个元组进行匹配具体算法见P129图6-4

设bR

,bS分别表示R和S的物理块数,nB为可用的内存缓冲块数,并以其中(nB–1)块存放外关系,剩余的1块存放内关系。若以R为外关系,S为内关系,用嵌套循环法进行连接需要访问的物理块数为:bR+[bR/(nB-1)]×bS

若以S为外关系,R为内关系,用嵌套循环法进行连接需要访问的物理块数为:bS+[bS/(nB-1)]×bR

比较上面2个式子,可以看出选择占用物理块少的关系作为外关系

5.3依赖于存取路径的优化连接操作的实现和优化(续)利用索引或散列寻找匹配元组法可有效减少I/O次数

排序归并(sort-merge)法首先按连接属性对关系排序,然后进行归并连接具体算法见P131图6-6散列连接法(hashjoin)

首先用散列函数将连接属性散列至文件中,然后对散列到同一个桶(Bucket)中的元组进行匹配。有关连接操作实现策略的启发式规则:(1)–(4)P131-1325.3依赖于存取路径的优化投影操作的实现投影操作一般可与选择、连接等操作同时进行,不再需要附加的I/O开销。重复值的消除:排序,散列具体实现算法见P132图6-7集合操作的实现对于笛卡儿积(×)一般可采用嵌套循环法;对于∪、∩、-等操作需要发现共同元组;具体算法见P133图6-8图6-9图6-10组合操作减少临时文件,尽可能同时执行操作。

5.4代价估算优化*查询执行代价的组成与代价统计参数查询执行代价主要包括3个方面:

I/O代价(*)CPU代价通信代价访问磁盘1次所需的代价可表示为:

CI/O=D0+xD1

其中:x存取数据的大小,以字节表示

D0

与x无关的I/O代价,包括寻道时间和等待时间

D1

每个字节所需的传输时间一般D0>>xD1故

I/O代价=I/O次数×D05.4代价估算优化查询执行代价的组成与代价统计参数(续)下面给出进行代价估算时将要用到的统计参数:

nR:R中的元组数;

PR:R块因子,即每个物理块中包含的元组数;

Na:属性A在一个关系中出现的不同值的个数;

Fa:属性A的选择因子,即属性A为某一个值的概率,一般假定属性值均匀分布,FA=1/Na

Ma:属性A的值域大小|DOM(A)|;

L:索引的级数;5.4代价估算优化

选择操作的代价估算(1)顺序扫描最多选取一个元组的I/O代价:Csa=0.5[n/p]=0.5b选取多个元组的I/O代价:Csb=b(2)利用主键上的索引或散列进行等值查询通过索引访问的I/O代价:Cik=L+1通过散列访问的I/O代价:Chk=1(假定散列没有溢出)(3)利用非主键上的无序索引进行等值查询分析表明几乎每取一个元组都需要访问一个物理块,故

CINK=L+s

其中s为满足选择条件的元组数(4)利用聚簇索引进行等值查询

CCI=L+[s/p](5)利用聚簇索引进行范围查询

CCIR=L+b/25.4代价估算优化例:设有关系STUDENT,其统计数据及存取路径如下:n=10000b=2000即p=5在属性DEPT上建有聚簇索引:NDEPT=25,L=2在属性SNO上建有主键索引:NSNO=10000,L=4在属性DNO上建有辅助索引:NDNO=20,L=3在属性AGE上建有辅助索引:NAGE=15,L=2设有下列查询:Q1:σSNO=‘992311’(STUDENT)Q2:σDEPT=‘CS’(STUDENT)Q3:σAGE>=20(STUDENT)Q4:σDEPT=‘CS’ANDDNO=‘108’ANDAGE>=20(STUDENT)试用代价估算优化选取存取策略,并估算其执行代价。5.4代价估算优化解:Q1:σSNO=‘992311’(STUDENT)由于SNO上建有主索引,应优先采用主索引,其执行代价可估算为:CQ1=L+1=4+1=5Q2:σDEPT=‘CS’(STUDENT)DEPT上建有聚簇索引,故可不考虑顺序扫描。满足Q2的元组数s估计为:s=10000/25=400由于STUDENT关系对DEPT是聚簇的,故I/O代价可估算为:

CQ2=L+[s/p]=2+[400/5]=82Q3:σAGE>=20(STUDENT)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论