Oracle 性能收集资料_第1页
Oracle 性能收集资料_第2页
Oracle 性能收集资料_第3页
Oracle 性能收集资料_第4页
Oracle 性能收集资料_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

1、弄清楚你的业务类型OLTP or OLAP在Oracle数据库系统中,很多人没有弄清楚自己的业务类型到底是什么,就在开始盲目的寻求优化方法,而往往是把OLAP的方法使用在OLTP上,或者是OLTP的方法使用在OLAP上。这样的使用,有的时候,对性能没有任何的提高,甚至是大大的影响了性能,得到适得其反的效果。所以,在优化系统之前,弄清楚自己的业务类型。OLTP   (联机事务处理系统)也称为面向交易的处理系统,其基本特征是顾客的原始数据可以立即传送到计算中心进行处理,并在很短的时间内给出处理结果。这样做的最大优点是可以即时地处理输入的数据,及时地回答。也称为实时系统(Real

2、 time System)。衡量联机事务处理系统的一个重要性能指标是系统性能,具体体现为实时响应时间(Response Time),即用户在终端上送入数据之后,到计算机对这个请求给出答复所需要的时间。OLAP(联机分析处理系统)联机分析处理 (OLAP) 的概念最早是由关系数据库之父E.F.Codd于1993年提出的,他同时提出了关于OLAP的12条准则。OLAP的提出引起了很大的反响,OLAP作为一类产品同联机事务处理 (OLTP) 明显区分开来。 当今的数据处理大致可以分成两大类:联机事务处理OLTP(on-line transaction processing)、联机分析处理OLAP(O

3、n-Line Analytical Processing)。OLTP是传统的关系型数据库的主要应用,主要是基本的、日常的事务处理,例如银行交易。OLAP是数据仓库系统的主要应用,支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果。 OLTP与OLAP之间的比较: OLTPOLAP用户操作人员,低层管理人员决策人员,高级管理人员功能日常操作处理分析决策DB 设计面向应用面向主题数据最新的,细节的,二维的,分立的历史的,聚集的,多维的,集成的存取规模读/写数条(甚至数百条)记录读上百万(甚至上亿)条记录操作频度非常频繁(以秒计)比较稀松(以小时甚至以周计)工作单位严格的事务复杂

4、的查询用户数数百个-数千万个数个-数百个DB 大小100MB-GB100GB-TB1、什么是OLTP     OLTP,也叫联机事务处理(Online Transaction Processing),表示事务性非常高的系统,一般都是高可用的在线系统,以小的事务以及小的查询为主,评估其系统的时候,一般看其每秒执行的transaction以及execute sql的数量。在这样的系统中,每秒处理的transaction往往超过几百个,或者是几千个,select 语句的执行量每秒几千甚至几万个。典型的OLTP系统如电子商务系统,银行,证卷等等,如美国ebay的

5、业务数据库,就是很典型的OLTP数据库。    OLTP系统最容易出现的瓶颈就是CPU与磁盘子系统。cpu则取决于逻辑读以及内部调用,如函数等等。一个执行频繁的SQL语句,如果每个语句可以减少很少的逻辑读,也相当于优化了一些逻辑读很差的大型语句。很多人不感觉不到这里的作用,觉得一个语句几十个逻辑读,执行时间基本为0,就不需要优化了,其实,只要他的执行次数非常频繁,而且有优化的余地,就一定要优化,如减少一定的逻辑读或者降低执行次数,都是优化方法。    另外,一些计算性的函数,如sum,count,decode被非常频繁的使用,也是非常

6、消耗cpu的,我遇到一个系统,因为一个sql语句,大量的使用了sum与decode进行行列转换,结果这一个语句就耗费了整个机器一半以上的CPU。    那么,在一般的OLTP系统中,如果不考虑我上面说的函数问题,那么,逻辑读乘以执行次数,决定了cpu的消耗程度,如一个语句,每秒执行次数为500次,每个逻辑读为15,但是,通过优化,能让每个语句的逻辑读从15降到10,那么,每秒的逻辑读就可以减少500*5=2500个,其实就是相当于优化了一个执行频率为每秒1次,每次逻辑读为2500个的语句(注意,2500个逻辑读,在oltp系统是非常差的语句)。再如,假定一个1GH

7、Z的cpu每秒能正常处理的逻辑读是100,000个,如果是10个逻辑读一个的语句,每秒可以处理10,000个,而1000个逻辑读一个的语句,每秒则只能处理100个。    同以上道理,物理读乘以执行次数,则决定了存储子系统的处理能力,在一个OLTP环境中,物理读一般都是db file sequential read决定的,也就是单块读,一个典型的OLTP系统,db file sequential read应当基本等于磁盘子系统的读的IOPS。而磁盘子系统的IOPS处理能力,与cache命中率以及磁盘个数有很大的关系。我的一些文章中,也分析到了这些问题,如一个15K

8、转速的磁盘,每秒最多能处理的iops达到150个,基本就是极限了,如果cache不命中,那么100个磁盘,最多能处理的IOPS仅仅是15000个(但是,实际上,还基本达不到这个值)。    OLTP最常用的技术就是cache技术与btree索引,cache决定了很多语句不需要从磁盘子系统获得数据,所以,web cache与oracle data buffer对OLTP系统是很重要的。另外,在索引使用方面,语句是越简单越好,这样执行计划也稳定,而且一定要使用绑定变量,减少语句解析,尽量减少关联。其它方面,基本不使用分区技术,MV技术,并行技术以及位图索引,因为并发量

9、很高,批量更新可能要尽量快速提交避免阻塞的发生。     在ebay的数据库设计中,有一个很重要的点就是,数据库只负责存放数据,业务逻辑尽量在业务层实现,因为数据库扩展是困难的,而应用服务器扩展是简单的。其实,也就是说,在高可用的OLTP环境中,数据库使用越简单的功能越好。2、什么是OLAP    OLAP,也叫联机分析(Online Analytical Processing),有的时候也叫DSS决策支持系统,就是我们说的数据仓库。在这样的系统中,语句的执行量不是考核标准,因为一个语句的执行时间可能会非常长,读取的数据也非

10、常多。所以,这样的系统中,考核的标准往往决定于磁盘子系统的吞吐量。     磁盘子系统的吞吐量则直接取决于磁盘的个数,这个时候,cache基本是没有效果的,这个时候数据库的读写基本上是db file scattered read与direct path read/write。在我前面的一些文章中描述过,如果一个15K的磁盘的IO量每秒13M,那么,100个磁盘,最多能提供的吞吐量则是1300M/s(实际上,也基本达不到这个值)。如果磁盘个数足够的话,还需要考虑采用比较大的带宽,如4GB的光纤接口。    在OLAP系统中,常

11、使用的技术有分区技术,并行技术。如分区技术可以使得一些大表的扫描变得很快(只扫描单个分区),而且方便管理。另外,如果分区结合并行的话,也可以使得整个表的扫描也会变得很快。并行技术除了与分区技术结合外,在oracle 10g中,与rac结合实现多节点的同时扫描,效果也非常不错,把一个任务,如select的全表扫描,平均的分派到多个rac的节点上去。    在OLAP系统中,不需要使用绑定变量,因为整个系统的执行量很少,分析时间对于执行时间来说,可以忽略,而且避免出现错误的执行计划。但是OLAP中可以大量使用位图索引,物化视图,对于大的事务,尽量的寻求速度上的优化,没

12、有必要象OLTP需要快速提交,甚至要刻意减慢执行的速度。3、总结    特别是在高可用的OLTP环境中,不要盲目的把OLAP的技术拿过来用,如分区技术,如果不是大范围的使用了分区关键字作为where条件,而采用其它的字段作为where条件,那么,如果是本地索引,你将不得不扫描多个索引,而性能变的更为低下。如果是全局索引,那分区的意义又何在,只是多出一份分区技术的license而已。    并行技术也是如此,一般是在大型任务的时候才使用,好比说,实际生活中,一个比较大型的工作,如翻译一本书,你可以先安排多个人,每个人翻译不同的章节,这样

13、是可以提高翻译速度,但是,你现在只是翻译一页,你也去分配不同的人翻译不同的行,再组合起来,这个时间,你一个人或者早就翻译完了。    位图索引在我前几篇文章中有交代,如果用在oltp环境中,可能因为阻塞范围太大,很容易阻塞与死锁,但是,在olap环境中,可能会因为其特有的特性,提高olap的查询速度。mv也是基本一样,包括触发器等等,在dml频繁的oltp系统上,很容易成为瓶颈,而在olap环境上,则可能会因为使用恰当而提高查询速度。Oracle索引使用限制 和 建议什么是索引索引是建立在表的一列或多个列上的辅助对象,目的是加快访问表中的数据; Oracle存储索

14、引的数据结构是B*树,位图索引也是如此,只不过是叶子节点不同B*数索引;索引由根节点、分支节点和叶子节点组成,上级索引块包含下级索引块的索引数据,叶节点包含索引数据和确定行实际位置的rowid。一、oracle的索引陷阱一个表中有几百万条数据,对某个字段加了索引,但是查询时性能并没有什么提高,这主要可能是oracle的索引限制造成的。 oracle的索引有一些索引限制,在这些索引限制发生的情况下,即使已经加了索引,oracle还是会执行一次全表扫描,查询的性能不会比不加索引有所提高,反而可能由于数据库维护索引的系统开销造成性能更差。下面是一些常见的索引限制问题。 1、使用不等于操作符

15、(<>, !=)下面这种情况,即使在列dept_id有一个索引,查询语句仍然执行一次全表扫描 select * from dept where staff_num <> 1000; 但是开发中的确需要这样的查询,难道没有解决问题的办法了吗? 有! 通过把用 or 语法替代不等号进行查询,就可以使用索引,以避免全表扫描:上面的语句改成下面这样的,就可以使用索引了。 select * from dept shere staff_num < 1000 or dept_id > 1000;  2、使用 is null 或 is not null使用 is

16、null 或is nuo null也会限制索引的使用,因为数据库并没有定义null值。如果被索引的列中有很多null,就不会使用这个索引(除非索引是一个位图索引,关于位图索引,会在以后的blog文章里做详细解释)。在sql语句中使用null会造成很多麻烦。 解决这个问题的办法就是:建表时把需要索引的列定义为非空(not null) 3、使用函数如果没有使用基于函数的索引,那么where子句中对存在索引的列使用函数时,会使优化器忽略掉这些索引。下面的查询就不会使用索引: select * from staff where trunc(birthdate) = '01-MAY-8

17、2' 但是把函数应用在条件上,索引是可以生效的,把上面的语句改成下面的语句,就可以通过索引进行查找。 select * from staff where birthdate < (to_date('01-MAY-82') + 0.9999);  4、比较不匹配的数据类型比较不匹配的数据类型也是难于发现的性能问题之一。下面的例子中,dept_id是一个varchar2型的字段,在这个字段上有索引,但是下面的语句会执行全表扫描。 select * from dept where dept_id = 900198; 这是因为oracle会自动把where子句转

18、换成to_number(dept_id)=900198,就是3所说的情况,这样就限制了索引的使用。把SQL语句改为如下形式就可以使用索引 select * from dept where dept_id = '900198'  6简单优化 上面我们可以看到当对索引安段加上一些选项时就不再使用索引了,为了在查询时一定使用索引,可对参数optimizer_index_cost_adj进行设置,它的取值范围是1-10000,值越小就越使用索引,而值越大就越全盘扫描查看当前参数据值SQL> show parameter optimizer_index_cost_adjN

19、AME TYPEVALUE- - -optimizer_index_cost_adj integer 100为了多使用索引,可减小它的值SQL> alter system set optimizer_index_cost_adj=10; 进一步设置为了进一步优化,oracle建议对小表不要建索引,那什么为小表呢,oracle一次I/O就可读写完整个表的表为小表,查看oracle10g一次读写的数据量SQL> show parameter db_file_multiblock_read_countNAME TYPE VALUE- - -db_file_multiblock_

20、read_countinteger 128可见当表小于128k时就不要建索引了二、各种索引使用场合及建议 (1)B*Tree索引。常规索引,多用于oltp系统,快速定位行,应建立于高cardinality列(即列的唯一值除以行数为一个很大的值,存在很少的相同值)。 Create index indexname on tablename(columnnamecolumnname.)(2)反向索引。B*Tree的衍生产物,应用于特殊场合,在ops环境加序列增加的列上建立,不适合做区域扫描。 Create index indexname on tablename(col

21、umnnamecolumnname.) reverse(3)降序索引。B*Tree的衍生产物,应用于有降序排列的搜索语句中,索引中储存了降序排列的索引码,提供了快速的降序搜索。 Create index indexname on tablename(columnname DESCcolumnname.)(4)位图索引。位图方式管理的索引,适用于OLAP(在线分析)和DSS(决策处理)系统,应建立于低cardinality列,适合集中读取,不适合插入和修改,提供比B*Tree索引更节省的空间。 Create BITMAP index indexname on tablenam

22、e(columnnamecolumnname.)在实际应用中,如果某个字段的值需要频繁更新,那么就不适合在它上面创建位图索引。在位图索引中,如果你更新或插入其中一条数值为N的记录,那么相应表中数值为N的记录(可能成百上千条)全部被Oracle锁定,这就意味着其它用户不能同时更新这些数值为N的记录,其它用户必须要等第一个用户提交后,才能获得锁,更新或插入数据,bitmap index它主要用于决策支持系统或静态数据。(5)函数索引。B*Tree的衍生产物,应用于查询语句条件列上包含函数的情况,索引中储存了经过函数计算的索引码值。可以在不修改应用程序的基础上能提高查询效率。索引创建策略 1.导入数

23、据后再创建索引 2.不需要为很小的表创建索引 3.对于取值范围很小的字段(比如性别字段)应当建立位图索引 4.限制表中的索引的数目 5.为索引设置合适的PCTFREE值 6.存储索引的表空间最好单独设定 唯一索引和不唯一索引都只是针对B树索引而言. Oracle最多允许包含32个字段的复合索引 由此估计出一个查询如果使用某个索引会需要读入的数据块块数。需要读入的数据块越多,则 cost 越大,Oracle 也就越有可能不选择使用 index 三、能用唯一索引,一定用唯一索引 能加非空,就加非空约束 一定要统计表的信息,索引的信息,柱状图的信息。 联合索引的顺序不同,影响索引的选择,尽

24、量将值少的放在前面 只有做到以上四点,数据库才会正确的选择执行计划。ORACLE索引介绍与高性能SQL优化什么是索引索引是建立在表的一列或多个列上的辅助对象,目的是加快访问表中的数据;Oracle存储索引的数据结构是B*树,位图索引也是如此,只不过是叶子节点不同B*数索引;索引由根节点、分支节点和叶子节点组成,上级索引块包含下级索引块的索引数据,叶节点包含索引数据和确定行实际位置的rowid。使用索引的目的加快查询速度减少I/O操作消除磁盘排序何时使用索引查询返回的记录数排序表<40%非排序表 <7%表的碎片较多(频繁增加、删除)索引的种类非唯一索引(最常用)唯一索引位图

25、索引局部有前缀分区索引局部无前缀分区索引全局有前缀分区索引散列分区索引基于函数的索引管理索引的准则在表中插入数据后创建索引。在用SQL*Loader或import工具插入或装载数据后,建立索引比较有效;索引正确的表和列。经常检索排序大表中40%或非排序表7%的行,建议建索引;。为了改善多表关联,索引列用于联结;。列中的值相对比较唯一;。取值范围(大:B*树索引,小:位图索引);。Date型列一般适合基于函数的索引;。列中有许多空值,不适合建立索引为性能而安排索引列。经常一起使用多个字段检索记录,组合索引比单索引更有效;。把最常用的列放在最前面,例:dx_groupid_serv_id(grou

26、pid,serv_id),在where条件中使用groupid或groupid,serv_id,查询将使用索引,若仅用到serv_id字段,则索引无效;。合并/拆分不必要的索引。限制每个表索引的数量。一个表可以有几百个索引(你会这样做吗?),但是对于频繁插入和更新表,索引越多系统CPU,I/O负担就越重;。建议每张表不超过5个索引。删除不再需要的索引。索引无效,集中表现在该使用基于函数的索引或位图索引,而使用了B*树索引;。应用中的查询不使用索引;。重建索引之前必须先删除索引,若用alter index  rebuild重建索引,则不必删除索引。索引数据块空间使用

27、。创建索引时指定表空间,特别是在建立主键时,应明确指定表空间;。合理设定pctfress,注意:不能给索引指定pctused;。估计索引的大小和合理地设置存储参数,默认为表空间大小,或initial与next设置成一样大。考虑并行创建索引。对大表可以采用并行创建索引,在并行创建索引时,存储参数被每个查询服务器进程分别使用,例如:initial为1M,并行度为8,则创建索引期间至少要消耗8M空间;考虑用nologging创建索引。对大表创建索引可以使用nologging来减少重做日志;。节省重做日志文件的空间;。缩短创建索引的时间;。改善了并行创建大索引时的性能。 怎样建立最佳索引明确地创建索引

28、create index index_name on table_name(field_name)tablespace tablespace_namepctfree 5initrans 2maxtrans 255storage(minextents 1maxextents 16382pctincrease 0);创建基于函数的索引。常用与UPPER、LOWER、TO_CHAR(date)等函数分类上,例:create index idx_func on&#

29、160;emp (UPPER(ename) tablespace tablespace_name;创建位图索引。对基数较小,且基数相对稳定的列建立索引时,首先应该考虑位图索引,例:create bitmap index idx_bitm on class (classno) tablespace tablespace_name;明确地创建唯一索引。可以用create unique index语句来创建唯一索引,例:create unique in

30、dex dept_unique_idx on dept(dept_no) tablespace idx_1;创建与约束相关的索引。可以用using index字句,为与unique和primary key约束相关的索引,例如:alter table table_nameadd constraint PK_primary_keyname primary key (field_name)using index tablespace 

31、;tablespace_name;如何创建局部分区索引。基础表必须是分区表;。分区数量与基础表相同;。每个索引分区的子分区数量与相应的基础表分区相同;。基础表的子分区中的行的索引项,被存储在该索引的相应的子分区中,例如:Create Index TG_CDR04_SERV_ID_IDX On TG_CDR04(SERV_ID)Pctfree 5Tablespace TBS_AK01_IDXStorage (MaxExtents 32768PctIncrease 0FreeLists 1FreeL

32、ist Groups 1)local/如何创建范围分区的全局索引。基础表可以是全局表和分区表。create index idx_start_date on tg_cdr01(start_date)global partition by range(start_date)(partition p01_idx vlaues less than (0106)partition p01_idx vlaues less tha

33、n (0111)partition p01_idx vlaues less than (0401 )/重建现存的索引重建现存的索引的当前时刻不会影响查询;重建索引可以删除额外的数据块;提高索引查询效率;alter index idx_name rebuild nologging;对于分区索引:alter index idx_name rebuild partition partiton_name nologging;要删除索引

34、的原因。不再需要的索引;。索引没有针对其相关的表所发布的查询提供所期望的性能改善;。应用没有用该索引来查询数据;。该索引无效,必须在重建之前删除该索引;。该索引已经变的太碎了,必须在重建之前删除该索引;。语句:drop index idx_name; drop index idx_name drop partition partition_name;建立索引的代价基础表维护时,系统要同时维护索引,不合理的索引将严重影响系统资源,主要表现在CPU和I/O上;插入、更新、删除数据产生大量db file seq

35、uential read锁等待;SQL优化器简介基于规则的优化器。总是使用索引。总是从驱动表开始(from子句最右边的表)。只有在不可避免的情况下,才使用全表扫描。任何索引都可以基于成本的优化器。需要表、索引的统计资料Analyze table customer compute statistics;Analyze table customer estimate statistics sample 5000 rows;。表中设置并行度、表分区优化器模式rule模式。总忽略CB

36、O和统计信息而基于规则choose模式。Oracle根据情况选择rule or first_rows or all_rowsfirst_rows 模式。基于成本,以最快的速度返回记录,会造成总体查询速度的下降或消耗更多的资源,倾向索引扫描,适合OLTP系统all_rows模式。基于成本,确保总体查询时间最短,倾向并行全表扫描例如:Select last_name from customer order by last_name;用first_rows时,迅速返回记录,但I/O量大,用a

37、ll_rows时,返回记录慢,但使用资源少。调整SQL表访问全表扫描。返回记录:未排序表>40%,排序表>7%,建议采用并行机制来提高访问速度,DDS;索引访问。最常用的方法,包括索引唯一扫描和索引范围扫描,OLTP;快速完全索引扫描。访问索引中所有数据块,结果相当于全表扫描,可以用索引扫描代替全表扫描,例如:Select serv_id,count(* ) from tg_cdr01 group by serv_id;评估全表扫描的合法性如何实现并行扫描。永久并行化(不推荐)alter table&#

38、160;customer parallel degree 8;。单个查询并行化select /*+ full(emp) parallel(emp,8)*/ * from emp;分区表效果明显优化SQL语句排序排序的操作:。order by 子句。group by 子句。select distinct子句。创建索引时。union或minus。排序合并连接如何避免排序。添加索引。在索引中使用distinct子句。避免排序合并连接使用提示进行调整使用提示的原则

39、。语法:/*+ hint */。使用表别名:select /*+ index(e dept_idx)*/ * from emp e。检验提示常用的提示。rule。all_rows。first_rows。use_nl。use_hash。use_merge。index。index_asc。no_index。index_desc(常用于使用max内置函数)。index_combine(强制使用位图索引)。index_ffs(索引快速完全扫描)。use_concat(将查询中所有or条件使用union 

40、all)。parallel。noparallel。full。ordered(基于成本)调整表连接表连接的类型。等连接where 条件中用等式连接;。外部连接(左、右连接)在where条件子句的等式谓词放置一个(+)来实现,例如:select a.ename,m from emp a,bonus b where a.ename=b.ename(+);该语句返回所有emp表的记录;。自连接Select a.value total, B.value hard, (A.va

41、lue - b.value) soft ,Round(b.value/a.value)*100,1) percFrom v$sysstat a,v$sysstat bWhere a.statistic# = 179and B.statistic# = 180;反连接反连接常用于not in or not exists中,是指在查询中找到的任何记录都不包含在结果集中的子查询;不建议使用not in 

42、or not exists;。半连接查询中使用exists,含义:即使在子查询中返回多条重复的记录,外部查询也只返回一条记录。嵌套循环连接。被连接表中存在索引的情况下使用;。使用use_nl。hash连接。Hash连接将驱动表加载在内存中,并使用hash技术连接第二个表,提高等连接速度。适合于大表和小表连接;。使用use_hash。排序合并连接。排序合并连接不使用索引。使用原则:连接表子段中不存在可用索引;查询返回两个表中大部分的数据快;CBO认为全表扫描比索引扫描执行的更快。使用use_merge使用临时/中间表多个大表关联时,可以分别把满足条件的结果集存放到中间表,然后

43、用中间表关联;SQL子查询的调整关联与非关联子查询。关联:子查询的内部引用的是外部表,每行执行一次;。非关联:子查询只执行一次,存放在内存中。调整not in 和not exists语句。可以使用外部连接优化not in子句,例如:select ename from emp where dept_no not in(select dept_no from dept where dept_name =Math);改为:selec

44、t ename from emp,deptwhere emp.dept_no=dept.dept_noand dept.dept_name is null;使用索引调整SQLOracle 为什么不使用索引。检查被索引的列或组合索引的首列是否出现在PL/SQL语句的WHERE子句中,这是“执行计划”能用到相关索引的必要条件。看采用了哪种类型的连接方式。ORACLE的共有Sort Merge Join(SMJ)、Hash Join(HJ)和Nested Loop Joi

45、n(NL)。在两张表连接,且内表的目标列上建有索引时,只有Nested Loop才能有效地利用到该索引。SMJ即使相关列上建有索引,最多只能因索引的存在,避免数据排序过程。HJ由于须做HASH运算,索引的存在对数据查询速度几乎没有影响。看连接顺序是否允许使用相关索引。假设表emp的deptno列上有索引,表dept的列deptno上无索引,WHERE语句有emp.deptno=dept.deptno条件。在做NL连接时,emp做为外表,先被访问,由于连接机制原因,外表的数据访问方式是全表扫描,emp.deptno上的索引显然是用不上,最多在其上做索引全扫描或索引快速全扫描。是否用到系

46、统数据字典表或视图。由于系统数据字典表都未被分析过,可能导致极差的“执行计划”。但是不要擅自对数据字典表做分析,否则可能导致死锁,或系统性能下降。索引列是否函数的参数。如是,索引在查询时用不上。是否存在潜在的数据类型转换。如将字符型数据与数值型数据比较,ORACLE会自动将字符型用to_number()函数进行转换,从而导致上一种现象的发生。是否为表和相关的索引搜集足够的统计数据。对数据经常有增、删、改的表最好定期对表和索引进行分析,可用SQL语句“analyze table xxxx compute statistics for a

47、ll indexes;”。ORACLE掌握了充分反映实际的统计数据,才有可能做出正确的选择。索引列的选择性不高。 我们假设典型情况,有表emp,共有一百万行数据,但其中的emp.deptno列,数据只有4种不同的值,如10、20、30、40。虽然emp数据行有很多,ORACLE缺省认定表中列的值是在所有数据行均匀分布的,也就是说每种deptno值各有25万数据行与之对应。假设SQL搜索条件DEPTNO=10,利用deptno列上的索引进行数据搜索效率,往往不比全表扫描的高。索引列值是否可为空(NULL)。如果索引列值可以是空值,在SQL语句中那些要返回NULL值的操作,将不

48、会用到索引,如COUNT(*),而是用全表扫描。这是因为索引中存储值不能为全空。看是否有用到并行查询(PQO)。并行查询将不会用到索引。如果从以上几个方面都查不出原因的话,我们只好用采用在语句中加hint的方式强制ORACLE使用最优的“执行计划”。 hint采用注释的方式,有行注释和段注释两种方式。 如我们想要用到A表的IND_COL1索引的话,可采用以下方式: “SELECT /*+ INDEX(A IND_COL1)*/ * FROM A WHERE COL1 =

49、60;XXX;"如何屏蔽索引语句的执行计划中有不良索引时,可以人为地屏蔽该索引,方法:。数值型:在索引字段上加0,例如select * from emp where emp_no+0 = v_emp_no;。字符型:在索引字段上加,例如select * from tg_cdr01 where msisdn|=v_msisdn;SQLPLUS中的set小节在写脚本的时候,往往需要对输出的格式进行规范,我们常常用set语句在设置一些需要的格式规范。下面,列举了几个常用的

50、set ,和他们的应用。SQL> set echo on-设置运行命令是是否显示语句SQL> set feedback on-设置显示“已选择XX行”SQL> set colsep | -设置列与列之间的分割符号SQL> set pagesize 10-设置每一页的行数SQL> SET SERVEROUTPUT ON-设置允许显示输出类似dbms_outputSQL> set heading on-设置显示列名SQL> set timing on-设置显示“已用时间:XXXX”SQL> set time on-设置显示当前时间SQL> se

51、t autotrace on-设置允许对执行的sql进行分析00:38:28 SQL> set echo on00:38:37 SQL> E:echo.sql00:38:41 SQL> select status from v$datafile where rownum<6;STATUS-SYSTEMONLINEONLINEONLINEONLINE已选择5行。已用时间: 00: 00: 01.0800:38:43 SQL> set echo off00:38:58 SQL> E:echo.sqlSTATUS-SYSTEMONLINEONLINEONLINEO

52、NLINE已选择5行。已用时间: 00: 00: 01.0900:39:08 SQL>SQL> set feedback onSQL> set colsep |SQL> set pagesize 10SQL> set serveroutput onSQL> set heading onSQL> set timing onSQL> set time on00:54:11 SQL> SELECT FILE#, STATUS, ENABLED FROM V$DATAFILE;FILE#|STATUS |ENABLED-|-|-1|SYSTEM |

53、READ WRITE2|ONLINE |READ WRITE3|ONLINE |READ WRITE4|ONLINE |READ WRITE5|ONLINE |READ WRITE6|ONLINE |READ WRITE7|ONLINE |READ WRITEFILE#|STATUS |ENABLED-|-|-9|ONLINE |READ WRITE10|ONLINE |READ WRITE11|ONLINE |READ WRITE12|ONLINE |READ WRITE11 rows selected.Elapsed: 00:00:01.0700:54:34 SQL> DECLARE

54、00:55:00 2 BEGIN00:55:00 3 DBMS_OUTPUT.PUT_LINE('=This is dbms_output.put_line!=');00:55:00 4 END;00:55:02 5 /=This is dbms_output.put_line!=PL/SQL procedure successfully completed.Elapsed: 00:00:00.0200:55:05 SQL>SQL> set autotrace onSQL> SELECT E.LAST_NAME, D.DEPARTMENT_NAME, D.LO

55、CATION_ID2 FROM HR.EMPLOYEES E3 JOIN HR.DEPARTMENTS D4 USING (DEPARTMENT_ID);LAST_NAME DEPARTMENT_NAME LOCATION_ID- - -King Executive 1700Kochhar Executive 1700De Haan Executive 1700Hunold IT 1400Ernst IT 1400106 rows selected.Execution Plan-0 SELECT STATEMENT Optimizer=CHOOSE (Cost=5 Card=106 Bytes

56、=3180)1 0 HASH JOIN (Cost=5 Card=106 Bytes=3180)2 1 TABLE ACCESS (FULL) OF 'DEPARTMENTS' (Cost=2 Card=27 Bytes=513)3 1 TABLE ACCESS (FULL) OF 'EMPLOYEES' (Cost=2 Card=107 Bytes=1177)Statistics-7 recursive calls0 db block gets23 consistent gets12 physical reads0 redo size2801 bytes se

57、nt via SQL*Net to client580 bytes received via SQL*Net from client9 SQL*Net roundtrips to/from client0 sorts (memory)0 sorts (disk)106 rows processedSQL>Start with connect by prior在SELECT命令中使用CONNECT BY和蔼START WITH子句可以查询表中的树型结构关系。其命令格式如下:SELECT。CONNECT BY PRIOR列名1=列名2|列名1=PRIOR裂名2START WITH;其中:CO

58、NNECT BY子句说明每行数据将是按层次顺序检索,并规定将表中的数据连入树型结构的关系中。PRIORY运算符必须放置在连接关系的两列中某一个的前面。对于节点间的父子关系,PRIOR运算符在一侧表示父节点,在另一侧表示子节点,从而确定查找树结构是的顺序是自顶向下还是自底向上。在连接关系中,除了可以使用列名外,还允许使用列表达式。START WITH子句为可选项,用来标识哪个节点作为查找树型结构的根节点。若该子句被省略,则表示所有满足查询条件的行作为根节点。Start with.Connect By子句递归查询一般用于一个表维护树形结构的应用。创建示例表:CREATE TABLE TBL_TES

59、T(ID    NUMBER,NAME VARCHAR2(100 BYTE),PID   NUMBER                                  DEFAULT 0);插入测试数据:INSERT

60、INTO TBL_TEST(ID,NAME,PID) VALUES('1','10','0');INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('2','11','1');INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('3','20','0');INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('4','12','

61、;1');INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('5','121','2');从Root往树末梢递归select * from TBL_TESTstart with id=1connect by prior id = pidorder by pid从末梢往树ROOT递归select * from TBL_TESTstart with id=5connect by prior pid = idorder by id*CREATE TABLE xxuts_test_start(ID 

62、60;  varchar2(100),NAME VARCHAR2(100);select id,name,level from xxuts_test_startstart with id='A'connect by prior name=idorder by idid     name   levelA   B        1A    C    &#

63、160;   1A    D        1B    E         2B    F         2C    H        2E    G         3*

温馨提示

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

评论

0/150

提交评论