精华内容
下载资源
问答
  • 数据库查询优化

    2020-11-18 23:22:44
    关系型数据库查询优化一般可分为代数优化(也称为逻辑优化)和物理优化(非代数优化)。代数优化是指关系代数表达式的优化,物理优化则是通过存取路径和底层操作算法的选择进行优化。 查询处理步骤 1 查询分析 首先...


    关系型数据库查询优化一般可分为代数优化(也称为逻辑优化)和物理优化(非代数优化)。代数优化是指关系代数表达式的优化,物理优化则是通过存取路径和底层操作算法的选择进行优化。

    查询处理步骤

    1 查询分析

    首先对查询语句进行扫描、词法分析和语法分析。从查询语句中识别出语言符号,如SQL关键字、属性名和关系名等,进行语法检查和语法分析。

    2 查询检查

    对合法的检查语句进行语义检查,即根据数据字典中有关的模式定义检查语句中的数据库对象,如关系名,属性名是否存在和有效。关系数据库一般使用查询树,也称为语法分析树。

    3 查询优化

    每个查询都会有许多可供选择的执行策略和操作算法,查询优化就是选择一个高效执行的查询处理策略。查询优化一般可分为代数优化和物理优化。代数优化是指关系代数表达式的优化,即按照一定的规则,通过对关系代数表达式进行等价交换,改变代数表达式中操作的次序和组合,使执行更高效;物理优化则是通过存取路径和底层操作算法的选择进行优化。

    4 查询执行

    依据优化器得到的执行策略生成查询执行计划,由代码生成器生成执行这个查询计划的代码。

    查询算法操作

    1 选择算法的实现

    例如:select * from student from <条件表达式>

    简单的全表扫描算法

    对表进行顺序扫描,当选择率(即满足条件的元组数占全表的比例)较低时,这个算法效率很低。

    索引扫描算法

    选择属性上有索引(例如b+树索引或hash索引),可以用索引扫描方法,通过索引找到满足条件的元组指针,再通过元组指针在查询的基本表中找到元组。

    2 连接操作的实现

    连接操作是查询处理中最常用也是最耗时的操作之一。
    例如:select * from student, sc where student.sno = sc.sno;

    嵌套循环算法(nested loop join)

    对外层循环的每一个元组,检索内层循环中的每一个元组,并检查这两个元组在连接属性上是否相等。如果满足连接条件,则串接后作为结果输出,直到外层循环表中的元组处理完为止。

    排序-合并算法(sort-merge join)

    等值连接常用算法,尤其适合参与连接的诸表已经排序的情况。
    1,如果参与连接的表没有排好序,首先对student表和sc表按连接属性sno排序
    2,取student表中的第一个sno,依次扫描sc表中具有相同sno的元组,把他们连接起来
    3,当扫描到sno不相同的第一个sc元组时,返回student表扫描它的下一个元组,再扫描sc表中具用相同sno的元组,把他们连接起来
    例如使用索引排序实现(d.department_id为索引):
    select e.employee_id, e.name, e.department_id from employees e, departments d where e.department_id = d.department_id order by d.department_id;

    索引连接(index join)

    1,在sc表上已经建立了属性sno的索引
    2,对student中的每一个元组,由sno值通过Sc的索引查找相应的sc元组
    3,连接sc元组和student元组
    知道student元组处理完毕

    hash join算法

    1,划分阶段。对包含较少元组的表(如student表)进行一遍处理,把他的元组按hash函数分散到hash表的桶中;
    2,试探阶段。对另一个表进行一遍处理,把sc表中元组也按hash函数进行散列,找到适合的hash桶,并把sc元组与桶中来自student表并与之相配的元组连接起来。

    展开全文
  • 第九章 关系查询处理和查询...查询优化一般可分为代数优化与物理优化,代数优化是关系表达式的优化,物理优化是存取路径和底层操作算法的选择)。 查询执行 关系数据库系统的查询优化 代数优化 改变查询语...

    第九章 关系查询处理和查询优化

    本章主要关于查询处理和查询优化的基本概念,方法和技术。

    查询处理的任务是把用户提交给RDMS的查询语句转换为高效的执行计划。

    查询处理步骤:

    查询分析

    查询检查

    查询优化(一般可分为代数优化与物理优化,代数优化是关系表达式的优化,物理优化是存取路径和底层操作算法的选择)。

    查询执行

    关系数据库系统的查询优化

    代数优化

    改变查询语句中操作的次序和组合,不涉及底层的存取路径。

     

    物理优化

    选择高效合理的操作算法或存取路径,求得优化的查询计划,达到查询优化的目标。

    选择的方法可以是:

    基于规则的启发式优化;

    基于代价估算的优化;

    两者结合的优化方法。

     

    转载于:https://www.cnblogs.com/Cheryl06/p/7300662.html

    展开全文
  • Oracle中SQL语句的执行过程可分为解析(Parse)、执行(Execute)和提取结果(Fetch)三步,此方法就是通过对SQL语句在Oracle数据库中优化执行的三个过程来提高Oracle数据库的性能。 关键词 数据库 扫描 多表联结 子...

    摘要   本文提出了一种优化Oracle数据库的方法。Oracle中SQL语句的执行过程可分为解析(Parse)、执行(Execute)和提取结果(Fetch)三步,此方法就是通过对SQL语句在Oracle数据库中优化执行的三个过程来提高Oracle数据库的性能。  
        关键词   数据库   扫描   多表联结   子查询    
        1   如何优化Parse    
        1.   1   SQL语句的Parse处理步骤:    
        1)   计算语句值    
        2)   共享池中有无与此语句值相同的语句?    
        3)   共享池中有与此语句字符完全匹配的语句?    
        4)   准备要运行的SQL语句    
        5)   为新语句在共享池中创建空间    
        6)   将语句存放在共享池中    
        7)   修改共享池图,标明语句的值和在共享池中的位置    
        8)   执行准备好的SQL语句    
        最理想的是,语句只执行1、2、3和8步来进行处理。不经过2、3步来测试被传给Oracle的语句要使用1~8步进行处理。只经过1、2、3、8的SQL语句要比经过1~8步的语句更为有效。  
        1.2   在共享池中重用SQL语句    
        当SQL语句被传递给Oracle处理时,其秘诀是重复使用已经在共享池中的语句,而不是让Oracle在接受语句时去准备新的语句。前面表明,如果Oracle接受了一个与共享池中的语句相Oracle提供在数据库中存储代码的能力。当应用系统开始运行时,从数据库中读取代码(可用PL/SQL语句编制)并像其它语句那样传递到共享池中去处理。从数据库中取出的代码是可以利用数据库中存储的程序代码设计应用系统,检查所有的事务处理以及主要的通用的过程,研究现有的应用系统并把主要的处理程序转换为数据库中存储的程序代码。在Oracle中存储代码可以通过过程、程序包、函数、触发器等来实现。  
        2   如何优化Execute和Fetch    
        2.1   避免无计划的全表扫描    
        全表扫描连续从表读取所有数据,而不管数据是否与查询有关。避免不必要的全表扫描有  
        2)   过全表扫描读取的数据很快从SGA的缓冲区移走(如果正在扫描的表不是“高速存储  
        在基于规则优化的情况下,如果下列任何条件在SGA语句出现,就要对一个表进行全表扫  
        1)   该表无索引    
        2)   对返回的行无任何限定条件(如无Where语句)    
        3)   对数据表与任何索引主列相对应的行无限定条件。例如,在City-State-Zip列上创  
      建了三列复合索引,那么仅对State列有限定条件的查询不能使用这个索引,因为State不是  
        4)   对索引主列的行有限定条件,但条件或者是NULL或者是不相等。例如,City列上存在  
        Where   city   is    
        Where   city   is   not    
        Where   city!=’liaoning’    
        5)   对索引主列的行有限定条件,但条件在表达式里使用。例如,如果在City列上索引,  
        Where   City=’liaoning’    
        可以使用索引。然而,如果限定条件是    
        Where   UPPER(City)=’liaoning’    
        那么不会使用City列上的索引,因为City列在UPPER函数里。如果将City列与文本字符串  
      联结在一起,也不会使用索引。例如,如果限定条件是  
        Where   City||’x’   like   ‘liaoning%’    
        那么不会使用City列上的索引。    
        6)   对索引主列的行有限定条件,但条件使用Like操作以及值以‘%’开始或者值是一个  
        Where   City   like   ‘%aonin%’    
        Where   City   like   :City_Bind_Variable    
        如果表小、索引列无选择性,基于开销的优化器可能决定使用全表扫描。    
        2.2只使用选择性索引    
        索引的选择性是指索引列里不同值的数目与表中记录数的比。如果表有1000个记录,表索  
      引列有950个不同值,那么这个索引的选择性就是950/1000或者0.95。最好的可能性选择是  
        如果使用基于开销的最优化,优化器不应该使用选择性不好的索引。    
        索引的选择性是指索引列里不同值的数目与表中记录数的比。如果表有1000个记录,表索  
      引列有950个不同值,那么这个索引的选择性就是950/1000或者0.95。最好的可能性选择是  
      1.0。依据非空值列的唯一索引,通常其选择性为1.0。  
        索引的选择性是指索引列里不同值的数目与表中记录数的比。如果表有1000个记录,表索  
      引列有950个不同值,那么这个索引的选择性就是950/1000或者0.95。最好的可能性选择是  
        2.3管理多表联结    
        Oracle提供了3个联结操作:NESTED   LOOPS、HASH   JOIN和MERGE   JOIN。MERGE   JOIN是一  
      组操作,在所有行被处理完之前,它不返任何记录给下一操作。NESTED   LOOPS和HASH是行操作  
        在每个联结选项里,必须执行一些步骤以获取最好的联结性能。如果没有适当地优化联结  
      操作,那么联结所需的时间也许随着表的增长而呈指数级地增长。

           2.4管理包含视图的SQL语句    
        如果查询包含视图,优化器有两种执行查询的方法:首先解决视图然后执行查询,或者把  
      视图文本集成到查询里去。如果首先执行视图,那么首先完成全部的结果集,然后用其余的查  
        首先解决视图会导致查询性能下降的问题,这取决于所涉及表的相对大小。如果视图被集  
      成到查询里,那么查询的条件也可以应用于视图里,并且可以使用一个小一些的结果集。然而  
      在一些情况下,也许可以通过视图分离组操作提高查询性能。  
        如果一个视图包含集合的操作(如Group   by、SUM、COUNT或者DISTINCT),那么视图不能  
        不使用组或者没有集合操作的视图的SQL语法可以被集成到大的查询里去。    
        2.5优化子查询    
        当使用自查询时,也许会碰到几个独特的问题。涉及子查询的查询潜在问题如下:    
        &#61548;   也许在执行完查询的剩余部分前执行子查询(与执行分组功能的视图相似)。  
        &#61548;   子查询也许要求特定的提示,但这些提示不直接与调用该子查询的查询有关  
        &#61548;   可以作为单个查询执行的子查询也许被代替写成几个不同的子查询。    
        &#61548;   也许在使用not   in子句或者not   exists子句时,不能在最有效的方式下进行子  
        1)当执行子查询时    
        如果一个查询包含子查询,那么优化器有两种完成查询的方法:首先完成子查询,然后完  
      成查询(“视图的方法”),或者将子查询集成到查询里去(“联结”的方法)。如果首先解  
      决子查询,那么整个子查询的结果集将首先被计算,并且用查询条件的剩余部分做过滤器。如  
      果没有使用子查询去进行存在检查,那么“联结”方法将通常要比“视图”方法完成得好。  
        如果一个子查询包括集合操作,如group   by,SUM或者DISTINCT,那么不能集成子查询到  
      查询的其余部分里去。非集成的子查询限制了提供给优化器的选项。  
        2)如何组合子查询    
        一个查询可以包含多个子查询,使用的子查询越多,集成或者重写它们到大的联结里就越  
      困难。既然有多个子查询使集成困难,就应该尽可能地组合多个子查询。  
        3)怎样进行存在检查    
        有时子查询不返回行(记录),但可以进行数据正确性检查。在相关表里的记录或者存在  
      或者不存在的逻辑检查,称为存在检查。可以使用exists和not   exists子句提高存在检查的性  
        2.6管理对非常巨大的表的访问    
        随着表增长到比SGA的数据块高速缓冲区存储器的空间显著大时,需要从另一个角度优化  
        1)问题    
        当表和它的索引小的时候,在SGA里可以有高度的数据共享。多用户读表或索引范围扫描  
      可以反复使用同一个块。随着表的增长,表的索引也在增长。随着表和它的索引增长到比SGA  
      里提供的空间大时,范围扫描需要的下一行将在SGA里找到的可能性变小,数据库的命中率将  
      减小。最后,每一个逻辑读将要求一个单独的物理读。对使用非常大的表的优化方法着眼于特  
        2)管理数据接近    
        在访问非常大的表期间,如果倾向于继续使用索引,那么应该关注数据接近,即逻辑相关  
      记录的物理关系。为了使数据最大限度地接近,应该连续往表里插入记录。记录按通常在表的  
        3)避免没有帮助的索引扫描    
        如果要对大表使用索引扫描,那么不能假定索引扫描将比全表扫描执行得更好。不紧跟表  
      访问的索引唯一扫描或范围扫描执行得比较好,但紧跟通过RowID的表访问的索引范围扫描也  
      许执行得差。随着表增长到比数据块高速缓冲存储器大得多,最终,索引扫描和全表扫描间的  
        4)创建充分索引的表    
        如果表中的数据相当稳定,充分索引一个表是很有用的。创建一个复合索引,它包括所有  
      在查询期间通常选择的列。在查询期间,查询要求的所有数据可以通过索引访问提供,不需要  
        5)并行选项    
        可以把一个数据库任务,比如Select语句,分为多个单元的工作,由多个Oracle进程同时  
      执行。这种能够允许数据库的单个查询活动由多个协调的进程透明地进行处理的能力,称为并  
        并行选项调用多个进程来利用空闲的系统资源,以减少完成任务所需要的时间。并行选项  
      并不减少处理过程所要求的资源数量,而是把处理的任务分散给多个CPU。为了从并行选项中  
      得到最大的好处,应该使CPU和磁盘上的I/O不要满负荷使用。因为并行的目的是使更多的CPU  
      和磁盘同时参与处理数据库的命令,一个缺乏CPU和I/O资源的服务程序是不能从并行选项中得  
        2.7使用UNION   ALL而不是UNION    
        最常用的集操作是UNION操作,UNION操作使多个记录集联结成为单个集。UNION操作的数  
      学定义是返回记录的单个集并且没有重复的行,所以在合并结果集里,Oracle只返回不同的记  
        当UNION操作用作SQL语句的一部分时,唯一性要求强迫Oracle移走重复的记录。Oracle的  
      移走重复记录的功能是SORT   UNIQUE操作,它与使用DISTINCT子句时执行的操作类似。  
        UNION   ALL操作允许重复。UNION   ALL不要求SORT   UNIQUE操作,从而节省了开销。UNION    
      ALL是一个行操作,所以当其变为有效就返回给用户。而UNION包括SORT   UNIQUE集操作,在全  
        当UNION   ALL操作产生巨大的结果集时,不需要任何排序便返回记录给应用的事实意味着  
      第一行检索的响应时间更快,并且在许多情况下,可以不用临时段完成操作。  
        在有些情况下,UNION   ALL和UNION不返回同样的结果。如果在应用环境中,结果集并不包  
        2.8避免在SQL里使用PL/SQL功能调用    
        对于增加PL/SQL的使用,许多用户试图利PL/SQL功能的优势产生可重复使用的代码。其中  
      一个强迫重复使用PL/SQL功能的方法是在SQL语句里使用。例如,可以创建一个将国际货币转  
      换为US$的函数。这个函数称为US$。示例如下:  
        select   transaction_type,   US$   (amount,   currency)  
       
        from   international_transaction     where   US$   (amount,   currency)   >   1000;    
        执行前面的SQL语句没有所期望的那样好。在测试时,它的性能大约比下面得出相同结果  
        select   transaction_type,    
        amount*exchange_rate   US$    
        from   exchange_rate   er,   international_transaction   it  
        where   er.currency   =   it.currency     and   amount*exchange_rate   >   1000;    
        响应时间不同的原因是混合PL/SQL和SQL时,Oracle使用的机制不同。在SQL查询里嵌入  
      PL/SQL功能时,在执行时,Oracle将调用分成两部分:用带有赋值变量的SQL语句代替功能调  
        select   transaction_type,   :a1    
        from   international_transaction     where   :a1   >   1000    
        和    
        BEGIN    
        :a1   :=   US$   (:amount,   :currency);    
        END    
        对在international_transaction表里的每一行,将执行在前面示例里显示的无名块两次。无名块调用导致查询响应时间的剧增。应该避免在SQL语句里使用PL/SQL功能调用。  

    转载于:https://www.cnblogs.com/stray521/archive/2009/04/03/1428777.html

    展开全文
  • 查询优化一般可分为: 代数优化(逻辑优化) 物理优化(非代数优化) 9.1 关系数据库系统的查询处理 定义: 查询处理是关系数据库管理系统执行查询语句的过程。 任务: 其任务是把用户提交给关系数据库的查询...

    第九章 关系查询处理和查询优化

    本章主要介绍关系数据库的查询处理和查询优化技术。
    本章中重点为一些查询优化的思想。
    查询优化一般可分为:

    • 代数优化(逻辑优化)
    • 物理优化(非代数优化)

    9.1 关系数据库系统的查询处理

    定义:

    • 查询处理是关系数据库管理系统执行查询语句的过程。

    任务:

    • 其任务是把用户提交给关系数据库的查询语句转换为高效的查询执行计划

    9.1.1 查询处理步骤

    查询处理分为4个阶段:

    • 查询分析
    • 查询检查
    • 查询优化
    • 查询执行

    查询分析

    定义:

    • 对查询语句进行扫描、词法分析和语法分析。

    目的:

    • 判断是否有语法错误;
      • 无错,进入下一步;
      • 有错,则报告语法错误

    查询检查

    定义:

    • 对合法的查询语句进行语义分析、符号名转化、安全性检查和完整性初步检查

    目的:

    • 根据数据字典中有关的模式定义,检查语句中的数据库对象是否存在和有效;
    • 如果是对视图的操作,则要用视图消解的方法转化成对基本表的操作;
    • 还要根据数据字典中用户权限和完整性约束的定义,对用户的存取权限进行检查;
      • 无权限或违反完整性约束,将拒绝执行该查询
      • 此时的完整性检查,是初步的、静态的检查

    检查通过后:

    • 将把SQL查询语句转换成内部表示,即等价的关系代数表达式。这个过程中把数据库对象的外部名称转换成内部表示。
    • 关系数据库关系系统一般都用查询树,也称为语法分析树来表示扩展的关系代数表达式

    查询优化

    定义:

    • 每个查询都会有许多可供选择的执行策略和操作算法,查询优化就是选择一个高效执行的查询处理策略。

    按照优化的曾以一般可将查询优化分为:

    • 代数优化
      • 指关系代数表达式的优化,即按照一定的规则,对关系代数表达式进行等价变换,改变代数表达式中操作的次序和组合,使查询执行更高效
    • 物理优化
      • 指存取路径和底层操作算法的选择。选择的依据一般有三种:
        • 基于规则
        • 基于代价
        • 基于语义

    查询执行

    依据优化器得到的执行策略生成查询执行计划,由代码生成器生成执行这个查询计划的代码,然后加以执行,回送查询结果。

    9.1.2 实现查询操作的算法

    就不根据例子讲了,想具体可以直接看书,这里就记录下几种算法思想

    选择操作的实现算法:

    • 简单的全表扫描算法(table scan)
    • 索引扫描算法(index scan)

    选择操作时查询处理中最常用也是最耗时的操作之一。

    连接操作的实现算法:

    • 嵌套循环算法(nested loop join)
    • 排序-合并算法(sort-merge join 或者 merge join)
    • 索引连接算法(index join)
    • hash join算法

    简单的全表扫描算法

    算法思想:

    • 按照物理次序读表的M块到内存
    • 检查内存中的每一个元组t,如果t满足选择条件,则输出t
    • 如果表中还有未处理的块,重复前两步

    优点:

    • 只需要很小的内存就可以运行(最少1块)
    • 对于规模较小的表,这种算法简单有效

    缺点:

    • 当表的规模很大,并且选择率(即满足条件的元组占全表比例)很低时,这种算法的效率较低。

    索引扫描算法

    如果选择条件上有索引(例如B+树索引或hash索引),可以用索引扫描方法。

    算法思想:

    • 先通过缩影找到满足条件的元组指针
    • 再通过元组指针在基本表中找到元组

    与全表扫描算法比较:

    • 一把情况下,当选择率较低时,基于索引的选择算法要优于全表扫描算法。
    • 但再某些情况,例如选择率较高,或者要查找的元组均匀分布再查找的表中,这时基于索引的选择算法性能不如全表扫描算法
      • 这是因为除了对表的扫描操作,还要加上对B+树索引的扫描操作,对每一个检索码,从B+树根节点到叶子节点都要执行一次I/O操作。

    特殊情况说明:

    选择条件Sdept = 'cs' AND Sage > 20,如果SdeptSage上都有索引。

    则有两种算法可选:

    • 一种是通过索引分别找到两个条件的元组指针集合,再求两个集合的交集,再到基本表中去检索。
    • 另一中算法是通过Sdept = 'cs'找到一个元组指针集合,然后遍历这个指针集合,到基本表中将满足另一条件(Sage > 20)的元组选择输出。

    嵌套循环算法

    这是最简通用的算法,可以处理包括非等值连接在内的各种连接操作。

    算法思想:(连接条件:left.a = right.b)

    • 对外层循环(左表)的每一个元组,检索内层循环(右表)中的每一个元组,并检查来这两个元组再连接属性上是否相等。
    • 如果满足连接田间,则串接后作为结果输出,直到外层循环表中的元组处理完。

    说白了就是两个for循环,时间复杂度O(N*M)

    注意:

    再实际实现中,数据存取时按数据块读入内存中的,而不是按照元组进行I/O。

    排序-合并算法

    这是等值连接常用的算法,尤其适合参与连接的诸表已经排好序的情况。

    算法思想:(连接条件:left.a = right.b)

    • 如果参与连接的表没有排好序,首先将两个表分别按照连接属性排好序
    • left表的第一个a,依次扫描right表的具有b=a的元组,把它们连接起来
    • 当扫描到rightb!= ad的第一个元组时,返回left表扫描它的下一个元组

    说白了,就时先排序,然后两个for循环,记录内存循环的index,同时内存循环加break条件。排序时间复杂度O(N*log(N)),循环时间复杂度O(N+M)。

    优点:

    • 虽然时间主要花在排序上,但是相比嵌套循环算法,在表规模较大时,还是能减少很多时间

    索引连接

    算法思想:(连接条件:left.a = right.b)

    • 要求在right表上已经建立了属性b的索引
    • 对于left中的每一个元组,由a的值,通过b的索引找到相应的right表元组
    • 将左右表的元组连接起来
    • 循环执行第二、三步,直到左表元组全部处理完

    算法时间复杂度:

    • 根据索引查找依次的时间复杂度O(layers),layers表示层数,一次查找需要比较layers-1次
    • 所以总的算法复杂度是,O(N*layers)

    hash join算法

    hash join 算法也是处理等值连接的算法。

    算法思想:

    • 划分阶段:创建 hash 表,对包含较少元组的表,进行一遍处理,把它的元组通过连接属性按 hash 函数,分散到 hash 表的桶中;
    • 连接阶段:对另一个表,同样进行一遍散列处理,找到合适的 hash 桶,将两个的匹配的元组连接起来。(感觉书上没表述清,应该是当发现 hash 表中已有key值时,将两个value对应的元组连接)

    其实也是通过hash来快速匹配,从而减少循环次数。

    算法时间复杂度O(N+M)。

    缺点:

    • 需要一个前提条件,数据量较小的表,在第一阶段后,能完全放入内存中的 hash 桶中。
    • 有克服了这一缺点的改进算法,书中列出了英文参考文献,有需要深入研究的可以找找

    9.2 关系数据库系统的查询优化

    关系查询优化是影响关系数据库管理系统性能的关键因素。

    9.2.1 查询优化概述

    查询优化的优点;

    • 不仅在于用户不必考虑如何最好地表达查询以获得较高的效率;
    • 而且在于系统可以比用户程序的“优化”做得更好。

    这是因为:

    • 优化器可以从数据字典中获取许多统计信息(例如,每个关系表的元组数、每个属性值的分布情况、哪些属性上有索引等),从而根据这些信息做出正确的估计,选择高效的执行计划。(信息全面)
    • 如果数据库的物理统计信息改变了,系统可以自动对查询进行重新优化以选择相适应的执行计划。(自适应)
    • 优化器可以考虑数百种不同的执行计划,而程序员一般只能考虑有限的几种可能性。(考虑周全)
    • 优化器中包含了很多复杂的优化技术,这些优化技术往往只有最好的程序员才能掌握。系统自动优化相当于所有热都拥有了这些技术。(掌握高级技术)

    执行计划的选取:

    • 目前关系数据库系统 通过某种代价模型计算出各种查询执行策略的执行代价,然后选取代价最小的执行方案

    在集中式数据库中,查询执行开销主要包括:

    • 磁盘存取块数(I/O代价)
      • 由于磁盘I/O,涉及机械动作,需要的时间相比内存操作要高几个数量级。一般将读写的块数,作为衡量查询代价的单位。
    • 处理机时间(CPU代价)
    • 查询的内存代价

    分布式数据库中,则还要加上:

    • 通信代价

    9.2.2查询优化的一个实例

    书上这节专门介绍了一个例子,对比使用三种查询方式需要读写的块数,来说明查询优化的重要性。这里简单说下,就不想详细计算了。

    select Student.Sname from Student,SC where Student.Sno = SC.Sno and SC.Cno = '2'

    第一种方式:

    • 计算两个表的广义笛卡儿积
      • 这一步产生的结果集太大,需要写入中间文件,写入块数大
    • 从广义笛卡儿积中根据两个选择条件做选择操作
      • 读取上一步中间文件,读取块数大
    • 作投影操作,选出需要的列

    第二中方式:

    • 根据Student.Sno = SC.Sno计算两个表的自然连接
      • 由于已经用条件筛选了,中间文件减小很多,写入块数较小
    • 从自然连接结果集中,根据SC.Sno = '2'做选择操作
      • 同样读取中间文件,读取块数较小
    • 投影输出

    第三种方式:

    • 根据SC.Sno == '2'SC表做选择操作
      • 对单个表用等值条件筛选了,一般来讲,结果集较小,不需要中间文件,直接存在内存中
    • 将第一步的结果集,与Student表根据Student.Sno = SC.Sno做自然连接
      • 不需要读中间文件
    • 投影输出

    总结一下这个例子的用意:

    • 说明了查询优化的必要性
    • 给出了查询优化方法的初步概念:有选择和连接操作时,应先执行选择操作,使下一步要操作的集合趋于更小
    • 上面三种方式,其实对应三个三个等价的代数表达式,显然前两个可以优化为第三个,从而引出下一节代数优化。

    9.3 代数优化

    代数优化策略是通过关系代数表达式的等价变换来提高查询效率的。

    9.3.1 关系代数表达式等价变换规则

    这一节列出了,11条等价变换规则,这里就不介绍了,有个概念就行。无非就是等价变换使整个执行代价越小越好。

    9.3.2 查询树的启发优化

    查询树就是执行的步骤。

    典型的启发式规则有:(启发式规则指大多数情况下都适用,但是不是在每种情况下都是最好的规则)

    • 选择运算应尽可能先做。
      • 能使计算的中间结果大大变小
    • 把投影运算和选择运算同时进行。
      • 把同一关系的投影运算和选择运算同时进行,避免重复扫描关系
    • 把投影桶其前或后的双目运算结合起来
      • 与第二条的目的类似
    • 把某些选择同在它前面要执行的笛卡儿积结合起来称为一个连接运算
      • 同样
    • 找出公共子表达式。
      • 把公共子表达式结果存为中间结果,从外存读取中间结果的时间一般会比重新计算一次少很多。

    9.4 物理优化

    对于一个查询语句有许多存取方案,它们的执行效率不同,有的会相差很大;物理优化就是要选择高效合理的操作算法或存取路径,求得优化的查询计划,达到查询优化的目标。

    物理优化方法有:

    • 基于规则的启发式优化。
    • 基于代价估算的优化。
    • 两者结合的优化方法。
      • 基于规则选取几种较优的候选方案,计算代价选出最优的方案。而不用计算所有的方案,较少代价估算的工作量。

    9.4.1 基于规则的启发式优化

    选择操作的启发式规则:

    • 对于小关系,适用全表扫描,即使选择列上有索引。
    • 对于大关系,启发式规则有:
      • 对于选择条件是“主码=值”的查询,查询结果最多是一个元组,可以选择主码索引。
      • 对于选择田间是“非主码=值”的查询,并且选择列上有索引,则要估算查询结果的元组数目,如果比例较小(<10%)可以使用索引扫描方法,否则还是适用全表顺序扫描。
        • 索引记录的使每个元组的指针,重复率较高时,需多次根据指针去读取相应元组
        • 而全表扫描,可以直接按存储顺序读取多个块(一个块包含多个元组)到内存中,所以重复率较高时,可能全表扫描更快。
      • 对于选择条件是属性上的非等值查询或者范围查询,并且选择列上有索引,处理方法与上一条相同
      • 对于用AND连接的合取条件
        • 如果有涉及这些属性的组合索引,则优先采用组合索引扫描方法
        • 如果某些属性上有一般索引,可参考上面9.1.2节中,索引扫描算法中的两种
      • 对于用OR连接的析取选择条件,一般使用全表扫描。

    连接操作的启发式规则:

    • 如果2个表都已经按照连接属性排序,则选用排序-合并算法。
    • 如果一个表在连接属性上有索引,则可以选用索引连接算法。
    • 如果上面2个规则都不适用,其中一个表较小。则可以选用hash join 算法
    • 如果可以选用嵌套循环算法,则应该选择较小地表作为外循环的表

    9.4.2 基于代价估算的优化

    与启发式规则优化比较:

    • 启发式规则优化:
      • 是定性的选择,比较粗糙;
      • 但是实现简单,而且优化本上的代价较小
      • 适合解释执行的系统。因为解释执行系统,其优化开销包含在查询总开销中
    • 代价估算优化
      • 是定量的选择,比较精细
      • 实现较复杂,需要根据统计信息做多次计算
      • 适合编译执行的系统,一次编译,多次执行,查询优化和查询执行是分开的。

    9.5 查询计划的执行

    查询优化完成之后,关系数据库管理系统为用户查询生成了一个查询计划。

    查询计划的执行可分为两种:

    • 自顶向下的执行方式
      • 是一种被动的、需求驱动的执行方式
    • 自底向上的执行方式
      • 是一种主动的执行方式

    转载于:https://www.cnblogs.com/wchaos/p/9726525.html

    展开全文
  • 查询优化一般可分为:代数优化(逻辑优化)、物理优化(非代数优化) 9.1 关系数据库系统的查询处理 概念:关系数据库管理系统执行查询语句的过程。 任务:是把用户提交给关系数据库的查询语句转换为高效的查询执行...
  • 查询处理

    2013-06-20 17:04:18
    一 概述: (一)查询处理步骤: 1.查询分析:对查询语句进行扫描、词法分析和语法分析。 2.查询检查:根据数据字典对合法的查询语句进行...按照优化层次一般可分为:代数优化和物理优化。详见查询优化。 4.查询执
  • 规范化的范式可分为第一范式、第二范式、第三范式、BCNF范式、第四范式和第五范式。一般来说,逻辑数据库设计会满足规范化的前3级标准,但由于满足第三范式的表结构容易维护且基本满足实际应用的要求。因此,实际应用...
  • 规范化的范式可分为第一范式、第二范式、第三范式、BCNF范式、第四范式和第五范式。一般来说,逻辑数据库设计会满足规范化的前3级标准,但由于满足第三范式的表结构容易维护且基本满足实际应用的要求。因此,实际应用...
  • 过程分为几个大的模块,首先是开始在浏览器端。 输入提示 从浏览器地址框输入一个 g ,浏览器会根据你的历史访问,书签等,给出输入建议,假如说我以前打开过 google.com,...
  • 这个时候查找时间复杂度就是 O(n), 这是不接受的。那怎么办呢? 问题出在了构建二叉查找树的时候,在插入和删除的时候会影响二叉查找树的形态,所以我们需要控制动态构建的这个二叉查找树࿰...
  • 使用redis缓存问题

    2020-10-27 17:37:05
    优化数据库io操作,一般分为两个层面,一是提高数据库sql本身的性能,二是尽量避免直接查询数据库。 提高数据库本身的性能首先是优化sql,包括:使用索引,减少不必要的大表关联次数,控制查询字段的行数和列数。...
  • MOLAP一般对数据存储有优化,并且进行部分预计算,因此查询性能最高。但通常对查询灵活性有限制。 MPP数据库是个完整的数据库,通常数据需要导入其中才能完成OLAP功能。MPP数据库在数据入库时对数据分布可以做...
  • 提高SQL SERVER运行速度的方法

    千次阅读 2007-07-22 16:59:00
    优化查询语句(视图、存储过程,其他一般查询SQL) 3。改进库结构设计,达到根本的解决常规性能低下的目的 4。分布式系统构架 5。确保高性能的服务器 索引的使用原则一、使用索引的优点: 1、通过唯一性索引(uniqu
  • 8. 管理员实现对用户的查询显示,模糊查询,删除,批量删除,全选和取消全选等功能;实现对图书的查询显示,模糊查询,添加,删除,批量删除,全选和取消全选等功能。 9. 普通用户实现借书和还书功能,借书...
  • mysql一:基本架构

    2020-07-10 10:07:42
    1、server层包括连接器、查询缓存、分析器、优化器、执行器 连接器:mysql -h$ip -P$port -u$user -p负责管理连接权限验证。 连接时间超过一定值没有操作会自动断开,默认为8h。 连接过程一般比较复杂,所以建议使用...
  • ·商品排行分为人气排行与热销排行,排行榜按类别,数量查询; ·强大的搜索强大搜索引擎,方便会员搜索商品,增加搜索关键字记录; ·会员分为两级:一般会员,VIP会员,享受不同的售价; ·针对单个商品自由评论,...
  • Server层:包含了连接器、查询缓存、分析器、优化器、执行器等,这里涵盖了MySQL的大多数核心功能区以及所有的内置函数。 内置函数:日期,时间,数学和加密函数等; 所有的跨存储引擎的功能都在这一层实现:存储...
  • 系统拥有强大的订单管理系统,如在线编辑生成的订单,对订单进行价格、数量的再修改,也删除订单中的某商品自动重新统计等,支持订单的多种查询与统计功能。  网趣网上购物系统结合多种SEO优化于一体,使您...
  • 十二、Helix Server服务器管理,设定规定的时间内让影片自动更换路径,彻底杜绝盗链,方便查询与操作Helix Server的会员点播日志,使服务器资源有如铜墙铁壁,坚不催。 十三、会员卡功能,后台生成点卡、包月...
  • 一卡通软件

    2015-03-11 16:15:22
    6) 设备添加完毕后,消费机默认名称为“消费机+设备编号”,如1号消费机则默认名字消费机1,建议所有消费机名称都修改好,比如1号窗、2号窗等,这样有利于优化报表查询,分类统计信息也更为丰富,为食堂老板提供有效...
  • 千里马酒店前台管理系统V7使用手册

    热门讨论 2011-06-16 14:09:38
    千里马V7.2采用MS-SQL SERVER 2000数据库系统,并充分利用了数据索引、查询优化、穿透查询等技术,为酒店业务处理提供了很好的稳定性和性能,保证了酒店在业务繁忙时段和高数据吞吐量时仍能使电脑系统的运作保持畅通...
  • 另外,AnySale以提高产品效率为突破口,用国际通用的项目管理方法,模块化、高效统一的内核编写模式,和独特的数据结构及最少化数据库查询设计,使得 AnySale 可以在极为繁忙的服务器环境下快速稳定运行,切实为企业...
  • 它以拥有一个非常完备的查询优化器而著称,其外部连接改善了查询性能,并支持多任务并行查询。 DB2具有很好的网络支持能力,每个子系统可以连接十几万个分布式用户,同时激活上千个活动线程,对大型分布式应用...
  • 如果编译耗时,可以根据run build查看每个模块的编译时间【也就是找出编译耗时所在,作为程序员不仅要知道编译为何时间长,还要找出那个地方编译时间长】,所有组件(初基础公共组件外)均和主工程app解绑。...
  •  本书非常适合ASP.NET网站项目开发人员、ASP.NET初学者及编程爱好者使用,同时也作为培训机构、大中专院校老师和学生的实践参考用书。 目 录 第1篇 ASP.NET网站高效开发篇 第1章 ASP.NET网站开发常备技术 1.1...
  •  本书非常适合ASP.NET网站项目开发人员、ASP.NET初学者及编程爱好者使用,同时也作为培训机构、大中专院校老师和学生的实践参考用书。 目 录 第1篇 ASP.NET网站高效开发篇 第1章 ASP.NET网站开发常备技术 1.1...

空空如也

空空如也

1 2 3 4 5 6
收藏数 102
精华内容 40
关键字:

查询优化一般可分为