第 5 章 查询处理和优化

40
第 5 第 第第第第第第第 5.1 第第 5.2 第第第第 5.3 第第第第第第第第第第第第 5.4 第第第第第第 *

Upload: solada

Post on 12-Jan-2016

74 views

Category:

Documents


0 download

DESCRIPTION

第 5 章 查询处理和优化. 5.1 引言 5.2 代数优化 5.3 依赖于存取路径的规则优化 5.4 代价估算优化*. 5.1 引言. 概述 查询是数据库系统中最基本、最常见和最复杂的操作。对数据库的查询一般都是以查询语言(如 SQL )表示。从查询请求出发,直到得到查询结果,这一过程称为 查询处理 。 关系数据库系统的查询语言一般是“非过程语言”,它减轻了用户选择存取路径的负担。用户只要提出‘干什么’,不必指出‘怎么干’。即用户不必关心查询的具体执行过程,而由 DBMS 确定合理的、有效的执行策略。 DBMS 在这方面的作用称为 查询优化 。 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第 5 章 查询处理和优化

第 5 章 查询处理和优化

5.1 引言5.2 代数优化5.3 依赖于存取路径的规则优化5.4 代价估算优化 *

Page 2: 第 5 章 查询处理和优化

5.1 引言

1. 概述• 查询是数据库系统中最基本、最常见和最复杂的操作。对数据

库的查询一般都是以查询语言(如 SQL )表示。从查询请求出发,直到得到查询结果,这一过程称为查询处理。

• 关系数据库系统的查询语言一般是“非过程语言”,它减轻了用户选择存取路径的负担。用户只要提出‘干什么’,不必指出‘怎么干’。即用户不必关心查询的具体执行过程,而由 DBMS 确定合理的、有效的执行策略。 DBMS 在这方面的作用称为查询优化 。

• 对于使用非过程查询语言的 RDBMS ,查询优化是查询处理中非常重要的一环,对系统性能会产生很大的影响。

Page 3: 第 5 章 查询处理和优化

5.1 引言

2.查询处理的一般过程 先做词法和语法分析,把查询语句变成语法树或语法图;

然后进行查询优化,形成执行计划,生成可执行代码,交系统执行。

具体处理过程也可分为解释和编译两种实现方式。解释方式如图 6 - 1 所示。编译方式如图 6 - 2 所示。对于常用的例行事务,编译方式可以显著地提高数据库

性能。对于那些不怎么重复使用的偶然查询,解释也不失为一

种简单、实用的实现方式。这两种实现方式在现有的商用 DBMS中都有应用。

Page 4: 第 5 章 查询处理和优化

5.1 引言3. 例子• 首先看一个简单的例子,说明为什么要进行查询优化。 • 例:求选修了 2 号课程的学生姓名。用 SQL 语言表达:

SELECT Sname FROM S , SC WHERE S.SNO=SC.SNO AND SC.CNO='2' ;

• 假定学生 - 课程数据库中有 l000 个学生记录 ,l0000 个选课记录,其中选修 2 号课程的选课记录为 50 个。

• 系统可以用多种等价的关系代数表达式来完成这一查询 1.Q1= πSname(σ S.sno=sc.sno sc.cno='2'∧ (S×SC))

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

3.Q3= πSname(S|><| σ sc.cno= '2' (SC))

• 我们将看到由于查询执行的策略不同 , 查询时间相差很大。

Page 5: 第 5 章 查询处理和优化

5.1 引言• 查询执行策略 Q1 代价分析1) 计算广义笛卡尔积的代价

• 把 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( 秒 ) 。

Page 6: 第 5 章 查询处理和优化

5.1 引言• 查询执行策略 Q1 代价分析 ( 续 )

2) 选择操作的代价 依次读入连接后的元组,按照选择条件选取满足要求的的记录。

假定内存处理时间忽略。这一步读取中间文件花费的时间 ( 同写中间文件一样 )需 50000 秒。满足条件的元组假设仅 50 个,均可放在内存。

3) 投影操作的代价 把第 2 步的结果在 Sname 上作投影输出 , 得到最终结果。• 因此第一种情况下执行查询的总时间约为 105+2×5×

10000 秒。这里,所有内存处理时间均忽略不计。

Page 7: 第 5 章 查询处理和优化

5.1 引言• 查询执行策略 Q2 代价分析

1) 计算自然连接的代价 为了执行自然连接,读取 Student 和 SC 表的策略不变 ,

总的读取块数仍为 2100 块,花费 l05 秒。但自然连接的结果比第一种情况大大减少,为 10000 个。因此写出这些元组时间为 10000/10/20=50 秒。仅为第一种情况的千分之一。

2) 读取中间文件块,执行选择运算,花费时间也为 50 秒。 3) 将第 2 步结果投影输出。

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

Page 8: 第 5 章 查询处理和优化

5.1 引言• 查询执行策略 Q3 代价分析1) 先对 SC 表作选择运算,只需读一遍 SC 表,存取 l0

0 块花费时间为 5 秒,因为满足条件的元组仅 50 个,不必使用中间文件。

2) 读取 STUDENT 表,把读入的 STUDENT 元组和内存中的 SC 元组作连接。也只需读一遍 STUDENT 表共 l00 块花费时间为 5 秒。

3) 把连接结果投影输出。

• 第三种情况总的执行时间≈ 5+5= 10 秒。

Page 9: 第 5 章 查询处理和优化

5.1 引言• 假如 SC 表的 Cno字段上有索引,第 l 步就不必读取

所有的 SC 元组而只需读取 CNO=‘2’ 的那些元组 (50个 ) 。

• 存取的索引块和 SC 中满足条件的数据块大约总共3~ 4 块。若 STUDENT 表在 Sno 上也有索引,则第2 步也不必读取所有的 STUDENT 元组,因为满足条件的 SC 记录仅 50 个,涉及最多 50 个 STUDENT 记录,因此读取 STUDENT 表的块数也可大大减少。总的存取时间将进一步减少到数秒。

• 这个简单的例子充分说明了查询优化的必要性,同时也给了我们一些查询优化方法的初步概念。如当有选择和连接操作时,应当先做选择操作,这样参加连接的元组就可以大大减少。

Page 10: 第 5 章 查询处理和优化

5.1 引言

4. 查询优化代数优化:对查询语句进行变换 。依赖于存取路径的优化(物理优化):根据系统所提供的存取路径,选择合理的存取策略。规则优化:仅根据启发式规则,选择执行的策略。代价估算优化:对可供选择的执行策略进行代价估算,从中选用代价最小的执行策略。

Page 11: 第 5 章 查询处理和优化

5.2 代数优化5.2.1 关系代数等价变换规则• 上面的优化策略大部分都涉及到代数表达式的变换。

关系代数表达式的优化是查询优化的基本课题。而研究关系代数表达式的优化最好从研究关系表达式的等价变换规则开始。

• 两个关系表达式 El 和 E2 是等价的,可记为 E1≡E2 。 • 常用的等价变换规则有: (1) 选择的串接 σF1(σF2(R))≡σF1∧ F2(R)

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

Page 12: 第 5 章 查询处理和优化

5.2 代数优化(3)投影的串接 .

πL1(πL2(…πLn(R)…)) ≡πL1(R)

条件: L1 L2 … Ln

(4) 选择与投影的交换 .

πL(σF(R))≡σF(πL(R)) 条件: Attr(F) 是 L 的子集(5) 连接/笛卡儿积的交换律 R|><| S≡S|><| R R×S≡S×R

Page 13: 第 5 章 查询处理和优化

5.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) F F

条件: Attr(L1)∩Attr(S)=NULL, Attr(L2)∩Attr(R)=NULL

Attr(F) Attr(L1 L∪ 2)

Page 14: 第 5 章 查询处理和优化

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)

Page 15: 第 5 章 查询处理和优化

5.2 代数优化

5.2.2查询优化的一般策略(1)σ优先(2) 使用频率高的属性建索引(3) 连接属性索引 /排序(4)π、 σ同时进行(5)σ+×→ |><|

(6)公共子表达式

Page 16: 第 5 章 查询处理和优化

5.2 代数优化5.2.3 代数优化算法• 步骤:

1)SELECT子句对应 π, FROM 子句对应 × ,WHERE 子句对应 σ ,生成查询语法树

2)利用规则 (2) , (6) , (8) 尽可能将选择操作移到树的叶端

3) 利用投影的串接规则 (3) ,合并投影

Page 17: 第 5 章 查询处理和优化

5.2 代数优化4) 利用连接、笛卡儿积的结合率,按照小

关系先执行原则,调整连接、笛卡儿积的执行顺序 *

5) 将笛卡儿积与相关选择操作转换为连接操作

6) 对叶节点加必要的 π ,以消除对查询无用的属性。

Page 18: 第 5 章 查询处理和优化

5.2 代数优化

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

• Shop (S#,Sname,Address)• Customer (C#,Cname,Address)• SC(S#,C#, Item, Quantity,Price)• 查询是“找出西安销售给顾客“张立”彩电的商店编号

和名称”,用 SQL 语句表达如下:• SELECT S#,Sname• FROM Shop , SC , Customer• WHERE Shop.Address=’西安’ AND Cname=’张立’ AND Item

=’彩 电’ AND Shop.S# = SC.S# AND Customer.C#=SC.C#

Page 19: 第 5 章 查询处理和优化

5.2 代数优化

• 假设该查询变换成的关系代数表达式如下:• ΠS#,Sname(σShop.Address=’西安’ ∧ Cname=’张立’ ∧ Item=’彩

电’ ∧ Shop.S# = SC.S# Customer.C#=SC.C# ∧ (Shop×SC× Customer))

• 该表达式可转换为下图所示的原始查询树表示。以 SELECT 子句对应投影操作, FROM 子句对应笛卡儿积操作, WHERE子句对应选择操作,生成原始查询树。

Page 20: 第 5 章 查询处理和优化

5.2 代数优化Π S#,Sname

σ C

×

Customer×

Shop SC

C=Shop.Address='西安' ∧ Cname='张立' ∧ Item='彩电' ∧ Shop.S# = SC.S# ∧

Customer.C#=SC.C#

Page 21: 第 5 章 查询处理和优化

5.2 代数优化• 现在使用优化算法对语法树进行优化。• ①应用规则⑴变换选择条件 C ,可得到单独的五个选择

操作:• σShop.Address=’西安’ • σCname=’张立’

• σItem=’彩电’ • σShop.S# = SC.S# • σCustomer.C#=SC.C#

• ②根据涉及选择的规则,尽可能将选择操作沿查询树下移。

• 由于操作 σShop.Address=’西安’、 σCname=’张立’、 σItem=’彩电’ 分别只涉及关系 Shop 、 Customer 、 SC ,经过一系列变换,可以作为叶子结点的直接祖先。

Page 22: 第 5 章 查询处理和优化

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)))

• 经过这一步,原始语法树变成下图的形式。

Page 23: 第 5 章 查询处理和优化

5.2 代数优化Π S#,Sname

σ Customer.C#=SC.C#

×

Customer×

σ Cname=’张立’σ Shop.S#=SC.S#

σ Shop. Address =’西安’

σ I tem=’彩电’

SCShop

Page 24: 第 5 章 查询处理和优化

5.2 代数优化③将选择与笛卡儿积合并为连接

Π S#,Sname

Customer.C#=SC.C#

Customer

σ Cname=’张立’

Shop.S#=SC.S#

σ Shop. Address =’西安’

σ I tem=’彩电’

SCShop

Page 25: 第 5 章 查询处理和优化

5.2 代数优化• ④利用规则 (3) 、 (7)下移 Π 。

Π S#,Sname

ΠC#

σ Cname=’张立’ΠS#,C#ΠS#,Sname

σ Address=’西安’Customer

Shop SC

σ I tem=’彩电’

Page 26: 第 5 章 查询处理和优化

5.2 代数优化例:设有下列关系: S(SNUM,SNAME,CITY) P(PNUM,PNAME,WEIGHT,SIZE) SP(SNUM,PNUM,DEPT,QUAN)和如下查询: SELECT SNAME FROM S,SP,P WHERE S.SNUM=SP.SNUM AND SP.PNUM=P.PNUM AND S.CITY=‘NJ’ AND P.PNAME=‘BLOT’ AND SP.QUAN>10000;

Page 27: 第 5 章 查询处理和优化

5.2 代数优化 图 6-3(a) Q 的原始查询树 (P125)

图 6-3(b) 将选择操作尽量下推

图 6-3(c) 将连接条件与笛卡儿积组合成连接操作

图 6-3(d) 另一种查询执行方案

图 6-3(e) 用投影操作消除对查询无用的属性

Page 28: 第 5 章 查询处理和优化

5.3 依赖于存取路径的优化1. 选择操作的实现和优化• 选择操作的执行策略与选择条件、可用的存取路径以及满足选择

条件的元组数在整个关系中所占的比例有关。• 选择条件可分为:等值 (=) 、范围 (<,<=,>,>=,Between ) 和集合 (I

N) 等几种。• 复合选择条件由简单选择条件通过 AND 、 OR 连接而成。• 选择操作的实现方法包括:

(1) 顺序扫描:适用于小的关系,满足条件的元组比例较大或无其他存取路径。

(2) 利用各种存取路径:包括索引( B+树),动态散列 • 对于选择操作可按照下列启发式规则选取存取路径:

(1) – (8) P128-129

Page 29: 第 5 章 查询处理和优化

5.3 依赖于存取路径的优化2.连接操作的实现和优化• 主要考虑二元连接 (two-way join) 。• 多元连接 (multi-may join) 则以二元连接为基础。• 实现连接操作一般有下列 4 种方法:

1)嵌套循环法 (nested loop)

顺序扫描外关系的每一个元组,然后与内关系的每一个元组进行匹配 具体算法见 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个式子,可以看出选择占用物理块少的关系作为外关系

Page 30: 第 5 章 查询处理和优化

5.3 依赖于存取路径的优化2. 连接操作的实现和优化 ( 续 )

2) 利用索引或散列寻找匹配元组法 可有效减少 I/O 次数 3) 排序归并 (sort-merge) 法 首先按连接属性对关系排序,然后进行归并连接 具体算法见 P131 图 6-6

4) 散列连接法 (hash join)

首先用散列函数将连接属性散列至文件中,然后对散列到同一个桶 (Bucket)中的元组进行匹配。

• 有关连接操作实现策略的启发式规则:(1) – (4) P131-132

Page 31: 第 5 章 查询处理和优化

5.3 依赖于存取路径的优化3. 投影操作的实现

• 投影操作一般可与选择、连接等操作同时进行,不再需要附加的 I/O开销。

• 重复值的消除:排序,散列• 具体实现算法见 P132 图 6-7

4. 集合操作的实现• 对于笛卡儿积 (×) 一般可采用嵌套循环法;•对于∪、∩、-等操作需要发现共同元组 ;• 具体算法见 P133 图 6-8 图 6-9 图 6-10

5. 组合操作•减少临时文件,尽可能同时执行操作。

Page 32: 第 5 章 查询处理和优化

5.4 代价估算优化 *

1. 查询执行代价的组成与代价统计参数• 查询执行代价主要包括 3 个方面:

1) I/O 代价 (*)

2) CPU 代价3) 通信代价

• 访问磁盘 1 次所需的代价可表示为: CI/O=D0 + xD1

其中: x 存取数据的大小,以字节表示 D0 与 x无关的 I/O 代价,包括寻道时间和等待时间 D1 每个字节所需的传输时间• 一般 D0>> xD1 故 I/O 代价 =I/O 次数 × D0

Page 33: 第 5 章 查询处理和优化

5.4 代价估算优化1. 查询执行代价的组成与代价统计参数 ( 续 )• 下面给出进行代价估算时将要用到的统计参数: nR : R 中的元组数; PR : R 块因子,即每个物理块中包含的元组数; Na : 属性 A 在一个关系中出现的不同值的个数; Fa : 属性 A 的选择因子,即属性 A 为某一个值的概率,一般假定属性值均匀分布, FA=1/ Na ;

Ma :属性 A 的值域大小 |DOM(A)| ; L :索引的级数;

Page 34: 第 5 章 查询处理和优化

5.4 代价估算优化2. 选择操作的代价估算(1) 顺序扫描• 最多选取一个元组的 I/O 代价: Csa=0.5[n/p]=0.5 b• 选取多个元组的 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/2

Page 35: 第 5 章 查询处理和优化

5.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’AND DNO=‘108’ AND AGE>=20(STUDENT)试用代价估算优化选取存取策略,并估算其执行代价。

Page 36: 第 5 章 查询处理和优化

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) 是范围查询。虽然在 AGE 上建有辅助

(二次 )索引,但不是聚簇索引。如果取一半元组,则使用索引还不如使用顺序扫描,故:

CQ3 = b = 2000Q4 :查询条件是合取式。由于没有适当的多属性索引可用,只有 2

种可能的策略:

Page 37: 第 5 章 查询处理和优化

5.4 代价估算优化策略 1 :预查询法 σDEPT=‘CS’AND DNO=‘108’ AND AGE>=20(STUDENT)

满足条件 DNO=‘108’ 的元组数估算为: n/NDNO = 10000/20 = 500

设顺序集每块可容纳 200 个 tid ,则从 DNO辅助索引的顺序集中取500

个 tid 所需的 I/O 代价为 CDNO = L + [500/200 ] = 3+3 =6

满足条件 AGE>= 20 的元组数估算为: n/2 = 10000/2 = 5000

则从 AGE辅助索引的顺序集中取 5000 个 tid 所需的 I/O 代价为 CAGE = L + [5000/200 ] = 2+25 = 27

2 个 tid集的交集的大小应小于或等于 500 。由于取 500 个随机存放的元

组一般需要 500 次 I/O ,故预查询法的 I/O 代价估算为: Ca = CDNO + CAGE + 500 = 533

Page 38: 第 5 章 查询处理和优化

5.4 代价估算优化策略 2 :用其中代价最小的一个条件选出元组,再用其他 条件对这些元组进行筛选应从 3 个条件中选出 I/O 代价最小的条件:σDEPT=‘CS’AND DNO=‘108’ AND AGE>=20(STUDENT)σDEPT=‘CS’ :同 Q2, CQ2 = 82σDNO=‘108’ : s = 10000/20= 500 CDNO=‘108’ = CDNO+500 = 6 + 500=506σAGE>=20:同 Q3, CQ3 = 2000在 3个条件中,以 σDEPT=‘CS’ 的代价最小,故可先按此条件选取

出满足条件 DEPT=‘CS’ 的学生的元组并同时检查每个元组是否满足其他 2个

条件,其 I/O代价为 Cb = 82由于 Ca>Cb ,故 CQ4=Cb=82

Page 39: 第 5 章 查询处理和优化

5.4 代价估算优化3. 连接操作的代价估算(1) 连接结果大小的估算• 为估算连接操作的代价,首先需要估算连接结果的大小。为此,

引入连接选择因子 (join selectivity) js = | R|><|CS | / |R × S| = | R|><|CS | / |R| × |S| • 如果无连接条件 C ,则 js=1• 如果没有元组满足连接条件,则 js=0• 一般 0<=js<=1• 如果连接属性 A 为 R 的键,则 js<= 1/ |R|• 如果连接属性 A 为 S 的键,则 js<= 1/ |S|• 经过分析可知,一般情况下,连接结果的元组数为: | R|><|CS | = (|R| × |S| )/M 其中 M 为连接属性 A 的值域大小。

Page 40: 第 5 章 查询处理和优化

5.4 代价估算优化(2) 嵌套循环法代价估算

(3) 排序归并法代价估算

(4) 散列连接法代价估算