楼主原来就是刚才发招聘贴的那位啊,哈哈你可以在select 后加优化标识,如 select /*+rule */ field from tablename 和 select /*+cost */ field from tablename 这样试试
不太清除樓主數據庫的具體情況,不過我感覺你的兩個數據庫有可能優化規則不一樣!高级应用调节需要理解O r a c l e是如何优化S Q L语句的, O r a c l e有两种处理方法可以实现优 化,一是基于规则( R u l e - B a s e d ),O r a c l e基于一套基本规则按数据访问路径效率分类。二是 O r a c l e默认的基于代价( C o s t - B a s e )的优化方法,O r a c l e检验S Q L语句中的一个或多个表的数据, 并选择代价最低的访问路径(如使用最少的资源和花费最少的时间)。13.2.1 基于代价的方法 当使用基于代价的方法时, O r a c l e优化S Q L语句使其代价降低到最小。“C”、“B”、“O” 曾一度是O r a c l e专家所梦寐以求的字眼。基于代价的优化对影响S Q L语句的执行因素进行加权, 以得到代价最小的运行方案。在这里,代价是计算机资源的占有量(如I / O和C P U )和完成运行 时间等因素的量度。当数据库管理员为了使用C B O而改变O r a c l e环境时,便产生了许多问题。 以下重点讨论这些问题。 C B O在某些方面很有魅力,而在另一些方面却不尽然。例如,当读者为自己和家人购买 物品时,会权衡诸如价格、外形以及爱好等因素。要使O r a c l e具有魅力,也需要信息,例如表 中数据行数目、表的主关键字列表中的关键字分布以及被分配的和被表中的数据行占用的数 据块数目等。得到这些信息的窍门是经常去收集它们,并确保收集统计时不出现错误。我们 来看三个(实际上是四个, c l u s t e r _ r e l a t e d对象没有被包括在其中)数据字典视图,这些视图的 内容由统计收集关键字a n a l y z e提供。下面是C B O的重要的表列,由于它们是数据字典的一部 分,因此不能用手工修改。 三個視圖為:USER_TABLES,USER_INDEXS,USER_TAB_COLUMNS.数据库管理员可以用以下介绍的方法之一来控制C B O的使用: 1) 通过实例(即传给O r a c l e处理的所有语句) init.ora的条目o p t i m i z e r _ m o d e设置缺省的优 化方法,通常的值为a l l _ r o w s、f i r s t _ r o w s和c h o o s e。基于报表的应用最好选择第一种方法;对 于基于屏幕的系统,用户检索数据行组,但大多数情况下仅与数据行组打交道,最好选择第 二种方法。关键字c h o o s e使O r a c l e按以下逻辑工作: • 如果在S Q L语句所引用的表中没有可满足的统计, O r a c l e将使用基于规则的方法。 • 如果在S Q L语句中至少有一个表没有可满足的统计, O r a c l e将用a l l _ r o w s估算统计。 2) 通过会话在使用S Q L * P l u s时,将“alter session” 命令传给O r a c l e,则优化器按指定 方式运行,直到会话终止或遇到另一个“ alter session optimizer goal”语句。3) 通过语句开发者使用以下两种约定之一将提示( h i n t s )嵌入到格式化的S Q L语句中: • 用以“/ *”开头和“ * /”结尾的注释块说明: select /* + choose */ name , address .... • 用注释引导“-”: select --+ choose name, address .... 这些约定与使用双斜杠“ / /”等价,在双斜杠后面同一行的所有文本都被看作是注释,因 此如果编写有错,Oracle 将不给出提示或句法错误的说明。
O r a c l e对访问路径按权重1~1 5划分等级,并选择最低等级的访问路径。假设要将进入某 食品杂货店的物品分类,并检验苹果。在挑选苹果时,总是将其向上,查看损伤情况,检验 外壳的颜色。将最好的编为“ 1”号,将最差的编为“ 1 5”号。正如基于规则的优化方法那样, 编排号码的作用在于无论苹果是选择还是放弃,都以偏爱程度划分等级。 提示本节所讨论的内容主要在O r a c l e 8 i中,O r a c l e致力于基于规则的优化,并保证优 化规则向前兼容。 当检索数据时,如果O r a c l e知道数据的行标识符(每行可被行标识符唯一标识),则可很快 查找到数据行的位置。行标识符可供直接访问数据,并标识其精确位置。因此,可以将行标 识符描绘成为存储在O r a c l e数据库中的每个数据的地址。 访问路径的顺序由索引和所编写的S Q L语句确定。让我们看看最常用的基于规则的访问 路径权重以及含义。在下面几节中,将引入“ w h e r e”与一个或多个“ a n d” 作为S Q L语句 “w h e r e / a n d”的语句部分。 提示被选择的满足查询的访问路径等级越低,处理效率越高越快。 1. 基于规则的访问路径等级1 当“w h e r e”子句的关键字中行标识符与一个值相等时,该路径有效。例如: select * from fin_mast where rowid = 'AAAADCAABAAAAVUAAA' ; 语句使用权重划分等级。在应用中编写S Q L语句时,根本不知道行标识符,所以这个路径 不常用。然而,使用Oracle Form 这样的O r a c l e工具,当检索一行信息显示到屏幕上时,行标 识符也一同取出。在更改行信息并存回到数据库时, Oracle Form传送一条S Q L语句到使用这 个行标识符结构的O r a c l e。如果从Oracle Form 接收到一条O r a c l e错误信息,用户将可以看到: Oracle error occurred while executing KEY-COMMIT trigger: update tabA set name =:nam, address=:addr.......where rowid=:rowid O r a c l e知道屏幕上用户正在试图更改记录的标识符,并且使用这个访问路径完成数据的更改。 2. 基于规则访问路径等级4 在相等的条件下,通过S Q L语句引用所有唯一的或主关键字的表列时,这个路径有效。 表列主关键字部分 S t r e e t _ n a m e Y H o u s e _ n u m b e r Y C i t y N S Q L语句 select * from street_master where street_name = 'ROBSON' and house_number = '2802'; 用这个访问路径,在“ w h e r e / a n d”中对提到的主关键字中的所有表列用等式进行比较。 S Q L语句 select * from street_master where street_name = 'ROBSON' and house_number >= '2802'; 由于“ h o u s e _ n u m b e r”表列执行的比较条件不是等式(有一个大于或等于比较条件) ,所以 S Q L * P l u s不能利用这个访问路径。 S Q L语句 select * from street_master where street_name = 'ROBSON'; 不能使用在“w h e r e / a n d”条件中的所有关键字表列,也不能以这个权重划分等级。 3. 基于规则的访问路径等级8 如果所有表列以组合索引和采用等式方式用于S Q L语句的“w h e r e”子句,则可以使用这 个存取路径。记住:组合索引是建立在表中多个表列基础上的。 4. 基于规则的访问路径等级9 如果“w h e r e / a n d”部分的S Q L语句使用一个或多个单一表列索引,则可以使用这个存取 路径。如果使用多个单一表列的索引,条件必须用“ a n d”连接。假如“ f i n _ m a s t”表在 “f i n _ i d”表列上已建立了索引,下列S Q L语句就可以使用这个访问路径。 select max_out from fin_mast where fin_id = '1234M'; 如果“f i n _ m a s t”表中还有一个带索引的“ f i n _ r e l”表列,但由于连接条件使用的是“ o r” 而不是“a n d”,下列语句将不能使用这个路径: select max_out from fin_mast where fin_id = '1234M' or fin_rel is not null ; 5. 基于规则的访问路径等级1 5 任何能满足其他权重访问路径条件的S Q L语句都能使用全表查询。全表查询顺序地读取 表中的每个记录,选择满足选择条件的所有记录,放弃不满足条件的记录。 其他未介绍的基于规则的访问路径等级超过了本书的范围,不再介绍。
为什么C B O胜过基于规则的优化 无论读者是O LT P系统的数据库管理员或是决策支持系统的数据仓库管理员,都必须保证 基于代价优化器的畅通。在以前的C B O,S Q L查询结果所花费的时间比基于规则方法的多。 我们相信,如果用户系统地分析了对象并找到一种方法确保工作按计划完成,那么C B O将很 好地提供服务。不然的话,可以把问题告知O r a c l e,只要把对象分析得井井有条, C B O就会 井井有条地工作,并且在大多数情况下, C B O工作得比它以前的版本更好。 当O r a c l e 7在1 9 9 2年首次问世时,基于代价的方法就诞生了,开发者不再需要花费很多精力去优化S Q L语句。当系统运行时, O r a c l e在数据字典中基于统计决定运行方案。由于基于代 价的方法可以根据基于当前数据列以及索引表列值的分布优化语句,使运行方案更动态化, 数据改变时所选择的优化方案也随之改变。 为了帮助基于代价方法的运行, O r a c l e提供了一种称为提示( H i n t s )的技术。使用提示能通 过基于代价的优化和数据的不同访问路径的实验方法影响选择。O r a c l e执行自身的例程,将新 的优化技术提供给用户,并通过使用提示影响O r a c l e的选择。我们将提供以下指导帮助用户在 基于规则的方法和基于代价的方法之间做出选择。 • 从较早的O r a c l e版本移植过来的应用(第6版和更早的版本仅提供基于规则的优化)应该保 留基于规则的方法。 • 试验基于代价的方法,并熟悉使用那些在O r a c l e 7 / 8基础之上,由O r a c l e 8 i扩充的优化器 提示技术。 • 新的应用系统开发和调节应使用基于代价的方法。 • 使用本章下一节介绍的工具调节S Q L语句,这些工具是嵌入O r a c l e企业管理器中的性能 监控工具的Oracle Expert家族成员
ORA-03113: end-of-file on communication channel ?? 是这个 error 吗 这个多半是由于网络问题引起的 ,本身不是oracle的错误,检查一下网络状况和系统核心参数的设定 还可以参见itpub上有人总结了这个error 的情况至于执行的效率的问题用 alter session set events '10046 trace name context forever,level 12';对语句进行 跟踪一下看再说吧
多谢各位热心的朋友 我是用PL/SQL Developer查看PLAN才发现执行计划不同的
还忘问了 select bulk collect into ... 有没有用 LIMIT 限制bulk 的大小
给个列子 SQL> select * from t; N ---------- 1 2 3 4 5 6 7 8 9 10已选择10行。 1 declare 2 cursor c is select n from t; 3 type t_array is table of t.n%type index by binary_integer; 4 v_array t_array; 5 begin 6 open c; 7 loop 8 fetch c bulk collect into v_array limit 5; --是这里进行的限制 9 for i in 1..v_array.count loop --不影响结果 10 dbms_output.put_line(v_array(i)); 11 end loop; 12 exit when c%notfound; 13 end loop; 14 close c; 15* end; SQL> / 1 2 3 4 5 6 7 8 9 10PL/SQL 过程已成功完成。
如果没有,用set autotrace on查看一下解析情况
select /*+rule */ field from tablename
和
select /*+cost */ field from tablename
这样试试
化,一是基于规则( R u l e - B a s e d ),O r a c l e基于一套基本规则按数据访问路径效率分类。二是
O r a c l e默认的基于代价( C o s t - B a s e )的优化方法,O r a c l e检验S Q L语句中的一个或多个表的数据,
并选择代价最低的访问路径(如使用最少的资源和花费最少的时间)。13.2.1 基于代价的方法
当使用基于代价的方法时, O r a c l e优化S Q L语句使其代价降低到最小。“C”、“B”、“O”
曾一度是O r a c l e专家所梦寐以求的字眼。基于代价的优化对影响S Q L语句的执行因素进行加权,
以得到代价最小的运行方案。在这里,代价是计算机资源的占有量(如I / O和C P U )和完成运行
时间等因素的量度。当数据库管理员为了使用C B O而改变O r a c l e环境时,便产生了许多问题。
以下重点讨论这些问题。
C B O在某些方面很有魅力,而在另一些方面却不尽然。例如,当读者为自己和家人购买
物品时,会权衡诸如价格、外形以及爱好等因素。要使O r a c l e具有魅力,也需要信息,例如表
中数据行数目、表的主关键字列表中的关键字分布以及被分配的和被表中的数据行占用的数
据块数目等。得到这些信息的窍门是经常去收集它们,并确保收集统计时不出现错误。我们
来看三个(实际上是四个, c l u s t e r _ r e l a t e d对象没有被包括在其中)数据字典视图,这些视图的
内容由统计收集关键字a n a l y z e提供。下面是C B O的重要的表列,由于它们是数据字典的一部
分,因此不能用手工修改。
三個視圖為:USER_TABLES,USER_INDEXS,USER_TAB_COLUMNS.数据库管理员可以用以下介绍的方法之一来控制C B O的使用:
1) 通过实例(即传给O r a c l e处理的所有语句) init.ora的条目o p t i m i z e r _ m o d e设置缺省的优
化方法,通常的值为a l l _ r o w s、f i r s t _ r o w s和c h o o s e。基于报表的应用最好选择第一种方法;对
于基于屏幕的系统,用户检索数据行组,但大多数情况下仅与数据行组打交道,最好选择第
二种方法。关键字c h o o s e使O r a c l e按以下逻辑工作:
• 如果在S Q L语句所引用的表中没有可满足的统计, O r a c l e将使用基于规则的方法。
• 如果在S Q L语句中至少有一个表没有可满足的统计, O r a c l e将用a l l _ r o w s估算统计。
2) 通过会话在使用S Q L * P l u s时,将“alter session” 命令传给O r a c l e,则优化器按指定
方式运行,直到会话终止或遇到另一个“ alter session optimizer goal”语句。3) 通过语句开发者使用以下两种约定之一将提示( h i n t s )嵌入到格式化的S Q L语句中:
• 用以“/ *”开头和“ * /”结尾的注释块说明:
select /* + choose */ name , address ....
• 用注释引导“-”:
select --+ choose
name, address ....
这些约定与使用双斜杠“ / /”等价,在双斜杠后面同一行的所有文本都被看作是注释,因
此如果编写有错,Oracle 将不给出提示或句法错误的说明。
食品杂货店的物品分类,并检验苹果。在挑选苹果时,总是将其向上,查看损伤情况,检验
外壳的颜色。将最好的编为“ 1”号,将最差的编为“ 1 5”号。正如基于规则的优化方法那样,
编排号码的作用在于无论苹果是选择还是放弃,都以偏爱程度划分等级。
提示本节所讨论的内容主要在O r a c l e 8 i中,O r a c l e致力于基于规则的优化,并保证优
化规则向前兼容。
当检索数据时,如果O r a c l e知道数据的行标识符(每行可被行标识符唯一标识),则可很快
查找到数据行的位置。行标识符可供直接访问数据,并标识其精确位置。因此,可以将行标
识符描绘成为存储在O r a c l e数据库中的每个数据的地址。
访问路径的顺序由索引和所编写的S Q L语句确定。让我们看看最常用的基于规则的访问
路径权重以及含义。在下面几节中,将引入“ w h e r e”与一个或多个“ a n d” 作为S Q L语句
“w h e r e / a n d”的语句部分。
提示被选择的满足查询的访问路径等级越低,处理效率越高越快。
1. 基于规则的访问路径等级1
当“w h e r e”子句的关键字中行标识符与一个值相等时,该路径有效。例如:
select *
from fin_mast
where rowid = 'AAAADCAABAAAAVUAAA' ;
语句使用权重划分等级。在应用中编写S Q L语句时,根本不知道行标识符,所以这个路径
不常用。然而,使用Oracle Form 这样的O r a c l e工具,当检索一行信息显示到屏幕上时,行标
识符也一同取出。在更改行信息并存回到数据库时, Oracle Form传送一条S Q L语句到使用这
个行标识符结构的O r a c l e。如果从Oracle Form 接收到一条O r a c l e错误信息,用户将可以看到:
Oracle error occurred while executing KEY-COMMIT trigger:
update tabA set name =:nam, address=:addr.......where rowid=:rowid
O r a c l e知道屏幕上用户正在试图更改记录的标识符,并且使用这个访问路径完成数据的更改。
2. 基于规则访问路径等级4
在相等的条件下,通过S Q L语句引用所有唯一的或主关键字的表列时,这个路径有效。
表列主关键字部分
S t r e e t _ n a m e Y
H o u s e _ n u m b e r Y
C i t y N
S Q L语句
select *
from street_master
where street_name = 'ROBSON'
and house_number = '2802';
用这个访问路径,在“ w h e r e / a n d”中对提到的主关键字中的所有表列用等式进行比较。
S Q L语句
select *
from street_master
where street_name = 'ROBSON'
and house_number >= '2802';
由于“ h o u s e _ n u m b e r”表列执行的比较条件不是等式(有一个大于或等于比较条件) ,所以
S Q L * P l u s不能利用这个访问路径。
S Q L语句
select *
from street_master
where street_name = 'ROBSON';
不能使用在“w h e r e / a n d”条件中的所有关键字表列,也不能以这个权重划分等级。
3. 基于规则的访问路径等级8
如果所有表列以组合索引和采用等式方式用于S Q L语句的“w h e r e”子句,则可以使用这
个存取路径。记住:组合索引是建立在表中多个表列基础上的。
4. 基于规则的访问路径等级9
如果“w h e r e / a n d”部分的S Q L语句使用一个或多个单一表列索引,则可以使用这个存取
路径。如果使用多个单一表列的索引,条件必须用“ a n d”连接。假如“ f i n _ m a s t”表在
“f i n _ i d”表列上已建立了索引,下列S Q L语句就可以使用这个访问路径。
select max_out
from fin_mast
where fin_id = '1234M';
如果“f i n _ m a s t”表中还有一个带索引的“ f i n _ r e l”表列,但由于连接条件使用的是“ o r”
而不是“a n d”,下列语句将不能使用这个路径:
select max_out
from fin_mast
where fin_id = '1234M'
or fin_rel is not null ;
5. 基于规则的访问路径等级1 5
任何能满足其他权重访问路径条件的S Q L语句都能使用全表查询。全表查询顺序地读取
表中的每个记录,选择满足选择条件的所有记录,放弃不满足条件的记录。
其他未介绍的基于规则的访问路径等级超过了本书的范围,不再介绍。
无论读者是O LT P系统的数据库管理员或是决策支持系统的数据仓库管理员,都必须保证
基于代价优化器的畅通。在以前的C B O,S Q L查询结果所花费的时间比基于规则方法的多。
我们相信,如果用户系统地分析了对象并找到一种方法确保工作按计划完成,那么C B O将很
好地提供服务。不然的话,可以把问题告知O r a c l e,只要把对象分析得井井有条, C B O就会
井井有条地工作,并且在大多数情况下, C B O工作得比它以前的版本更好。
当O r a c l e 7在1 9 9 2年首次问世时,基于代价的方法就诞生了,开发者不再需要花费很多精力去优化S Q L语句。当系统运行时, O r a c l e在数据字典中基于统计决定运行方案。由于基于代
价的方法可以根据基于当前数据列以及索引表列值的分布优化语句,使运行方案更动态化,
数据改变时所选择的优化方案也随之改变。
为了帮助基于代价方法的运行, O r a c l e提供了一种称为提示( H i n t s )的技术。使用提示能通
过基于代价的优化和数据的不同访问路径的实验方法影响选择。O r a c l e执行自身的例程,将新
的优化技术提供给用户,并通过使用提示影响O r a c l e的选择。我们将提供以下指导帮助用户在
基于规则的方法和基于代价的方法之间做出选择。
• 从较早的O r a c l e版本移植过来的应用(第6版和更早的版本仅提供基于规则的优化)应该保
留基于规则的方法。
• 试验基于代价的方法,并熟悉使用那些在O r a c l e 7 / 8基础之上,由O r a c l e 8 i扩充的优化器
提示技术。
• 新的应用系统开发和调节应使用基于代价的方法。
• 使用本章下一节介绍的工具调节S Q L语句,这些工具是嵌入O r a c l e企业管理器中的性能
监控工具的Oracle Expert家族成员
这个多半是由于网络问题引起的 ,本身不是oracle的错误,检查一下网络状况和系统核心参数的设定 还可以参见itpub上有人总结了这个error 的情况至于执行的效率的问题用
alter session set events '10046 trace name context forever,level 12';对语句进行
跟踪一下看再说吧
我是用PL/SQL Developer查看PLAN才发现执行计划不同的
用limit 限制一下吧 一般范围在 100-500 之间吧
SQL> select * from t; N
----------
1
2
3
4
5
6
7
8
9
10已选择10行。 1 declare
2 cursor c is select n from t;
3 type t_array is table of t.n%type index by binary_integer;
4 v_array t_array;
5 begin
6 open c;
7 loop
8 fetch c bulk collect into v_array limit 5; --是这里进行的限制
9 for i in 1..v_array.count loop --不影响结果
10 dbms_output.put_line(v_array(i));
11 end loop;
12 exit when c%notfound;
13 end loop;
14 close c;
15* end;
SQL> /
1
2
3
4
5
6
7
8
9
10PL/SQL 过程已成功完成。