全局索引的ONLINE重建要影响执行速度-Oracle数据库 (全局索引失效的原因)

教程大全 2025-07-16 09:04:26 浏览

Oracle数据库重建一个表的 索引 的时候,基本都是全局索引而且都是方式重建,每个分区的重建时间基本相同,大约在23分钟左右。其实导致问题的原因很简单:由于采用ONLINE方式,而且全局索引的每一个分区的数据可能来自这个表的任何一个分区,所以ORACLE对于全局索引的任何一个分区的重建都要走全表扫描。以下是这一过程的代码演示部分:

1.查看当前用户,并以当前用户创建表T

2.为表T创建全局索引

全局索引失效的原因

3.查询索引列名称和分区列名称,并以指定的格式显示

4.DBMS_STATS.GATHER_TABLE_STATS统计表,列,索引的统计信息.

可以看到,如果要ONLINE重建这个索引,将会对表T执行32全表扫描。如果要对比较大的表进行在线重建索引,全局索引的重建代价是比较高的,因此耗时会比较长。

【编辑推荐】


ORACLE 常用操作语句规范和注意事项

规范: i. 尽量避免大事务操作,慎用holdlock子句,提高系统并发能力。 ii. 尽量避免反复访问同一张或几张表,尤其是数据量较大的表,可以考虑先根据条件提取数据到临时表中,然后再做连接。 iii. 尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该改写;如果使用了游标,就要尽量避免在游标循环中再进行表连接的操作。 iv. 注意where字句写法,必须考虑语句顺序,应该根据索引顺序、范围大小来确定条件子句的前后顺序,尽可能的让字段顺序与索引顺序相一致,范围从大到小。 v. 不要在where子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。 vi. 尽量使用exists代替select count(1)来判断是否存在记录,count函数只有在统计表中所有行数时使用,而且count(1)比count(*)更有效率。 vii. 尽量使用“>=”,不要使用“>”。 viii. 注意一些or子句和union子句之间的替换 ix. 注意表之间连接的数据类型,避免不同类型数据之间的连接。 x. 注意存储过程中参数和数据类型的关系。 xi. 注意insert、update操作的数据量,防止与其他应用冲突。 如果数据量超过200个数据页面(400k),那么系统将会进行锁升级,页级锁会升级成表级锁。 b) 索引的使用规范: i. 索引的创建要与应用结合考虑,建议大的OLTP表不要超过6个索引。 ii. 尽可能的使用索引字段作为查询条件,尤其是聚簇索引,必要时可以通过index index_name来强制指定索引 iii. 避免对大表查询时进行table scan,必要时考虑新建索引。 iv. 在使用索引字段作为条件时,如果该索引是联合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用。 v. 要注意索引的维护,周期性重建索引,重新编译存储过程。 c) tempdb的使用规范: i. 尽量避免使用distinct、order by、group by、having、join、cumpute,因为这些语句会加重tempdb的负担。 ii. 避免频繁创建和删除临时表,减少系统表资源的消耗。 iii. 在新建临时表时,如果一次插入数据量很大,那么可以使用select into代替create table,避免log,提高速度;如果数据量不大,为了缓和系统表的资源,建议先create table,然后insert。 iv. 如果临时表的数据量较大,需要建立索引,那么应该将创建临时表和建立索引的过程放在单独一个子存储过程中,这样才能保证系统能够很好的使用到该临时表的索引。 v. 如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先truncate table,然后drop table,这样可以避免系统表的较长时间锁定。 vi. 慎用大的临时表与其他大表的连接查询和修改,减低系统表负担,因为这种操作会在一条语句中多次使用tempdb的系统表。 d) 合理的算法使用: 根据上面已提到的SQL优化技术和ASE Tuning手册中的SQL优化内容,结合实际应用,采用多种算法进行比较,以获得消耗资源最少、效率最高的方法。 具体可用ASE调优命令:set statistics io on, set statistics time on , set showplan on 等。

数据库索引重建之后,碎片率再次提高

一般索引碎片是由于update/delete/insert操作,收缩文件,填充因子不合理,索引键设计不合理等造成的。 如果按照楼主说的,你可以定位一下究竟是什么原因造成的。 系统是否频繁执行update/delete/insert操作,收缩文件之类的。 另外索引的设计不合理这个也得重视。

软件测试的学习内容是什么?

1. 测试的人员,要熟悉多种语言,并能用多种语言进行开发测试,需要了解多种数据库,还要对code及文档是否合格要进行评估审察!还要开发各种测试环境,以确定软件在各种环境的表现状态!如果你仅认为测试仅是用用软件功能那就错了,因为要测试的范围很广!那种只要进行功能测试的公司,我想他们的软件,肯定会出很多问题。 测试是伴随整个开发过程的,就连需求文档,设计文档都要进行测试评估!所以测试不是简单的事情,需要丰富的经验才能胜任!这样才能出高质量的软件。 如果软件到最后再进行功能测试的话,有很多不易发现的bug就可能不会被发现!很可能,这个软件就不能使用了! 2. 软件开发与软件测试的区别!!! 软件测试工程师:查找bug、管理bug、质量保证 软件开发工程师:系统设计、编码、修改bug 测试工程师与开发工程师目标一致、行为对立、并行工作。 3. 测试工程师应该具备的三项基本素质[1] 很多年轻或者刚刚从事测试工作的工程师,经常会问:“测试工程师需要什么技能或者具有什么素质才是合格的?”与开发人员相比,测试人员不但需要一技之长,还需要掌握诸如操作系统、数据库、网络等多方面的知识。 一个有竞争力的测试人员要具有下面三个方面的素质: 计算机专业技能 计算机领域的专业技能是测试工程师应该必备的一项素质,是做好测试工作的前提条件。 尽管没有任何IT背景的人也可以从事测试工作,但是一名要想获得更大发展空间或者持久竞争力的测试工程师,则计算机专业技能是必不可少的。 计算机专业技能主要包含三个方面: 测试专业技能 现在软件测试已经成为一个很有潜力的专业。 要想成为一名优秀的测试工程师,首先应该具有扎实的专业基础,这也是本书的编写目的之一。 因此,测试工程师应该努力学习测试专业知识,告别简单的“点击”之类的测试工作,让测试工作以自己的专业知识为依托。 测试专业知识很多,本书内容主要以测试人员应该掌握的基础专业技能为主。 测试专业技能涉及的范围很广:既包括黑盒测试、白盒测试、测试用例设计等基础测试技术,也包括单元测试、功能测试、集成测试、系统测试、性能测试等测试方法,还包括基础的测试流程管理、缺陷管理、自动化测试技术等知识。 软件编程技能 “测试人员是否需要编程?”可以说是测试人员最常提出的问题之一。 实际上,由于在我国开发人员待遇普遍高于测试人员,因此能写代码的几乎都去做开发了,而很多人则是因为做不了开发或者不能从事其它工作才“被迫”从事测试工作。 最终的结果则是很多测试人员只能从事相对简单的功能测试,能力强一点的则可以借助测试工具进行简单的自动化测试(主要录制、修改、回放测试脚本)。 软件编程技能实际应该是测试人员的必备技能之一,在微软,很多测试人员都拥有多年的开发经验。 因此,测试人员要想得到较好的职业发展,必须能够编写程序。 只有能给编写程序,才可以胜任诸如单元测试、集成测试、性能测试等难度较大的测试工作。 此外,对软件测试人员的编程技能要求也有别于开发人员:测试人员编写的程序应着眼于运行正确,同时兼顾高效率,尤其体现在与性能测试相关的测试代码编写上。 因此测试人员要具备一定的算法设计能力。 依据作者的经验,测试工程师至少应该掌握Java、C#、C++之类的一门语言以及相应的开发工具。 网络、操作系统、数据库、中间件等知识: 与开发人员相比,测试人员掌握的知识具有“博而不精”的特点,“艺多不压身”是个非常形象的比喻。 由于测试中经常需要配置、调试各种测试环境,而且在性能测试中还要对各种系统平台进行分析与调优,因此测试人员需要掌握更多网络、操作系统、数据库等知识。 在网络方面,测试人员应该掌握基本的网络协议以及网络工作原理,尤其要掌握一些网络环境的配置,这些都是测试工作中经常遇到的知识。 操作系统和中间件方面,应该掌握基本的使用以及安装、配置等。 例如很多应用系统都是基于Unix、linux来运行的,这就要求测试人员掌握基本的操作命令以及相关的工具软件。 而WebLogic、Websphere等中间件的安装、配置很多时候也需要掌握一些。 数据库知识则是更应该掌握技能,现在的应用系统几乎离不开数据库。 因此不但要掌握基本的安装、配置,还要掌握SQL。 测试人员至少应该掌握MySQL、MS Sqlserver、Oracle等常见数据库的使用。 作为一名测试人员,尽管不能精通所有的知识,但要想做好测试工作,应该尽可能地去学习更多的与测试工作相关的知识

本文版权声明本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请联系本站客服,一经查实,本站将立刻删除。

发表评论

热门推荐