当前位置:文档之家› 第1章 性能调整综述

第1章 性能调整综述

第1章 性能调整综述
第1章 性能调整综述

第1章性能调整综述

Oracle数据库是高度可调的数据库产品。本章描述调整的过程和那些人员应与Oracle服务器的调整有关,以及与调整相关联的操作系统硬件和软件。本章包括以下方面:

l 谁来调整系统?

l 什么时候调整?

l 建立有效调整的目标

l 在设计和开发时的调整

l 调整产品系统

l 监控产品系统

谁来调整系统:

为了有效地调整系统,若干类人员必须交换信息并牵涉到系统调整中,例如: l 应用设计人员必须传达应用系统的设计,使得每个人都清楚应用中的数据流动.

l 应用开发人员必须传达他们选择的实现策略,使得语句调整的过程中能快速、容易地识别有问题的应用模块和可疑的SQL语句.

l 数据库管理人员必须仔细地监控系统活动并提供它们的资料,使得异常的系统性能可被快速得识别和纠正.

l 硬件/软件管理人员必须传达系统的硬件、软件配置并提供它们的资料,使得相关人员能有效地设计和管理系统。

简而言之,与系统涉及的每个人都在调整过程中起某些作用,当上面提及的那些人员传达了系统的特性并提供了它们的资料,调整就能相对的容易和更快一些。

不幸的是,事实上的结果是:数据库管理员对调整负有全部或主要的责任。但是,数据库管理员很少有合适的系统方面的资料,而且,在很多情况下,数据库管理员往往是在实施阶段才介入数据库,这就给调整工作带来许多负面的影响,因为在设计阶段的缺陷是不能通过DBA的调整而得以解决,而设计阶段的缺陷往往对数据库性能造成极大的影响。

其实,在真正成熟的开发环境下,开发人员作为纯代码编写人员时,对性能的影响最小,此时大部分的工作应由应用设计人员完成,而且数据库管理员往往在前期的需求管理阶段就介入,为设计人员提供必要的技术支持。

调整并不是数据库管理员的专利,相反大部分应该是设计人员和开发人员的工作,这就需要设计人员和开发人员具体必要的数据库知识,这样才能组成一个高效的团队,然而事实上往往并非如此。

什么时候作调整?

多数人认为当用户感觉性能差时才进行调整,这对调整过程中使用某些最有效的调整策略来说往往是太迟了。此时,如果你不愿意重新设计应用的话,你只能通过重新分配内存(调整SGA)和调整I/O的办法或多或少地提高性能。Oracle提供了许多特性,这些特性只有应用到正确地设计的系统中时才能够很

大地提高性能。

应用设计人员需要在设计阶段设置应用的性能期望值。然后在设计和开发期间,应用设计人员应考虑哪些Oracle 特性可以对系统有好处,并使用这些特性。

通过良好的系统设计,你就可以在应用的生命周期中消除性能调整的代价和挫折。图1-1图1-2说明在应用的生命周期中调整的相对代价和收益,正如你见到的,最有效的调整时间是在设计阶段。在设计期间的调整能以最低的代价给你最大的收益。

图1-1 在应用生命周期中调整的代价

图1-2 在应用生命周期中调整的收益

当然,即使在设计很好的系统中,也可能有性能降低。但这些性能降低应该是可控的和可以预见的。

调整目标

不管你正在设计或维护系统,你应该建立专门的性能目标,它使你知道何时要作调整。如果你试图胡乱地改动初始化参数或SQl 语句,你可能会浪费调整系统的时间,而且无什么大的收益。调整你的系统的最有效方法如下:

l 当设计系统时考虑性能

l 调整操作系统的硬件和软件

l 识别性能瓶颈

l 确定问题的原因

l 采取纠正的动作

当你设计系统时,制定专门的目标;例如,响应时间小于3秒。当应用不能满足此目标时,识别造成变慢的瓶颈(例如,I/O竞争),确定原因,采取纠正动作。在开发期间,你应测试应用研究,确定在采取应用之前是否满足设计的性能目标。

当你正在维护生产库系统时,有多种快速有效的方法来识别性能瓶颈。

不管怎样,调整通常是一系列开销。一旦你已确定了瓶颈,你可能要牺牲一些其它方面的指标来达到所要的结果。例如,如果I/O有问题,你可能需要更多内存或磁盘。如果不可能买,你可能要限制系统的并发性,来获取所需的性能。然而,如果你已经明确地定义了性能的目标,那用什么来交换高性能的决策就变的很容易的,因为你已经确定了哪些方面是最重要的,如过我的目标为高性能,可能牺牲一些空间资源。

随着应用的越来越庞大,硬件性能的提高,全面的调整应用逐渐变成代价高昂的行为,在这样情况下,要取得最大的投入/效率之比,较好的办法是调整应用的关键部分,使其达到比较高的性能,这样从总体上来说,整个系统的性能

也是比较高的。这也就是有名的20/80原则,调整应用的20%(关键部分),能解决80%的问题。

在设计和开发系统时作调整

良好设计的系统可以防止在应用生命周期中产生性能问题。系统设计人员和应用开发人员必须了解Oracle的查询处理机制以便写出高效的SQL语句。“第2章有效的应用设计”讨论了你的系统中各种可用的配置,以及每种配置更适合哪种类型的应用。“第5章优化器”讨论了Oracle的查询优化器,以及如何写语句以获取最快的结果。

当设计你的系统时,使用下列优化性能的准则:

l 消除客户机/服务器应用中不必要的网络传输。-- 使用存储过程。

l 使用适合你系统的相应Oracle服务器选件(例如,并行查询或分布式数据库)。

l 除非你的应用有特殊的需要,否则使用缺省的Oracle锁。

l 利用数据库记住应用模块,以便你能以每个模块为基础来追踪性能。l 选择你的数据块的最佳大小。 -- 原则上来说大一些的性能较好。

l 分布你的数据,使得一个节点使用的数据本地存贮在该节点中。

调整产品系统

本节描述对应用系统快速、容易地找出性能瓶颈,并决定纠正动作的方法。这种方法依赖于对Oracle服务器体系结构和特性的了解程度。在试图调整你的系统前,你应熟悉Oracle调整的内容。

为调整你已有的系统,遵从下列步骤:

l 调整操作系统的硬件和软件

l 通过查询V $SESSION_WAIT视图,识别性能的瓶颈,这个动态性能视图列出了造成会话(session)等待的事件。

l 通过分析V $SESSION_WAIT中的数据,决定瓶颈的原因。

l 纠正存在的问题。

监控应用系统

这主要是通过监控oracle的动态视图来完成。

各种有用的动态视图:如v$session_wait, v$session_event等。

第2章有效的应用设计

我们通常将最常用的应用分为2种类型:联机事务处理类型(OLTP),决策支持系统(DSS)。

联机事务处理(OLTP)

该类型的应用是高吞吐量,插入、更新、删除操作比较多的系统,这些系统以不断增长的大容量数据为特征,它们提供给成百用户同时存取,典型的OLTP系统是订票系统,银行的业务系统,订单系统。OTLP的主要目标是可用性、

速度、并发性和可恢复性。

当设计这类系统时,必须确保大量的并发用户不能干扰系统的性能。还需要避免使用过量的索引与cluster 表,因为这些结构会使插入和更新操作变慢。

决策支持(DSS)

该类型的应用将大量信息进行提取形成报告,协助决策者作出正确的判断。典型的情况是:决策支持系统将OLTP应用收集的大量数据进行查询。典型的应用为客户行为分析系统(超市,保险等)。

决策支持的关键目标是速度、精确性和可用性。

该种类型的设计往往与OLTP设计的理念背道而驰,一般建议使用数据冗余、大量索引、cluster table、并行查询等。

近年来,该类型的应用逐渐与OLAP、数据仓库紧密的联系在一起,形成的一个新的应用方向。

第3章 SQL语句处理的过程

在调整之前我们需要了解一些背景知识,只有知道这些背景知识,我们才能更好的去调整sql语句。

本节介绍了SQL语句处理的基本过程,主要包括:

·查询语句处理

· DML语句处理(insert, update, delete)

· DDL 语句处理(create .. , drop .. , alter .. , )

·事务控制(commit, rollback)

SQL 语句的执行过程(SQL Statement Execution)

图3-1 概要的列出了处理和运行一个sql语句的需要各个重要阶段。在某些情况下,Oracle运行sql的过程可能与下面列出的各个阶段的顺序有所不同。如DEFINE阶段可能在FETCH阶段之前,这主要依赖你如何书写代码。

对许多oracle的工具来说,其中某些阶段会自动执行。绝大多数用户不需要关心各个阶段的细节问题,然而,知道执行的各个阶段还是有必要的,这会帮助你写出更高效的SQL语句来,而且还可以让你猜测出性能差的SQL语句主要是由于哪一个阶段造成的,然后我们针对这个具体的阶段,找出解决的办法。

图 3-1 SQL语句处理的各个阶段

DML语句的处理

本节给出一个例子来说明在DML语句处理的各个阶段到底发生了什么事情。

假设你使用Pro*C程序来为指定部门的所有职员增加工资。程序已经连到正确的用户,你可以在你的程序中嵌入如下的SQL语句:

EXEC SQL UPDATE employees

SET salary = 1.10 * salary

WHERE department_id = :var_department_id;

var_department_id是程序变量,里面包含部门号,我们要修改该部门的职员的工资。当这个SQL语句执行时,使用该变量的值。

每种类型的语句都需要如下阶段:

·第1步: Create a Cursor 创建游标

·第2步: Parse the Statement 分析语句

·第5步: Bind Any Variables 绑定变量

·第7步: Run the Statement 运行语句

·第9步: Close the Cursor 关闭游标

如果使用了并行功能,还会包含下面这个阶段:

·第6步: Parallelize the Statement 并行执行语句

如果是查询语句,则需要以下几个额外的步骤,如图 3所示:

·第3步: Describe Results of a Query 描述查询的结果集

·第4步: Define Output of a Query 定义查询的输出数据·第8步: Fetch Rows of a Query 取查询出来的行

下面具体说一下每一步中都发生了什么事情:.

第1步: 创建游标(Create a Cursor)

由程序接口调用创建一个游标(cursor)。任何SQL语句都会创建它,特别在运行DML语句时,都是自动创建游标的,不需要开发人员干预。多数应用中,游标的创建是自动的。然而,在预编译程序(pro*c)中游标的创建,可能是隐含的,也可能显式的创建。在存储过程中也是这样的。

第2步:分析语句(Parse the Statement)

在语法分析期间,SQL语句从用户进程传送到Oracle,SQL语句经语法分析后,SQL语句本身与分析的信息都被装入到共享SQL区。在该阶段中,可以解决许多类型的错误。

语法分析分别执行下列操作:

l 翻译SQL语句,验证它是合法的语句,即书写正确

l 实现数据字典的查找,以验证是否符合表和列的定义

l 在所要求的对象上获取语法分析锁,使得在语句的语法分析过程中不改变这些对象的定义

l 验证为存取所涉及的模式对象所需的权限是否满足

l 决定此语句最佳的执行计划

l 将它装入共享SQL区

l 对分布的语句来说,把语句的全部或部分路由到包含所涉及数据的远程节点

以上任何一步出现错误,都将导致语句报错,中止执行。

只有在共享池中不存在等价SQL语句的情况下,才对SQL语句作语法分析。在这种情况下,数据库内核重新为该语句分配新的共享SQL区,并对语句进行语法分析。进行语法分析需要耗费较多的资源,所以要尽量避免进行语法分析,这

是优化的技巧之一。

语法分析阶段包含了不管此语句将执行多少次,而只需分析一次的处理要求。Oracle只对每个SQL语句翻译一次,在以后再次执行该语句时,只要该语句还在共享SQL区中,就可以避免对该语句重新进行语法分析,也就是此时可以直接使用其对应的执行计划对数据进行存取。这主要是通过绑定变量(bind variable)实现的,也就是我们常说的共享SQL,后面会给出共享SQL的概念。

虽然语法分析验证了SQL语句的正确性,但语法分析只能识别在SQL语句执行之前所能发现的错误(如书写错误、权限不足等)。因此,有些错误通过语法分析是抓不到的。例如,在数据转换中的错误或在数据中的错(如企图在主键中插入重复的值)以及死锁等均是只有在语句执行阶段期间才能遇到和报告的错误或情况。

查询语句的处理

查询与其它类型的SQL语句不同,因为在成功执行后作为结果将返回数据。其它语句只是简单地返回成功或失败,而查询则能返回一行或许多行数据。查询的结果均采用表格形式,结果行被一次一行或者批量地被检索出来。从这里我们可以得知批量的fetch数据可以降低网络开销,所以批量的fetch也是优化的技巧之一。

有些问题只与查询处理相关,查询不仅仅指SELECT语句,同样也包括在其它SQL语句中的隐含查询。例如,下面的每个语句都需要把查询作为它执行的一部分:

INSERT INTO table SELECT...

UPDATE table SET x = y WHERE...

DELETE FROM table WHERE...

CREATE table AS SELECT...

具体来说,查询

·要求读一致性

·可能使用回滚段作中间处理

·可能要求SQL语句处理描述、定义和取数据阶段

第3步: 描述查询结果(Describe Results of a Query)

描述阶段只有在查询结果的各个列是未知时才需要;例如,当查询由用户交互地输入需要输出的列名。在这种情况要用描述阶段来决定查询结果的特征(数据类型,长度和名字)。

第4步: 定义查询的输出数据(Define Output of a Query)

在查询的定义阶段,你指定与查询出的列值对应的接收变量的位置、大小和数据类型,这样我们通过接收变量就可以得到查询结果。如果必要的话,Oracle会自动实现数据类型的转换。这是将接收变量的类型与对应的列类型相比较决定的。

第5步: 绑定变量(Bind Any Variables)

此时,Oracle知道了SQL语句的意思,但仍没有足够的信息用于执行该语句。Oracle 需要得到在语句中列出的所有变量的值。在该例中,Oracle需要得到对department_id列进行限定的值。得到这个值的过程就叫绑定变量(binding variables)

此过程称之为将变量值捆绑进来。程序必须指出可以找到该数值的变量名(该变量被称为捆绑变量,变量名实质上是一个内存地址,相当于指针)。应用的最终用户可能并没有发觉他们正在指定捆绑变量,因为Oracle 的程序可能只是简单地指示他们输入新的值,其实这一切都在程序中自动做了。

因为你指定了变量名,在你再次执行之前无须重新捆绑变量。你可以改变绑定变量的值,而Oracle在每次执行时,仅仅使用内存地址来查找此值。

如果Oracle 需要实现自动数据类型转换的话(除非它们是隐含的或缺省的),你还必须对每个值指定数据类型和长度。关于这些信息可以参考oracle 的相关文档,如Oracle Call Interface Programmer's Guide

第6步: 并行执行语句(Parallelize the Statement )

ORACLE 可以在SELECTs, INSERTs, UPDATEs, MERGEs, DELETEs语句中执行相应并行查询操作,对于某些DDL操作,如创建索引、用子查询创建表、在分区表上的操作,也可以执行并行操作。并行化可以导致多个服务器进程(oracle server processes)为同一个SQL语句工作,使该SQL语句可以快速完成,但是会耗费更多的资源,所以除非很有必要,否则不要使用并行查询。

第7步: 执行语句(Run the Statement)

到了现在这个时候,Oracle拥有所有需要的信息与资源,因此可以真正运行SQL语句了。如果该语句为SELECT查询或INSERT语句,则不需要锁定任何行,因为没有数据需要被改变。然而,如果语句为UPDATE或DELETE语句,则该语句影响的所有行都被锁定,防止该用户提交或回滚之前,别的用户对这些数据进行修改。这保证了数据的一致性。

对于某些语句,你可以指定执行的次数,这称为批处理(array processing)。指定执行N次,则绑定变量与定义变量被定义为大小为N的数组的开始位置,这种方法可以减少网络开销,也是优化的技巧之一。

第8步: 取出查询的行(Fetch Rows of a Query)

在fetch阶段,行数据被取出来,每个后续的存取操作检索结果集中的下一行数据,直到最后一行被取出来。上面提到过,批量的fetch是优化的技巧之一。

第9步: 关闭游标(Close the Cursor)

SQL语句处理的最后一个阶段就是关闭游标

DDL语句的处理(DDL Statement Processing)

DDL语句的执行不同与DML语句和查询语句的执行,这是因为DDL语句执行成功后需要对数据字典数据进行修改。对于DDL语句,语句的分析阶段实际上包括分析、查找数据字典信息和执行。

事务管理语句、会话管理语句、系统管理语句只有分析与执行阶段,为了重新执行该语句,会重新分析与执行该语句。

事务控制(Control of Transactions)

一般来说,只有使用ORACLE编程接口的应用设计人员才关心操作的类型,并把相关的操作组织在一起,形成一个事务。一般来说,我门必须定义事务,这样在一个逻辑单元中的所有工作可以同时被提交或回滚,保证了数据的一致性。一个事务应该由逻辑单元中的所有必须部分组成,不应该多一个,也不应该少一个。

·在事务开始和结束的这段时间内,所有被引用表中的数据都应该在一致的状态(或可以被回溯到一致的状态)

·事务应该只包含可以对数据进行一致更改(one consistent change to the data)的SQL语句

例如,在两个帐号之间的转帐(这是一个事务或逻辑工作单元),应该包含从一个帐号中借钱(由一个SQL完成),然后将借的钱存入另一个帐号(由另一个SQL完成)。这2个操作作为一个逻辑单元,应该同时成功或同时失败。其它不相关的操作,如向一个帐户中存钱,不应该包含在这个转帐事务中。

在设计应用时,除了需要决定哪种类型的操作组成一个事务外,还需要决定使用BEGIN_DISCRETE_TRANSACTIO存储过程是否对提高小的、非分布式的事务的性能有作用。

第4章 ORACLE的优化器

优化器有时也被称为查询优化器,这是因为查询是影响数据库性能最主要的部分,不要以为只有SELECT语句是查询。实际上,带有任何WHERE条件的DML(INSERT、UPDATE、DELETE)语句中都包含查询要求,在后面的文章中,当说到查询时,不一定只是指SELECT语句,也有可能指DML语句中的查询部分。优化器是所有关系数据库引擎中的最神秘、最富挑战性的部件之一,从性能的角度看也是最重要的部分,它性能的高低直接关系到数据库性能的好坏。

我们知道,SQL语句同其它语言(如C语言)的语句不一样,它是非过程化(non-procedural)的语句,即当你要取数据时,不需要告诉数据库通过何种途径去取数据,如到底是通过索引取数据,还是应该将表中的每行数据都取出来,然后再通过一一比较的方式取数据(即全表扫描),这是由数据库的优化器决定的,这就是非过程化的含义,也就是说,如何取数据是由优化器决定,而不是应用开发者通过编程决定。在处理SQL的SELECT、UPDATE、INSERT或DELETE语句时,Oracle 必须访问语句所涉及的数据,Oracle的优化器部分用来决定访问数据的有效路径,使得语句执行所需的I/O和处理时间最小。

为了实现一个查询,内核必须为每个查询定制一个查询策略,或为取出符合条件的数据生成一个执行计划(execution plan)。典型的,对于同一个查询,可能有几个执行计划都符合要求,都能得到符合条件的数据。例如,参与连接的表可以有多种不同的连接方法,这取决于连接条件和优化器采用的连接方法。为了在多个执行计划中选择最优的执行计划,优化器必须使用一些实际的指标来衡量每个执行计划使用的资源(I/0次数、CPU等),这些资源也就是我们所说的代价(cost)。如果一个执行计划使用的资源多,我们就说使用执行计划的代价大。以执行计划的代价大小作为衡量标准,优化器选择代价最小的执行计划作为真正执行该查询的执行计划,并抛弃其它的执行计划。

在ORACLE的发展过程中,一共开发过2种类型的优化器:基于规则的优化器和基于代价的优化器。这2种优化器的不同之处关键在于:取得代价的方法与衡量代价的大小不同。现对每种优化器做一下简单的介绍:

基于规则的优化器 -- Rule Based (Heuristic) Optimization(简称RBO):在ORACLE7之前,主要是使用基于规则的优化器。ORACLE在基于规则的优化器中采用启发式的方法(Heuristic Approach)或规则(Rules)来生成执行计划。例如,如果一个查询的where条件(where clause)包含一个谓词(predicate,其实就是一个判断条件,如”=”, “>”, ”<”等),而且该谓词上引用的列上有有效索引,那么优化器将使用索引访问这个表,而不考虑其它因素,如表中数据的多少、表中数据的易变性、索引的可选择性等。此时数据库中没有关于表与索引数据的统计性描述,如表中有多上行,每行的可选择性等。优化器也不考虑实例参数,如multi block i/o、可用排序内存的大小等,所以优化器有时就选择了次优化的计划作为真正的执行计划,导致系统性能不高。

如,对于

select * from emp where deptno = 10;

这个查询来说,如果是使用基于规则的优化器,而且deptno列上有有效的索引,则会通过deptno列上的索引来访问emp表。在绝大多数情况下,这是比较高效的,但是在一些特殊情况下,使用索引访问也有比较低效的时候,现举例说明:

1) emp表比较小,该表的数据只存放在几个数据块中。此时使用全表扫描比使用索引访问emp表反而要好。因为表比较小,极有可能数据全在内存中,所以此时做全表扫描是最快的。而如果使用索引扫描,需要先从索引中找到符合条件记录的rowid,然后再一一根据这些rowid从emp中将数据取出来,在这种条件下,效率就会比全表扫描的效率要差一些。

2) emp表比较大时,而且deptno = 10条件能查询出表中大部分的数据如(50%)。如该表共有4000万行数据,共放在有500000个数据块中,每个数据块为8k,则该表共有约4G,则这么多的数据不可能全放在内存中,绝大多数需要放在硬盘上。此时如果该查询通过索引查询,则是你梦魇的开始。

db_file_multiblock_read_count参数的值200。如果采用全表扫描,则需要500000/db_file_multiblock_read_count=500000/200=2500次I/O。但是如果采用索引扫描,假设deptno列上的索引都已经cache到内存中,所以可以将访问

索引的开销忽略不计。因为要读出4000万x 50% = 2000万数据,假设在读这2000万数据时,有99.9%的命中率,则还是需要20000次I/O,比上面的全表扫描需要的2500次多多了,所以在这种情况下,用索引扫描反而性能会差很多。在这样的情况下,用全表扫描的时间是固定的,但是用索引扫描的时间会随着选出数据的增多使查询时间相应的延长。

上面是枯燥的假设数据,现在以具体的实例给予验证:

环境: oracle 817 + linux + 阵列柜,表SWD_BILLDETAIL有3200多万数据;

表的id列、cn列上都有索引

经查看执行计划,发现执行select count(id) from SWD_BILLDETAIL;使用全表扫描,执行完用了大约1.50分钟(4次执行取平均,每次分别为1.45 1.51 2.00 1.46)。而执行select count(id) from SWD_BILLDETAIL where cn <'6';却用了2个小时还没有执行完,经分析该语句使用了cn列上的索引,然后利用查询出的rowid再从表中查询数据。我为什么不使用select count(cn) from SWD_BILLDETAIL where cn <'6';呢?后面在分析执行路径的索引扫描时时会给出说明。

下面就是基于规则的优化器使用的执行路径与各个路径对应的等级: RBO Path 1: Single Row by Rowid(等级最高)

RBO Path 2: Single Row by Cluster Join

RBO Path 3: Single Row by Hash Cluster Key with Unique or Primary Key

RBO Path 4: Single Row by Unique or Primary Key

RBO Path 5: Clustered Join

RBO Path 6: Hash Cluster Key

RBO Path 7: Indexed Cluster Key

RBO Path 8: Composite Index

RBO Path 9: Single-Column Indexes

RBO Path 10: Bounded Range Search on Indexed Columns

RBO Path 11: Unbounded Range Search on Indexed Columns

RBO Path 12: Sort Merge Join

RBO Path 13: MAX or MIN of Indexed Column

RBO Path 14: ORDER BY on Indexed Column

RBO Path 15: Full Table Scan(等级最低)

上面的执行路径中,RBO认为越往下执行的代价越大,即等级越低。在RBO生成执行计划时,如果它发现有等级高的执行路径可用,则肯定会使用等级高的路径,而不管任何其它影响性能的元素,即RBO通过上面的路径的等级决定执行路径的代价,执行路径的等级越高,则使用该执行路径的代价越小。如上面2个例子所述,如果使用RBO,则肯定使用索引访问表,也就是选择了比较差的执行计划,这样会给数据库性能带来很大的负面影响。为了解决这个问题,从ORACLE 7开始oracle引入了基于代价的优化器,下面给出了介绍。

基于代价的优化器 -- Cost Based Optimization(简称CBO)

Oracle把一个代价引擎(Cost Engine)集成到数据库内核中,用来估计每个执行计划需要的代价,该代价将每个执行计划所耗费的资源进行量化,从而CBO可以根据这个代价选择出最优的执行计划。一个查询耗费的资源可以被分成3个基本组成部分:I/O代价、CPU代价、network代价。I/O代价是将数据从磁盘读入内存所需的代价。访问数据包括将数据文件中数据块的内容读入到SGA

的数据高速缓存中,在一般情况下,该代价是处理一个查询所需要的最主要代价,所以我们在优化时,一个基本原则就是降低查询所产生的I/O总次数。CPU代价是处理在内存中数据所需要的代价,如一旦数据被读入内存,则我们在识别出我们需要的数据后,在这些数据上执行排序(sort)或连接(join)操作,这需要耗费CPU资源。

对于需要访问跨节点(即通常说的服务器)数据库上数据的查询来说,存在network代价,用来量化传输操作耗费的资源。查询远程表的查询或执行分布式连接的查询会在network代价方面花费比较大。

在使用CBO时,需要有表和索引的统计数据(分析数据)作为基础数据,有了这些数据,CBO才能为各个执行计划计算出相对准确的代价,从而使CBO选择最佳的执行计划。所以定期的对表、索引进行分析是绝对必要的,这样才能使统计数据反映数据库中的真实情况。否则就会使CBO选择较差的执行计划,影响数据库的性能。分析操作不必做的太频繁,一般来说,每星期一次就足够了。切记如果想使用CBO,则必须定期对表和索引进行分析。

对于分析用的命令,随着数据库版本的升级,用的命令也发生了变换,在oracle 8i以前,主要是用ANALYZE命令。在ORACLE 8I以后,又引入了DBMS_STATS存储包来进行分析。幸运的是从ORACLE 10G以后,分析工作变成自动的了,这减轻的DBA的负担,不过在一些特殊情况下,还需要一些手工分析。

如果采用了CBO优化器,而没有对表和索引进行分析,没有统计数据,则ORACLE使用缺省的统计数据(至少在ORACLE 9I中是这样),这可以从oracle 的文档上找到。使用的缺省值肯定与系统的实际统计值不一致,这可能会导致优化器选择错误的执行计划,影响数据库的性能。

要注意的是:虽然CBO的功能随着ORACLE新版本的推出,功能越来越强,但它不是能包治百病的神药,否则就不再需要DBA了,那我就惨了!!!实际上任何一个语句,随着硬件环境与应用数据的不同,该语句的执行计划可能需要随之发生变化,这样才能取得最好的性能。所以有时候不在具体的环境下而进行SQL性能调整是徒劳的。

在ORACLE8I推出的时候,ORACLE极力建议大家使用CBO,说CBO有种种好处,但是在那是ORACLE开发的应用系统还是使用基于规则的优化器,从这件事上我们可以得出这样的结论:1) 如果团队的数据库水平很高而且都熟悉应用数据的特点,RBO也可以取得很好的性能。2)CBO不是很稳定,但是一个比较有前途的优化器,Oracle极力建议大家用是为了让大家尽快发现它的BUG,以便

进一步改善,但是ORACLE为了对自己开发的应用系统负责,他们还是使用了比较熟悉而且成熟的RBO。从这个事情上给我们的启发就是:我们在以后的开发中,应该尽量采用我们熟悉并且成熟的技术,而不要一味的采用新技术,一味采用新技术并不一定能开发出好的产品。幸运的是从ORACLE 10G后,CBO已经足够的强大与智能,大家可以放心的使用该技术,因为ORACLE 10G后,Oracle自己开发的应用系统也使用CBO优化器了。而且ORACLE规定,从ORACLE 10G开始,开始废弃RBO优化器。这句话并不是指在ORACLE 10G中不能使用RBO,而是从ORACLE 10G开始开始,不再为RBO的BUG提供修补服务。

在上面的第2个例子中,如果采用CBO优化器,它就会考虑emp表的行数,deptno列的统计数据,发现对该列做查询会查询出过多的数据,并且考虑db_file_multiblock_read_count参数的设置,发现用全表扫描的代价比用索引扫描的代价要小,从而使用全表扫描从而取得良好的执行性能。

判断当前数据库使用何种优化器:

主要是由optimizer_mode初始化参数决定的。该参数可能的取值为:first_rows_[1 | 10 | 100 | 1000] | first_rows | all_rows | choose | rule。具体解释如下:

RULE为使用RBO优化器。

CHOOSE则是根据实际情况,如果数据字典中包含被引用的表的统计数据,即引用的对象已经被分析,则就使用CBO优化器,否则为RBO优化器。

ALL_ROWS为CBO优化器使用的第一种具体的优化方法,是以数据的吞吐量为主要目标,以便可以使用最少的资源完成语句。

FIRST_ROWS为优化器使用的第二种具体的优化方法,是以数据的响应时间为主要目标,以便快速查询出开始的几行数据。

FIRST_ROWS_[1 | 10 | 100 | 1000] 为优化器使用的第三种具体的优化方法,让优化器选择一个能够把响应时间减到最小的查询执行计划,以迅速产生查询结果的前 n 行。该参数为ORACLE 9I新引入的。

从ORACLE V7以来,optimizer_mode参数的缺省设置应是"choose",即如果对已分析的表查询的话选择CBO,否则选择RBO。在此种设置中,如果采用了CBO,则缺省为CBO中的all_rows模式。

注意:即使指定数据库使用RBO优化器,但有时ORACLE数据库还是会采用CBO优化器,这并不是ORACLE的BUG,主要是由于从ORACLE 8I后引入的许多新特性都必须在CBO下才能使用,而你的SQL语句可能正好使用了这些新特性,此时数据库会自动转为使用CBO优化器执行这些语句。

什么是优化

优化是选择最有效的执行计划来执行SQL语句的过程,这是在处理任何数据的语句(SELECT,INSERT,UPDATE或DELETE)中的一个重要步骤。对Oracle 来说,执行这样的语句有许多不同的方法,譬如说,将随着以什么顺序访问哪些表或索引的不同而不同。所使用的执行计划可以决定语句能执行得有多快。

Oracle中称之为优化器(Optimizer)的组件用来选择这种它认为最有效的执行计划。

由于一系列因素都会会影响语句的执行,优化器综合权衡各个因素,在众多的执行计划中选择认为是最佳的执行计划。然而,应用设计人员通常比优化器更知道关于特定应用的数据特点。无论优化器多么智能,在某些情况下开发人员能选择出比优化器选择的最优执行计划还要好的执行计划。这是需要人工干预数据库优化的主要原因。事实表明,在某些情况下,确实需要DBA对某些语句进行手工优化。

注:从Oracle的一个版本到另一个版本,优化器可能对同一语句生成不同的执行计划。在将来的Oracle 版本中,优化器可能会基于它可以用的更好、更理想的信息,作出更优的决策,从而导致为语句产生更优的执行计划。

第5章ORACLE的执行计划

背景知识:

为了更好的进行下面的内容我们必须了解一些概念性的术语:

共享sql语句

为了不重复解析相同的SQL语句(因为解析操作比较费资源,会导致性能下降),在第一次解析之后,ORACLE将SQL语句及解析后得到的执行计划存放在内存中。这块位于系统全局区域SGA(system global area)的共享池(shared buffer pool)中的内存可以被所有的数据库用户共享。因此,当你执行一个SQL语句(有时被称为一个游标)时,如果该语句和之前的执行过的某一语句完全相同,并且之前执行的该语句与其执行计划仍然在内存中存在,则ORACLE就不需要再进行分析,直接得到该语句的执行路径。ORACLE的这个功能大大地提高了SQL的执行性能并大大节省了内存的使用。使用这个功能的关键是将执行过的语句尽可能放到内存中,所以这要求有大的共享池(通过设置shared buffer pool参数值)和尽可能的使用绑定变量的方法执行SQL语句。

当你向ORACLE 提交一个SQL语句,ORACLE会首先在共享内存中查找是否有相同的语句。这里需要注明的是,ORACLE对两者采取的是一种严格匹配,要达成共享,SQL语句必须完全相同(包括空格,换行等)。

下面是判断SQL语句是否与共享内存中某一SQL相同的步骤:

1). 对所发出语句的文本串进行hashed。如果hash值与已在共享池中SQL语句的hash值相同,则进行第2步:

2) 将所发出语句的文本串(包括大小写、空白和注释)与在第1步中识别的所有

已存在的SQL语句相比较。

例如:

SELECT * FROM emp WHERE empno = 1000;

和下列每一个都不同

SELECT * from emp WHERE empno = 1000;

SELECT * FROM EMP WHERE empno = 1000;

SELECT * FROM emp WHERE empno = 2000;

在上面的语句中列值都是直接SQL语句中的,今后我们将这类sql成为硬编码SQL 或字面值SQL

使用绑定变量的SQL语句中必须使用相同的名字的绑定变量(bind variables) ,

例如:

a. 该2个sql语句被认为相同

select pin , name from people where pin = :blk1.pin;

select pin , name from people where pin = :blk1.pin;

b. 该2个sql语句被认为不相同

select pin , name from people where pin = :blk1.ot_ind;

select pin , name from people where pin = :blk1.ov_ind;

今后我们将上面的这类语句称为绑定变量SQL。

3). 将所发出语句中涉及的对象与第2步中识别的已存在语句所涉及对象相比较。

例如:

如用户user1与用户user2下都有EMP表,则

用户user1发出的语句:SELECT * FROM EMP; 与

用户user2发出的语句:SELECT * FROM EMP; 被认为是不相同的语句,

因为两个语句中引用的EMP不是指同一个表。

4). 在SQL语句中使用的捆绑变量的捆绑类型必须一致。

如果语句与当前在共享池中的另一个语句是等同的话,Oracle并不对它进行语法分析。而直接执行该语句,提高了执行效率,因为语法分析比较耗费资源。

注意的是,从oracle 8i开始,新引入了一个CURSOR_SHARING参数,该参数的主要目的就是为了解决在编程过程中已大量使用的硬编码SQL问题。因为在实际开发中,很多程序人员为了提高开发速度,而采用类似下面的开发方法:

str_sql string;

int_empno int;

int_empno = 2000;

str_sql = ‘SELECT * FROM emp WHERE empno = ‘ + int_empno;

…………

int_empno = 1000;

str_sql = ‘SELECT * FROM emp WHERE empno = ‘ + int_empno;

上面的代码实际上使用了硬编码SQL,使我们不能使用共享SQL的功能,结果是数据库效率不高。但是从上面的2个语句来看,产生的硬编码SQL只是列值不同,其它部分都是相同的,如果仅仅因为列值不同而导致这2个语句不能共享是很可惜的,为了解决这个问题,引入了CURSOR_SHARING参数,使这类问题也可以使用共享SQL,从而使这样的开发也可以利用共享SQL功能。听起来不错,ORACLE真为用户着想,使用户在不改变代码的情况下还可以利用共享SQL的功能。真的如此吗?天上不会无缘无故的掉一个馅饼的,ORACLE对该参数的使用做了说明,建议在经过实际测试后再改该参数的值(缺省情况下,该参数的值为EXACT,语句完全一致才使用共享SQL)。因为有可能该变该值后,你的硬编码SQL是可以使用共享SQL了,但数据库的性能反而会下降。我在实际应用中已经遇

到这种情况。所以建议编写需要稳定运行程序的开发人员最好还是一开始就使用绑定变量的SQL。

Rowid的概念:

rowid是一个伪列,既然是伪列,那么这个列就不是用户定义,而是系统自己给加上的。对每个表都有一个rowid的伪列,但是表中并不物理存储ROWID列的值。不过你可以像使用其它列那样使用它,但是不能删除改列,也不能对该列的值进行修改、插入。一旦一行数据插入数据库,则rowid在该行的生命周期内是唯一的,即即使该行产生行迁移,行的rowid 也不会改变。

为什么使用ROWID

rowid对访问一个表中的给定的行提供了最快的访问方法,通过ROWID可以直接定位到相应的数据块上,然后将其读到内存。我们创建一个索引时,该索引不但存储索引列的值,而且也存储索引值所对应的行的ROWID,这样我们通过索引快速找到相应行的ROWID后,通过该ROWID,就可以迅速将数据查询出来。这也就是我们使用索引查询时,速度比较快的原因。

在ORACLE8以前的版本中,ROWID由FILE 、BLOCK、ROW NUMBER构成。随着oracle8中对象概念的扩展,ROWID发生了变化,ROWID由OBJECT、FILE、BLOCK、ROW NUMBER构成。利用DBMS_ROWID可以将rowid分解成上述的各部分,也可以将上述的各部分组成一个有效的rowid。

Recursive SQL概念

有时为了执行用户发出的一个sql语句,Oracle必须执行一些额外的语句,我们将这些额外的语句称之为'recursive calls'或'recursive SQL statements'。如当一个DDL语句发出后,ORACLE总是隐含的发出一些recursive SQL语句,来修改数据字典信息,以便用户可以成功的执行该DDL语句。当需要的数据字典信息没有在共享内存中时,经常会发生Recursive calls,这些Recursive calls会将数据字典信息从硬盘读入内存中。用户不比关心这些recursive SQL语句的执行情况,在需要的时候,ORACLE会自动的在内部执行这些语句。当然DML 语句与SELECT都可能引起recursive SQL。简单的说,我们可以将触发器视为recursive SQL。

Row Source(行源)

用在查询中,由上一操作返回的符合条件的行的集合,即可以是表的全部行数据的集合;也可以是表的部分行数据的集合;也可以为对上2个row source进行连接操作(如join 连接)后得到的行数据集合。

Predicate(谓词)

一个查询中的WHERE限制条件

Driving Table(驱动表)

该表又称为外层表(OUTER TABLE)。这个概念用于嵌套与HASH连接中。如果该row source返回较多的行数据,则对所有的后续操作有负面影响。注意此处虽然翻译为驱动表,但实际上翻译为驱动行源(driving row source)更为确切。一般说来,是应用查询的限制条件后,返回较少行源的表作为驱动表,所以如果一个大表在WHERE条件有有限制条件(如等

值限制),则该大表作为驱动表也是合适的,所以并不是只有较小的表可以作为驱动表,正确说法应该为应用查询的限制条件后,返回较少行源的表作为驱动表。在执行计划中,应该为靠上的那个row source,后面会给出具体说明。在我们后面的描述中,一般将该表称为连接操作的row source 1。

Probed Table(被探查表)

该表又称为内层表(INNER TABLE)。在我们从驱动表中得到具体一行的数据后,在该表中寻找符合连接条件的行。所以该表应当为大表(实际上应该为返回较大row source的表)且相应的列上应该有索引。在我们后面的描述中,一般将该表称为连接操作的row source 2。

组合索引(concatenated index)

由多个列构成的索引,如create index idx_emp on emp(col1, col2, col3, ……),则我们称idx_emp索引为组合索引。在组合索引中有一个重要的概念:引导列(leading column),在上面的例子中,col1列为引导列。当我们进行查询时可以使用”where col1 = ? ”,也可以使用”where col1 = ? and col2 = ?”,这样的限制条件都会使用索引,但是”where col2 = ? ”查询就不会使用该索引。所以限制条件中包含先导列时,该限制条件才会使用该组合索引。

可选择性(selectivity):

比较一下列中唯一键的数量和表中的行数,就可以判断该列的可选择性。如果该列的”唯一键的数量/表中的行数”的比值越接近1,则该列的可选择性越高,该列就越适合创建索引,同样索引的可选择性也越高。在可选择性高的列上进行查询时,返回的数据就较少,比较适合使用索引查询。

有了这些背景知识后就开始介绍执行计划。为了执行语句,Oracle可能必须实现许多步骤。这些步骤中的每一步可能是从数据库中物理检索数据行,或者用某种方法准备数据行,供发出语句的用户使用。Oracle用来执行语句的这些步骤的组合被称之为执行计划。执行计划是SQL优化中最为复杂也是最为关键的部分,只有知道了ORACLE在内部到底是如何执行该SQL语句后,我们才能知道优化器选择的执行计划是否为最优的。执行计划对于DBA 来说,就象财务报表对于财务人员一样重要。所以我们面临的问题主要是:如何得到执行计划;如何分析执行计划,从而找出影响性能的主要问题。下面先从分析树型执行计划开始介绍,然后介绍如何得到执行计划,再介绍如何分析执行计划。

举例:

这个例子显示关于下面SQL语句的执行计划。

SELECT ename, job, sal, dname

FROM emp, dept

WHERE emp.deptno = derpt.deptno

AND NOT EXISTS

( SELECT *

FROM salgrade

WHERE emp.sal BETWEEN losal AND hisal );

此语句查询薪水不在任何建议薪水范围内的所有雇员的名字,工作,薪水和部门名。

下图5-1显示了一个执行计划的图形表示:

执行计划的步骤

执行计划的每一步返回一组行,它们或者为下一步所使用,或者在最后一步时返回给发出SQL语句的用户或应用。由每一步返回的一组行叫做行源(row source)。图5-1树状图显示了从一步到另一步行数据的流动情况。每步的编号反映了在你观察执行计划时所示步骤的顺序(如何观察执行计划将被简短地说明)。一般来说这并不是每一步被执行的先后顺序。执行计划的每一步或者从数据库中检索行,或者接收来自一个或多个行源的行数据作为输入:

由红色字框指出的步骤从数据库中的数据文件中物理检索数据。这种步骤被称之为存取路径,后面会详细介绍在Oracle可以使用的存取路径:

l 第3步和第6步分别的从EMP表和SALGRADE表读所有的行。

l 第5步在PK_DEPTNO索引中查找由步骤3返回的每个DEPTNO值。它找出与DEPT表中相关联的那些行的ROWID。

l 第4步从DEPT表中检索出ROWID为第5步返回的那些行。

由黑色字框指出的步骤在行源上操作,如做2表之间的关联,排序,或过滤等操作,后面也会给出详细的介绍:

l 第2步实现嵌套的循环操作(相当于C语句中的嵌套循环),接收从第3步和第4步来的行源,把来自第3步源的每一行与它第4步中相应的行连接在一起,返回结果行到第1步。

l 第1步完成一个过滤器操作。它接收来自第2步和第6步的行源,消除掉第2步中来的,在第6步有相应行的那些行,并将来自第2步的剩下的行返回给发出语句的用户或应用。

实现执行计划步骤的顺序

执行计划中的步骤不是按照它们编号的顺序来实现的:Oracle首先实现图5-1树结构图形里作为叶子出现的那些步骤(例如步骤3、5、6)。由每一步返回的行称为它下一步骤的行源。然后Oracle实现父步骤。

举例来说,为了执行图5-1中的语句,Oracle以下列顺序实现这些步骤:

l 首先,Oracle实现步骤3,并一行一行地将结果行返回给第2步。

l 对第3步返回的每一行,Oracle实现这些步骤:

-- Oracle实现步骤5,并将结果ROWID返回给第4步。

-- Oracle实现步骤4,并将结果行返回给第2步。

-- Oracle实现步骤2,将接受来自第3步的一行和来自第4步的一行,并返回

给第1步一行。

-- Oracle实现步骤6,如果有结果行的话,将它返回给第1步。

-- Oracle实现步骤1,如果从步骤6返回行,Oracle将来自第2步的行返回给

发出SQL语句的用户。

注意Oracle对由第3步返回的每一行实现步骤5,4,2,6一次。许多父步骤在它们能执行之前只需要来自它们子步骤的单一行。对这样的父步骤来说,只要从子步骤已返回

单一行时立即实现父步骤(可能还有执行计划的其余部分)。如果该父步骤的父步骤同样可以通过单一行返回激活的话,那么它也同样被执行。所以,执行可以在树上串联上去,可能包含执行计划的余下部分。对于这样的操作,可以使用first_rows作为优化目标以便于实现快速响应用户的请求。

对每个由子步骤依次检索出来的每一行,Oracle就实现父步骤及所有串联在一起的步骤一次。对由子步骤返回的每一行所触发的父步骤包括表存取,索引存取,嵌套的循环连接和过滤器。

有些父步骤在它们被实现之前需要来自子步骤的所有行。对这样的父步骤,直到所有行从子步骤返回之前Oracle不能实现该父步骤。这样的父步骤包括排序,排序一合并的连接,组功能和总计。对于这样的操作,不能使用first_rows作为优化目标,而可以用all_rows 作为优化目标,使该中类型的操作耗费的资源最少。

有时语句执行时,并不是象上面说的那样一步一步有先有后的进行,而是可能并行运行,如在实际环境中,3、5、4步可能并行运行,以便取得更好的效率。从上面的树型图上,是很难看出各个操作执行的先后顺序,而通过ORACLE生成的另一种形式的执行计划,则可以很容易的看出哪个操作先执行,哪个后执行,这样的执行计划是我们真正需要的,后面会给出详细说明。现在先来看一些预备知识。

访问路径(方法) -- access path

优化器在形成执行计划时需要做的一个重要选择是如何从数据库查询出需要的数据。对于SQL语句存取的任何表中的任何行,可能存在许多存取路径(存取方法),通过它们可以定位和查询出需要的数据。优化器选择其中自认为是最优化的路径。

在物理层,oracle读取数据,一次读取的最小单位为数据库块(由多个连续的操作系统块组成),一次读取的最大值由操作系统一次I/O的最大值与multiblock参数共同决定,所以即使只需要一行数据,也是将该行所在的数据库块读入内存。逻辑上,oracle用如下存取方法访问数据:

1) 全表扫描(Full Table Scans, FTS)

为实现全表扫描,Oracle读取表中所有的行,并检查每一行是否满足语句的WHERE 限制条件。Oracle顺序地读取分配给表的每个数据块,直到读到表的最高水线处(high water mark, HWM,标识表的最后一个数据块)。一个多块读操作可以使一次I/O能读取多块数据块(db_block_multiblock_read_count参数设定),而不是只读取一个数据块,这极大的减少了I/O总次数,提高了系统的吞吐量,所以利用多块读的方法可以十分高效地实现全表扫描,而且只有在全表扫描的情况下才能使用多块读操作。在这种访问模式下,每个数据块只被读一次。由于HWM标识最后一块被读入的数据,而delete操作不影响HWM值,所以一个表的所有数据被delete后,其全表扫描的时间不会有改善,一般我们需要使用truncate命令来使HWM值归为0。幸运的是oracle 10G后,可以人工收缩HWM的值。

由FTS模式读入的数据被放到高速缓存的Least Recently Used (LRU)列表的尾部,这样可以使其快速交换出内存,从而不使内存重要的数据被交换出内存。

使用FTS的前提条件:在较大的表上不建议使用全表扫描,除非取出数据的比较多,超过总量的5% -- 10%,或你想使用并行查询功能时。

使用全表扫描的例子:

~~~~~~~~~~~~~~~~~~~~~~~~

SQL> explain plan for select * from dual;

Query Plan

-----------------------------------------

SELECT STATEMENT [CHOOSE] Cost=

TABLE ACCESS FULL DUAL

2) 通过ROWID的表存取(Table Access by ROWID或rowid lookup)

行的ROWID指出了该行所在的数据文件、数据块以及行在该块中的位置,所以通过ROWID来存取数据可以快速定位到目标数据上,是Oracle存取单行数据的最快方法。

为了通过ROWID存取表,Oracle 首先要获取被选择行的ROWID,或者从语句的WHERE子句中得到,或者通过表的一个或多个索引的索引扫描得到。Oracle然后以得到的ROWID为依据定位每个被选择的行。

这种存取方法不会用到多块读操作,一次I/O只能读取一个数据块。我们会经常在执行计划中看到该存取方法,如通过索引查询数据。

使用ROWID存取的方法:

SQL> explain plan for select * from dept where rowid = 'AAAAyGAADAAAAA TAAF';

Query Plan

------------------------------------

SELECT STATEMENT [CHOOSE] Cost=1

TABLE ACCESS BY ROWID DEPT [ANAL YZED]

3)索引扫描(Index Scan或index lookup)

我们先通过index查找到数据对应的rowid值(对于非唯一索引可能返回多个rowid值),然后根据rowid直接从表中得到具体的数据,这种查找方式称为索引扫描或索引查找(index lookup)。一个rowid唯一的表示一行数据,该行对应的数据块是通过一次i/o得到的,在此情况下该次i/o只会读取一个数据库块。

在索引中,除了存储每个索引的值外,索引还存储具有此值的行对应的ROWID值。索引扫描可以由2步组成:(1) 扫描索引得到对应的rowid值。(2) 通过找到的rowid从表中读出具体的数据。每步都是单独的一次I/O,但是对于索引,由于经常使用,绝大多数都已经CACHE到内存中,所以第1步的I/O经常是逻辑I/O,即数据可以从内存中得到。但是对于第2步来说,如果表比较大,则其数据不可能全在内存中,所以其I/O很有可能是物理I/O,这是一个机械操作,相对逻辑I/O来说,是极其费时间的。所以如果多大表进行索引扫描,取出的数据如果大于总量的5% -- 10%,使用索引扫描会效率下降很多。

如下列所示:

SQL> explain plan for select empno, ename from emp where empno=10;

Query Plan

------------------------------------

SELECT STATEMENT [CHOOSE] Cost=1

TABLE ACCESS BY ROWID EMP [ANAL YZED]

INDEX UNIQUE SCAN EMP_I1

注意TABLE ACCESS BY ROWID EMP部分,这表明这不是通过FTS存取路径访问数据,而是通过rowid lookup存取路径访问数据的。在此例中,所需要的rowid是由于在索

引查找empno列的值得到的,这种方式是INDEX UNIQUE SCAN查找,后面给予介绍,EMP_I1为使用的进行索引查找的索引名字。

但是如果查询的数据能全在索引中找到,就可以避免进行第2步操作,避免了不必要的I/O,此时即使通过索引扫描取出的数据比较多,效率还是很高的,因为这只会在索引中读取。所以上面我在介绍基于规则的优化器时,使用了select count(id) from SWD_BILLDETAIL where cn <'6',而没有使用select count(cn) from SWD_BILLDETAIL where cn <'6'。因为在实际情况中,只查询被索引列的值的情况极为少,所以,如果我在查询中使用count(cn),则不具有代表性。

SQL> explain plan for select empno from emp where empno=10; -- 只查询empno列值

Query Plan

------------------------------------

SELECT STATEMENT [CHOOSE] Cost=1

INDEX UNIQUE SCAN EMP_I1

进一步讲,如果sql语句中对索引列进行排序,因为索引已经预先排序好了,所以在执行计划中不需要再对索引列进行排序

SQL> explain plan for select empno, ename from emp

where empno > 7876 order by empno;

Query Plan

--------------------------------------------------------------------------------

SELECT STATEMENT [CHOOSE] Cost=1

TABLE ACCESS BY ROWID EMP [ANAL YZED]

INDEX RANGE SCAN EMP_I1 [ANAL YZED]

从这个例子中可以看到:因为索引是已经排序了的,所以将按照索引的顺序查询出符合条件的行,因此避免了进一步排序操作。

根据索引的类型与where限制条件的不同,有4种类型的索引扫描:

索引唯一扫描(index unique scan)

索引范围扫描(index range scan)

索引全扫描(index full scan)

索引快速扫描(index fast full scan)

(1) 索引唯一扫描(index unique scan)

通过唯一索引查找一个数值经常返回单个ROWID。如果该唯一索引有多个列组成(即组合索引),则至少要有组合索引的引导列参与到该查询中,如创建一个索引:create index idx_test on emp(ename, deptno, loc)。则select ename from emp where ename = ‘JACK’ and deptno = ‘DEV’语句可以使用该索引。如果该语句只返回一行,则存取方法称为索引唯一扫描。而select ename from emp where deptno = ‘DEV’语句则不会使用该索引,因为where子句种没有引导列。如果存在UNIQUE 或PRIMARY KEY 约束(它保证了语句只存取单行)的话,Oracle经常实现唯一性扫描。

使用唯一性约束的例子:

SQL> explain plan for

数值分析综述-《数值分析与算法》徐士良

第2章矩阵与线性代数方程组 一般的线性代数方程组,A非奇异可根据Cramer法则求解方程唯一解但是它的计算量很大。 高斯消元法的算法时间复杂度是O(n3),可以解一系列的线性方程;所占数据空间符合原地工作的原则。但是算法对数值计算不稳定(当分母为0或很小时)。可以用在计算机中来解决数千条等式及未知数。不过,如果有过百万条等式时,这个算法会十分费时。 解决高斯法中的不稳定性,在每次归一化前增加选主元(列选主元、全选主元)过程。但是列选主元法仍不稳定,不适求解大规模线性代数方程组。全选主元的高斯消去法,则在复杂度降低的同时能够避免舍入误差,保证数值稳定性。 高斯-约当消去法算法产生出来的矩阵是一个简化行梯阵式,而不是高斯消元法中的行梯阵式。相比起高斯消元法,此算法的效率比较低,却可把方程组的解用矩阵一次过表示出来。线性代数方程组的迭代解法 简单迭代法:迭代格式发散但迭代值序列不一定发散,但收敛格式收敛,迭代值序列收敛于方程组的准确解与选取迭代初值无关。 雅可比迭代法: 计算公式简单,且计算过程中原始矩阵A始终不变,比较容易并行计算。但是收敛速度较慢,而且占据的存储空间较大,所以工程中一般不直接用雅克比迭代法,而用其改进方法。 高斯-赛德尔迭代法:较上面的迭代复杂,但是矩阵的条件相对宽松。 松弛法:需要根据经验去调整,收敛速度依赖松弛参数的选择,收敛条件的要求更宽松。共轭梯度法:是介于最速下降法与牛顿法之间的一个方法,它仅需利用一阶导数信息,但克服了最速下降法收敛慢的缺点,又避免了牛顿法需要存储和计算Hesse矩阵并求逆的缺点,在各种优化算法中,共轭梯度法是非常重要的一种。其优点是所需存储量小,具有步收敛性,稳定性高,而且不需要任何外来参数。共轭梯度法不仅是解决大型线性方程组最有用的方法之一,也是解大型非线性最优化最有效的算法之一。 第3章矩阵特征值 乘幂法计算绝对值最大的特征值:其收敛速度受限于最大与次大特征值比值绝对值的大小,实际应用中采用加速技术。 求对称特征值的雅克比方法96:每进行一次选装变换钱都需要在飞对角线的元素中选取绝对值最大的元素,很费时间,雅克比过关法对此做了改进。 QR方法求一般实矩阵的全部特征值98下100下:重复多次进行QR分解费时,计算工作量很大。一般先进行相似变换然后进行QR分解。但是这样仍然收敛速度慢,一般是线性收敛。实际应用中使用双重步QR变换将带原点的QR算法中相邻两步合并一步,加速收敛避免复数运算。 第4章非线性方程与方程组 二分法:每次运算后,区间长度减少一半,是线形收敛。优点是简单,但是不能计算复根和重根。 简单迭代法:直接的方法从原方程中隐含的求出x,从而确定迭代函数 (x),这种迭代法收敛速度较慢,迭代次数多。 埃特金迭代法113中:对简单迭代进行改进,使在其不满足收敛条件下迭代过程也收敛,在其收敛时加快收敛速度,减少迭代次数降低时间复杂度。 牛顿迭代法:其最大优点是在方程f(x) = 0的单根附近具有平方收敛,收敛速度快。而且该法还可以用来求方程的重根、复根。缺点:初值的选择会影响收敛结果。 牛顿下山法:保证函数值稳定下降,且有牛顿法的收敛速度。

并行计算综述

并行计算综述 姓名:尹航学号:S131020012 专业:计算机科学与技术摘要:本文对并行计算的基本概念和基本理论进行了分析和研究。主要内容有:并行计算提出的背景,目前国内外的研究现状,并行计算概念和并行计算机类型,并行计算的性能评价,并行计算模型,并行编程环境与并行编程语言。 关键词:并行计算;性能评价;并行计算模型;并行编程 1. 前言 网络并行计算是近几年国际上并行计算新出现的一个重要研究方向,也是热门课题。网络并行计算就是利用互联网上的计算机资源实现其它问题的计算,这种并行计算环境的显著优点是投资少、见效快、灵活性强等。由于科学计算的要求,越来越多的用户希望能具有并行计算的环境,但除了少数计算机大户(石油、天气预报等)外,很多用户由于工业资金的不足而不能使用并行计算机。一旦实现并行计算,就可以通过网络实现超级计算。这样,就不必要购买昂贵的并行计算机。 目前,国内一般的应用单位都具有局域网或广域网的结点,基本上具备网络计算的硬件环境。其次,网络并行计算的系统软件PVM是当前国际上公认的一种消息传递标准软件系统。有了该软件系统,可以在不具备并行机的情况下进行并行计算。该软件是美国国家基金资助的开放软件,没有版权问题。可以从国际互联网上获得其源代码及其相应的辅助工具程序。这无疑给人们对计算大问题带来了良好的机遇。这种计算环境特别适合我国国情。 近几年国内一些高校和科研院所投入了一些力量来进行并行计算软件的应用理论和方法的研究,并取得了可喜的成绩。到目前为止,网络并行计算已经在勘探地球物理、机械制造、计算数学、石油资源、数字模拟等许多应用领域开展研究。这将在计算机的应用的各应用领域科学开创一个崭新的环境。 2. 并行计算简介[1] 2.1并行计算与科学计算 并行计算(Parallel Computing),简单地讲,就是在并行计算机上所作的计算,它和常说的高性能计算(High Performance Computing)、超级计算(Super Computing)是同义词,因为任何高性能计算和超级计算都离不开并行技术。

数值分析作业思考题汇总

¥ 数值分析思考题1 1、讨论绝对误差(限)、相对误差(限)与有效数字之间的关系。 2、相对误差在什么情况下可以用下式代替 3、查阅何谓问题的“病态性”,并区分与“数值稳定性”的不同点。 4、取 ,计算 ,下列方法中哪种最好为什么(1)(3 3-,(2)(2 7-,(3) ()3 1 3+ ,(4) ()6 1 1 ,(5)99- , 数值实验 数值实验综述:线性代数方程组的解法是一切科学计算的基础与核心问题。求解方法大致可分为直接法和迭代法两大类。直接法——指在没有舍入误差的情况下经过有限次运算可求得方程组的精确解的方法,因此也称为精确法。当系数矩阵是方的、稠密的、无任何特殊结构的中小规模线性方程组时,Gauss消去法是目前最基本和常用的方法。如若系数矩阵具有某种特殊形式,则为了尽可能地减少计算量与存储量,需采用其他专门的方法来求解。 Gauss消去等同于矩阵的三角分解,但它存在潜在的不稳定性,故需要选主元素。对正定对称矩阵,采用平方根方法无需选主元。方程组的性态与方程组的条件数有关,对于病态的方程组必须采用特殊的方法进行求解。 数值计算方法上机题目1 1、实验1. 病态问题 实验目的: 算法有“优”与“劣”之分,问题也有“好”和“坏”之别。所谓坏问题就是问题本身的解对数据变化的比较敏感,反之属于好问题。希望读者通过本实验对此有一个初步的体会。 数值分析的大部分研究课题中,如线性代数方程组、矩阵特征值问题、非线性方程及方程组等都存在病态的问题。病态问题要通过研究和构造特殊的算法来解决,当然一般要付出一些代价(如耗用更多的机器时间、占用更多的存储空间等)。 $ r e x x e x x ** * ** - == 141 . ≈)61

数值分析综述报告

淮阴工学院 《数值分析》考试 ──基于Matlab的方法综合应用报告 班级:金融1121 姓名:姚婷婷 学号:1124104129 成绩: 数理学院 2014年6月7日

《数值分析》课程综述报告 前言: 数值分析也称计算方法,它与计算工具的发展密切相关。数值分析是一门为科学计算提供必需的理论基础和有效、实用方法的数学课程,它的任务是研究求解各类数学问题的数值方法和有关的理论。 正文: 第一章 近似计算与误差分析 1、产生误差的原因:①模型误差;②观测误差;③截断误差;④舍入误差。 2、四则运算的误差: ①加减法运算 ()()()****x y x y δδδ±=+ ②乘法运算 ()()() ****** *** ******xy x y xy xy xy x y x y y y x x x y x y y x δδδ-=-+-≤-+-?=+ ③ 除法运算: ()()() () () ***** ******* * * ** * * ** * *2 ** x x xy x y y y yy xy x y x y x y yy x x y y y x yy x y y x x y y δδ δ--=-+-=-+-= +?? ?≈ ??? 3、科学表示法、有效数字、近似值的精度 任何一个实数都可以表示成如下的形式: 其中:是正整数,是整数, 如果是数的近似值 并且 则称该近似值具有位有效数字(significant digit )。

此时,该近似值的相对误差为 另一方面,若已知 ()() *111 1021n r x a δ-≤ + 那么, ()()***1112110.10 211 102 r m n n m n x x x x a a a a δ----≤?=+≤ 即:*x 至少有n 位有效数字。 例: 3.141592653589793...π= 取其近似值如下: x*=3.14 x * =3.14159 x*=3.1415 x*=3.141 **213 100.314 110.0016...0.005101022 x x π--=?-=<=?=? **516 100.314159 110.0000026...0.00000510102 2 x x π--=?-=<=?=? **314 100.31415 110.000092...0.0001101022 x x π--=?-=<

最短路径的并行算法综述

最短路径的并行算法综述 SA02011105 陈艾 (aiai@https://www.doczj.com/doc/9e16938644.html,) 摘要:最短路径问题是图论中的一个典范问题,它被应用于众多领域。最短路径问题可以分成两类:单源最短路径、所有顶点对间的最短路径。本文对最短路径的并行算法进行综述,并介绍目前最短路径问题中的一个热点问题K条最短路径。 关键字:最短路径,单源最短路径,所有顶点对间的最短路径,K条最短路径 A Summary on Parallel Algorthms for Shortest Path Problems SA02011105 CHEN Ai Abstract:The shortest path problem plays an important role in graph theory .It is applied to numerous area . It is composed of two parts: single source shortest paths and all pairs shortest paths. This paper presents a summary on parallel algorithms for the shortest path problems including introducing a hot issue k shortest paths in shortest path problems at present. Keywords:Shortest paths,Single source shortest paths,All pairs shortest paths,K shortest paths 1. 引言 二十世纪中后期,随着计算机的出现和发展,图论的研究得到广泛重视,最短路径问题是图论中的一个典范问题,它已经被应用于众多领域。最短路径问题最直接的应用当数在地理信息领域,如:GIS网络分析、城市规划、电子导航等。在交通咨询方面,寻找交通路网中两个城市间最短的行车路线就是最短路径问题的一个典型的例子。在网络通信领域,信息包传递的路径选择问题也与最短路径问题息息相关。举个例子,OPSF开放路由选择协议,每 1 SA02011105 陈艾

导数的数值计算方法[文献综述]

毕业论文文献综述 信息与计算科学 导数的数值计算方法 一、 前言部分 导数概念的产生有着直觉的起源,与曲线的切线和运动质点的速度有密切的关系.导数用于描述函数变化率,刻画函数的因变量随自变量变化的快慢程度.比如说,物理上考虑功随时间的变化率(称为功率),化学上考虑反应物的量对时间的变化率(称为反应速度),经济学上考虑生产某种产品的成本随产量的变化率(称为边际成本)等等,这些变化率在数学上都可用导数表示. 导数由于其应用的广泛性,为我们解决所学过的有关函数问题提供了一般性的方法,导数是研究函数的切线、单调性、极值与最值等问题的有力工具;运用它可以简捷地解决一些实际问题,导数的概念是用来研究函数在一点及其附近的局部性质的精确工具,而对于函数在某点附近的性质还可以应用另一种方法来研究,就是通过最为简单的线性函数来逼近,这就是微分的方法.微分学是数学分析的重要组成部分,微分中值定理作为微分学的核心,是沟通导数和函数值之间的桥梁, Rolle 中值定理, Lagrange 中值定理, Cauchy 中值定理, Taylor 公式是微分学的基本定理, 统称为微分学的中值定理,这四个定理作为微分学的基本定理,是研究函数形态的有力工具 ] 1[.在微分学中,函数的导数是通过极限定义的,但 当函数用表格给出时,就不可用定义来求其导数,只能用近似方法求数值导数] 2[.最简单 的数值微分公式是用差商近似地代替微商,常见的有 [3] . ()()() 'f x h f x f x h +-≈ , ()()() 'f x f x h f x h --≈, ()()() '2f x h f x h f x h +--≈ . 需要注意的是微分是非常敏感的问题,数据的微小扰动会使结果产生很大的变化] 4[.

基于GPU并行计算的图像二值化研究【文献综述】

文献综述 计算机科学与技术 基于GPU并行计算的图像二值化研究 引言: 图像是当今社会运用的越来越多的元素之一,不过是动画还是静态的图片都是图像的动静呈现,所以对图像的处理也就越来越得到人们的关注。图像重要性,图像处理就是在图像中得到可靠的信息。而图像的二值化处理也是当今正盛行的一种图像的处理方法,它把图像原始化,使得数据更加简单的表现。 本毕业设计是GPU与二值化的并行运算,这无疑就是一种加速算法,也就是讲在二值化处理本来就跟快的基础上,能够更快的读取图像中的信息,得到我们想要的数据。而现在最常用的一种加速算法就是CUDA算法,他的并行运算可以使得二值化运算提高几十倍,在图像处理中是一个很庞大的数据。CUDA的并行运算在处理小图像时并不能很明显的突出速度,但是当遇到有大量的图像需要处理,而且图像又很大的情况下,这种并行运算可以节省很多时间。 1图像处理简介 1.1图像处理的概念 图像处理一般指数字图像处理。数字图像是指用数字摄像机、扫描仪等设备经过采样和数字化得到的一个大的二维数组,该数组的元素称为像素,其值为一整数,称为灰度值。图像处理技术的主要内容包括图像压缩,增强和复原,匹配、描述和识别3个部分。 常见的处理有图像数字化、图像编码、图像增强、图像复原、图像分割和图像分析等。图像处理一般指数字图像处理。虽然某些处理也可以用光学方法或模拟技术实现,但它们远不及数字图像处理那样灵活和方便,因而数字图像处理成为图像处理的主要方面。 1.2 图像二值化技术的简介 首先,图像的二值化有利于图像的进一步处理,使图像变得简单,而且数据量减小,能凸显出感兴趣的目标的轮廓。其次,要进行二值图像的处理与分析,首先要把灰度图像二值化,得到二值化图像。所有灰度大于或等于阀值的像素被判定为属于特定物体,其灰度值为255表示,否则这些像素点被排除在物体区域以外,灰度值为0,

数值计算方法设计论文

课程设计(论文) 题目: 三次样条插值问题 学院: ___ 理学院 _ 专业: __ _ 数学与应用数学 班级:数学08-2班 学生姓名: 魏建波 学生学号: 080524010219 指导教师:李文宇 2010年12月17日

课程设计任务书

目录 摘要……………………………………………………………………… 一、前言………………………………………………………………… (一)Lagrange插值的起源和发展过程……………………………………… (二)本文所要达到的目的……………………………………………………… 二、插值函数…………………………………………………………… (一)函数插值的基本思想…………………………………………………… (二)Lagrange插值的构造方法……………………………………………… 三、MATLAB程序………………………………………………………… (一)Lagrange程序…………………………………………………………… (二)龙格程序………………………………………………………………… 四、理论证明…………………………………………………………… 五、综述……………………………………………………………………谢辞………………………………………………………………………参考文献…………………………………………………………………

摘要

前言 要求:500字以上,宋体小四,行距20磅,主要内容写该算法的产生及发展、应用领域等。 题目 整体要求:报告页数,正文在8页以上 字体:宋体小四(行距20磅) 内容:1、理论依据 2、问题描述 3、问题分析 4、求解计算(程序) 5、结论 注:(1)页码编号从正文页开始 (2)标题可根据情况自己适当改动 示例见下: 2判别…………………… 2.1 判……………… 2.1.1 判别……………… 所谓的判别分析,………………………………………………方法[3]。 2.1.2 判………………………… 常用的有四种判别方法:…………………………………………………步判别法[6]。 1. 马氏………………

数值计算方法第4次作业

第四章 问题一 一、问题综述 在离地球表面高度为y处的重力加速度如下: 计算高度y=55000m处的重力加速度值。 二、问题分析 以高度y作为自变量,重力加速度的值为因变量。得到以下信息: f(0)=9.8100; f(30000)=9.7487; f(60000)=9.6879; f(90000)=9.6278; f(120000)=9.5682; 本题要求的就是f(55000)的值。 以下将采用课堂中学到的Lagrange插值多项式法、Newton插值多项式法、分段低次插值法和样条插值法求解该问题。 三、问题解决 1. lagrange插值多项式法 对某个多项式函数,已知有给定的k+ 1个取值点: 其中对应着自变量的位置,而对应着函数在这个位置的取值。 假设任意两个不同的x j都互不相同,那么应用拉格朗日插值公式所得到的拉格朗日插值多项式为:

其中每个为拉格朗日基本多项式(或称插值基函数),其表达式为: 拉格朗日基本多项式的特点是在上取值为1,在其它的点上取值为0。 源程序lagrange.m function [c,f]=lagrange(x,y,a) % 输入:x是自变量的矩阵;y是因变量的矩阵;a是要计算的值的自变量; % 输出:c是插值多项式系数矩阵;f是所求自变量对应的因变量; m=length(x); l=zeros(m,m); % l是权矩阵 f=0; for i=1:m v=1; for j=1:m if i~=j v=conv(v,poly(x(j)))/(x(i)-x(j)); % v是l_i(x)的系数矩阵 end end l(i,:)=v; % l矩阵的每一行都是x从高次到低次的系数矩阵 end c=vpa(y*l,10); % 对应阶次的系数相加,乘以y,显示10位有效数字 for k=1:m f=f+c(k)*a^(m-k); end 输入矩阵 x=[0 30000 60000 90000 120000] y=[9.81 9.7487 9.6879 9.6278 9.5682] a=55000 再运行源函数,可得: c = [ -2.057613169e-23, 4.938271605e-18, -3.703703702e-14, -0.000002046111111, 9.81] f = 9.6979851723251649906109417384537

分布式与并行计算报告

并行计算技术及其应用简介 XX (XXX,XX,XXX) 摘要:并行计算是实现高性能计算的主要技术手段。在本文中从并行计算的发展历程开始介绍,总结了并行计算在发展过程中所面临的问题以及其发展历程中出现的重要技术。通过分析在当前比较常用的实现并行计算的框架和技术,来对并行计算的现状进行阐述。常用的并行架构分为SMP(多处理系统)、NUMA (非统一内存存储)、MPP(巨型并行处理)以及集群。涉及并行计算的编程模型有MPI、PVM、OpenMP、TBB及Cilk++等。并结合当前研究比较多的云计算和大数据来探讨并行计算的应用。最后通过MPI编程模型,进行了并行编程的简单实验。 关键词:并行计算;框架;编写模型;应用;实验 A Succinct Survey about Parallel Computing Technology and It’s Application Abstract:Parallel computing is the main technology to implement high performance computing. This paper starts from the history of the development of Parallel Computing. It summarizes the problems faced in the development of parallel computing and the important technologies in the course of its development. Through the analysis of framework and technology commonly used in parallel computing currently,to explain the current situation of parallel computing.Framework commonly used in parallel are SMP(multi processing system),NUMA(non uniform memory storage),MPP(massively parallel processing) and cluster.The programming models of parallel computing are MPI, PVM, OpenMP, TBB and Cilk++, etc.Explored the application of parallel computing combined with cloud computing and big data which are very popular in current research.Finally ,through the MPI programming model,a simple experiment of parallel programming is carried out. Key words:parallel computing; framework; programming model; application; experiment 1引言 近年来多核处理器的快速发展,使得当前软件技术面临巨大的挑战。单纯的提高单机性能,已经不能满足软件发展的需求,特别是在处理一些大的计算问题上,单机性能越发显得不足。在最近AlphaGo与李世石的围棋大战中,AlphaGo就使用了分布式并行计算技术,才能获得强大的搜索计算能力。并行计算正是在这种背景下,应运而生。并行计算或称平行计算时相对于串行计算来说的。它是一种一次可执行多个指令的算法,目的是提高计算速度,及通过扩大问题求解规模,解决大型而复杂的计算问题。可分为时间上的并行和空间上的并行。时间上的并行就是指流水线技术,而空间上的并行则是指用多个处理器并发的执行计算。其中空间上的并行,也是本文主要的关注点。 并行计算(Parallel Computing)是指同时使用多种计算资源解决计算问题的过程,是提高计算机系统计算速度和处理能力的一种有效手段。它的基本思想是用多个处理器来协同求解同一问题,即将被求解的问题分解成若干个部分,各部分均由一个独立的处理机来并行计算。并行计算系统既可以是专门设计的,含有多个处理器的超级计算机,也可以是以某种方式互联的若干台的独立计算机构成的集群。通过并行计算集群完成数据的处理,再将处理的结果返回给用户。 目前常用的并行计算技术中,有调用系统函数启动多线程以及利用多种并行编程语言开发并行程序,常用的并行模型有MPI、PVM、OpenMP、TBB、Cilk++等。利用这些并行技术可以充分利用多核资源适应目前快速发展的社会需求。并行技术不仅要提高并行效率,也要在一定程度上减轻软件开发人员负担,如近年来的TBB、Cilk++并行模型就在一定程度上减少了开发难度,提高了开发效率,使得并行软件开发人员把更多精力专注于如何提高算法本身效率,而非把时间和精力放在如何去并行一个算法。

全面品质管理简要概论

全面品质管理概论(TOTAL QUALITY MANAGEMENT) 一、前言 (一)ISO-9000/2000中对有关质量名词的定义 1.产品:生产过程的结果。 2.过程:一组将输入转化为输出的相互关联式或相互作用的活动。 3.质量:一组固有特性满足要求的程度。(满足使用要求所应具备的所有特性) 4.要求:明示的,通常隐含的或必须履行的需求或期望。 5.控制状况与非控制状况“在生产过程中,产品质量特性的波动是属于正常范围, 此时的生产过程是稳定的,即称之为控制状况,反之则称之为非控制状况。” 6.顾客满意:顾客对其要求已被满足程度的感受。 7.管理体系:建立方针和目标并实现这些目标的体系。 8.质量保证:质量管理的一部分,致力于提供质量要求会得到满足的信任。 9.持续改进:增强满足要求的能力的循环活动。 10.顾客:接受产品的组织或个人。 11.供方(Supplier):提供产品的组织或个人。 12.程序(Procedure):为进行某项活动或过程所规定的途径。 13.纠正措施:为消除已发现的不合格或其他不期望情况的原因所采取的措施。 14.预防措施:为消除潜在不合格或其他潜在不期望情况的原因所采取的措施。 (二)品质的发展: 品质的发展可从三个方面来探讨: 品质的演化过程 ·品质所代表意义的演化过程 价格→产品的一致性功能→消费者或使用者合用水准→在社会大众生活中所创造的价值。 ·决定品质力量的演化过程 卖方的生产导向→买方市场导向→社会导向。 ·品管技术应用层面的演化过程 末端成品检验→制程统计检验→生产系统品管→加入非计量因素的品质管理系统→进入策略层面,总合上下的全面品管系统→全员参与,形成全公司品管。 ·品质被重视层面的演化过程 某些人的例行工作→某些易行的技术→一项特定的组织功能→短期性战术→政策→长期性的整体策略。 ·责任归属迁移的演化过程 个人的→检验或品管单位(Section)的→生产部门(Department)→产品部门 (Division)的→全公司(Companywide)的→长期与全系统(Whole System)的→每个人的。

数值计算方法大作业

题目利用数值计算方法求取基尼系数 姓名与学号 指导教师 年级与专业 所在学院

一、问题综述: 基尼系数(Gini coefficient),是20世纪初意大利学者科拉多·吉尼根据劳伦茨曲线所定义的判断收入分配公平程度的指标。是比例数值,在0和1之间。基尼指数(Gini index)是指基尼系数乘100倍作百分比表示。在民众收入中,如基尼系数最大为“1”,最小等于“0”。前者表示居民之间的收入分配绝对不平均(即所有收入都集中在一个人手里,其余的国民没有收入),而后者则表示居民之间的收入分配绝对平均,即人与人之间收入绝对平等,但这两种情况只出现在理论上;因此,基尼系数的实际数值只能介于0~1之间,基尼系数越小收入分配越平均,基尼系数越大收入分配越不平均。 设右图中的 实际收入分配曲线 (红线)和收入分 配绝对平等线(绿 线)之间的面积为 A,和收入分配绝 对不平等线(蓝 线)之间的面积为 B,则表示收入与 人口之间的比例的基尼系数为 A A+B 。 如果A为零,即基尼系数为0,表示收入分配完全平等(红线和绿线重叠);如果B为零,则系数为1,收入分配绝对不平等(红线和蓝线重叠)。该系数可在0和1之间取任何值。实际上,一般国家的收入分配,既不是完全平等,也不是完全不平等,而是在两者之间,劳伦茨曲线为一条凸向横轴的曲线。收入分配越趋向平等,劳伦茨曲线的弧度越小(斜度越倾向45度),基尼系数也越小;反之,收入分配越趋向不平等,劳伦茨曲线的弧度越大,那么基尼系数也越大。

基尼系数的调节需要国家通过财政政策进行国民收入的二次分配,例如对民众的财政公共服务支出和税收等,从而让收入均等化,令基尼系数缩小。 基尼系数由于给出了反映居民之间贫富差异程度的数量界线,可以较客观、直观地反映和监测居民之间的贫富差距,预报、预警和防止居民之间出现贫富两极分化。因此得到世界各国的广泛认同和普遍采用。 联合国有关组织规定: ●若低于0.2表示收入平均; ●0.2-0.3表示相对平均; ●0.3-0.4表示相对合理; ●0.4-0.5表示收入差距大; ●0.6以上表示收入差距悬殊。 2013年1月18日,中国国家统计局一次性公布了自2003年以来十年的全国基尼系数。大陆统计局局长马建堂称,按照国际新的统计口径,大陆居民收入的基尼系数,2003年是0.479,2004年是0.473,2005年为0.485,2006年为0.487,2007年为0.484,2008年为0.491,2009年为0.490,2010年为 0.481,2011年为0.477,到2012年的数据是0.474,为2005年以来最低水平,而自2008年起,基尼系数也在逐年下降。而此前西南财大调查数据显示,中国的2012年的基尼系数为0.61,但无论是民间统计的数据还是官方统计的数据,结果都遭到学术界质疑,仍具有争议性。 本文将根据网络上国家统计局的数据,利用上面给出的公式来计算我国从2002年以来的城镇居民基尼系数,并将计算出的数据与现有数据进行比较。 全球基尼系数

Visual Studio 2010并行计算概述

Visual Studio 2010并行计算概述 并行计算(Parallel Computing)是指同时使用多台计算机协同合作解决计算问题的过程,其主要目的是快速解决大型且复杂的计算问题。 图1:计算原理 并行计算是相对于串行计算——即在单个计算机(具有单个中央处理单元)上执行的操作,所提出的。具体的说,并行计算是在多台(并行)计算机上将一个应用任务分解成多个子任务,分配给不同的处理器,各个处理器之间相互协同,同时执行子任务的过程。并行计算可分为时间上的并行和空间上的并行。时间上的并行就是指流水线技术,而空间上的并行则是指用多个处理器并发的执行计算。为执行并行计算,计算资源应包括一台配有多处理(或并行处理)机的计算机和一个与网络相连的计算机专有编号。

图2:(a)SIMD类型 (b)MIMD类型 目前,对于并行计算的研究主要集中在空间上的并行问题上。空间上的并行导致了两类并行机的产生,即单指令流多数据流(SIMD)和多指令流多数据流(MIMD)。类似地,我们常用的串行机有时也被称为单指令流单数据流(SISD)。在1972年诞生的第一台并行计算机ILLIAC IV就属于SIMD类型机器。而自上个世纪八十年代以来,都是以MIMD并行计算机的研制为主。常见的MIMD类的机器可分:并行向量处理机(PVP)、对称多处理机(SMP)、大规模并行处理机(MPP)、工作站机群(COW)、分布式共享存储处理机(DSM)等五 类。并行计算机主要有以下四种访存模型: l 均匀访存模型(UMA) 非均匀访存模型(NUMA)l 全高速缓存访存模型(COMA)l l 一致性高速缓存非均匀存储访问模型(CC-NUMA)和非远程存储访问模型(NORMA)。

第一章-质量管理概述

质量管理 第一章质量管理概论 第一节质量和质量管理 一、质量的概念及意义 有没有同学没有听过“质量”一词?想必是没有的。在生活、工作中,我们如此轻易地使用“质量”一词,以至于人们在专业领域之外很少深入地去探究“质量”一词的含义。然而,不对质量的含义进行深入探讨和准确界定,就很难进行有效的质量管理。 一般而言,质量被用来描述“产品或者服务的好坏、优劣程度”。也常常加入一些限制词,如产品质量、工程质量、建筑质量和教育质量等等,或更加具体的如“空调质量”、“衣服质量”、乃至“信息质量”、“系统质量”、“生活质量”等,以使得质量的指向更为明确,意义表达更为具体。由此可见,质量是一个具有十分丰富内涵的概念,我们可以从不同的视角(产品、经营过程,经济增长,管理机制)进行审视并达到深层的理解。 质量有一个重要特性值得注意,即质量的含义具有与时俱进的特性——质量的含义将随着生产发展和社会进步而不断丰富内涵,拓展外延、调整表述而具有时代气息。 人类有文字记载的历史几乎总包含着质量及其控制和管理的内容。周王朝春秋战国时期,《周礼?考工记》记载了手工业产品的工程技术规格、制作方法、技术要求以及质量管理的方法。例如《考工记》开始就写道:“审曲面势以饬五材,以辨民器”。“审曲面势”就是对当地手工业品类型和规格的设计;“以饬五材”即在设计后确定所用原材料的成分比例;“以辨民器”就是对生产的手工业品,通过检查确定是否合格、可以使用。这就是当时人们对质量形成过程的记录,融入了他们对质量及其保证手段的理解。再如,中东古代史上,一块呗发掘的泥土上有这样的记载:公元前429年,巴比伦阿尔坦尔西王朝一世第35年,对给皇室生产戒指的工场要求:金戒指所镶嵌的翡翠要保证20年不会脱落,否则将会受到处罚。 1、质量的定义 ISO9000:2000族标准中给质量定义为:一组固有特性满足要求的程度。 (1)所谓的特性,是指可区分的特征 ①固有特性 固有特性就是指某事或某物中本来就有的,尤其是那种永久的特性,如相机快门使用的次数。 ②赋予特性 赋予特性不是固有的,不是某事物本来就有的,而是完成产品后因不同的要求而对产品所增加的特性,如产品的价格、硬件产品的供货时间和运输要求(如:运输方式)、售后服务要求(如:保修时间)等特性。

MapReduce并行计算技术发展综述

MapReduce并行计算技术发展综述 摘要:经过几年的发展,并行编程模型MapReduce产生了若干个改进框架,它们都是针对传统MapReduce的不足进行的修正或重写.本文阐述和分析了这些研究成果,包括:以HaLoop为代表的迭代计算框架、以Twitter为代表的实时计算框架、以ApacheHama为代表的图计算框架以及以ApacheY ARN为代表的框架管理平台.这些专用系统在大数据领域发挥着越来越重要的作用. MapReduce[1]是Google公司于2004年提出的能并发处理海量数据的并行编程模型,其特点是简单易学、适用广泛,能够降低并行编程难度,让程序员从繁杂的并行编程工作中解脱出来,轻松地编写简单、高效的并行程序.针对上述问题,MapReduce并行编程模型的最大优势在于能够屏蔽底层实现细节,有效降低并行编程难度,提高编程效率.其主要贡献在于: 使用廉价的商用机器组成集群,费用较低,同时又能具有较高的性能; 松耦合和无共享结构使之具有良好的可扩展性; 用户可根据需要自定义Map、Reduce和Partition等函数; 提供了一个运行时支持库,它支持任务的自动并行执行.提供的接口便于用户高效地进行任务调度、负载均衡、容错和一致性管理等; MapReduce适用范围广泛,不仅适用于搜索领域,也适用于满足MapReduce要求的其它领域计算任务 2 MapReduce总体研究状况 最近几年,在处理TB和PB级数据方面,MapReduce 已经成为使用最为广泛的并行编程模型之一.国内外MapReduce相关的研究成果主要有以下几方面: (1)在编程模型改进方面:MapReduce存在诸多不足.目前,典型研究成果有Barrier-lessMapReduce[6]、MapReduceMerge[7]、Oivos[8]、Kahnprocessnetworks[9]等.但这些模型均仅针对MapReduce某方面的不足,研究片面,并且都没有得到广泛应用,部分模型也不成熟 (2)在模型针对不同平台的实现方面:典型研究成果包括:Hadoop[10]、Phoenix[11,12]、Mars13]、CellMapRe-duce[14]、Misco[15]和Ussop[16]部分平台(例如:GPUs和Cell/B.E.)由于底层硬件比较复杂,造成编程难度较大,增加了用户编程的负担. \(3)在运行时支持库(包括:任务调度、负载均衡和容错)方面:常用的任务调度策略是任务窃取,但该策略有时会加大通信开销.典型的研究成果包括:延迟调度策略[17]、LATE调度策略[18]和基于性能驱动的任务调度策略[19]等.在容错方面的典型研究成果是reduce对象[20].目前,运行时支持库中针对一致性管理和资源分配等方面的研究相对较少. (4)在性能分析与优化方面: 目前, 文献[ 21]主要研究在全虚拟环境下MapReduce 性能分析, 文献[ 22]则提出了名为MRBench 的性能分析评价指标. 性能优化典型成果包括: 几何规划[ 23]、动态优先级管理[ 24]和硬件加速器[ 25]等. 着眼于性能, 结合运行时支持库, 将是MapReduce研究的热点之一. (5)在安全性和节能方面: 安全性方面典型研究成果是Sec ureMR模型[ 2 6]. 文献[ 27]和文献[ 28] 则在节能方面做了相应的研究. 目前国内外在安全性和节能方面的研究成果相对较少, 但是这方面研究的重要性已经得到了越来越多的重视. 如果一个模型没有很高的安全性, 同时也没有很好地考虑功耗问题, 那对其大范围推广将产生致命的影响. (6)在实际应用方面: MapReduce 应用范围广泛,Google 等诸多公司都在使用MapReduce 来加速或者简化各自公司的业务[ 29]. MapReduce 还广泛应用于云计算[ 3 0]和图像处理[ 31]等领域. 随着科技的进步, MapRe -duc e 将会得到越来越广泛的应用 .国内学者MapReduce 相关研究成果主要集中在实际应用方面. 例如, 把MapReduce 应用于模式发现[ 32]和数据挖掘[ 3 3]等领域. 部分研究成果涉及模型针对不同平台的实现、任务调度、容错和性能评估优化. 例如, 文献[ 34]提出了名为FPMR 的基于FPGA 平台的

定积分的数值计算方法[含论文、综述、开题-可编辑]

设计 (20 届) 定积分的数值计算方法 所在学院 专业班级信息与计算科学学生姓名学号 指导教师职称 完成日期年月

摘要:数值计算是许多科学与工程计算的核心.定积分的数值计算方法有很多,其中一些常用的计算方法有牛顿-科茨求积公式,梯形求积公式,辛普森求积公式,复合求积公式,龙贝格积分法,高斯求积公式,切比雪夫求积法等.本篇论文主要介绍定积分数值计算的多种方法,并对其中几种做了比较评述,最后给出了梯形求积公式,龙贝格积分法在Matlab环境中的编程实现. 关键词:牛顿-科茨求积公式;复合求积公式;高斯求积公式

Some numerical methods of definite integral Abstract: Numerical calculation is the core of many science and engineering calculation. There are many numerical calculation methods, including some commonly used numerical methods are Newton – Cotes Quadrature formula, Trapezoidal Quadrature formula, Simpson formula,Composite Quadrature formula, Romberg Quadrature method, Gaussian Quadrature formula, chebyshev Quadrature formula, and so on. This theies mainly introduces Some numerical methods of definite integral and compare several of these methods, finally gives the Trapezoidal Quadrature formula, Romberg Quadrature method in the Matlab environment for programming realize. Key words:Newton – Cotes Quadrature formula; Composite Quadrature formula; Gaussian Quadrature formula

电磁场数值计算方法及商用软件综述

电磁场数值计算方法及商用软件综述 摘要:介绍了电磁场数值计算中几种富有代表性的数值计算方法,对每种方法的解题思路,特点进行了仔细的阐述,并就不同方法的区别进行了深入的分析,然后比较了目前市场上常用的几种电磁场仿真软件,最后对电磁场数值计算方法及仿真软件的发展做了初步的探讨。为充分发挥各种方法的优点和在实践中实现各种方法的综合应用起到了一定的指导作用。 关键词:有限元法,矩量法,时域有限差分方法。 引言:自从1864年Maxwell建立了统一的电磁场理论,并得出了著名的Maxwell方程组以来,经典的数学分析方法是一百多年来电磁学学科发展中的一个极为重要的手段,围绕电磁分布边值问题的求解国内外专家学者做了大量工作,在数值计算方法之前,电磁分布边值问题的研究内容主要是解析法,但其推导过程相当繁琐困难,缺乏通用性,求解范围是十分有限的.从上个世纪六十年代以来,伴随着电子计算机技术的飞速发展,大量的电磁场数值计算方法不断涌现,并得到广泛应用,相对于经典电磁理论而言,数值方法受边界形状的约束大为减少,可以解决各种类型的复杂的问题,但各种数值计算方法都有各自的优缺点和局限性,一个复杂的问题往往难以依靠一种单一的方法解决,如何充分发挥各种方法的优缺点,取长补短,将多种方法结合起来解决实际问题,及混合法的应用已日益受到人们的关注。同时,怎样利用这些方法实现电磁学逆问题的求解也成为一个十分具有现实意义的工作。本文综述了国内外计算电磁学的发展状况,对常用的电磁计算方法及商用软件进行了分类和比较。 1.1电磁场数值方法的分类 电磁学问题的数值求解方法可分为时域和频域两大类(见表格1),频域技术主要有矩量法,有限差分法等,时域法的引入主要是基于对计算效率的考虑,某些问题在时域中讨论起来计算量要小,例如求解目标对冲击脉冲的早期响应时,频域必须在很大的带宽内多次采样计算,然后做傅里叶反变换求得解答,计

相关主题
文本预览
相关文档 最新文档