Oracle 数据库SQL调优
oracle数据库性能调优

oracle数据库性能调优⼀:注意WHERE⼦句中的连接顺序:ORACLE采⽤⾃下⽽上的顺序解析WHERE⼦句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最⼤数量记录的条件必须写在WHERE⼦句的末尾.尤其是“主键ID=?”这样的条件。
⼆: SELECT⼦句中避免使⽤ ‘ * ‘:ORACLE在解析的过程中, 会将'*' 依次转换成所有的列名, 这个⼯作是通过查询数据字典完成的, 这意味着将耗费更多的时间。
简单地讲,语句执⾏的时间越短越好(尤其对于系统的终端⽤户来说)。
⽽对于查询语句,由于全表扫描读取的数据多,尤其是对于⼤型表不仅查询速度慢,⽽且对磁盘IO造成⼤的压⼒,通常都要避免,⽽避免的⽅式通常是使⽤索引Index。
三:使⽤索引的优势与代价。
优势:1)索引是表的⼀个概念部分,⽤来提⾼检索数据的效率,ORACLE使⽤了⼀个复杂的⾃平衡B-tree结构. 通常,通过索引查询数据⽐全表扫描要快. 当ORACLE找出执⾏查询和Update语句的最佳路径时, ORACLE优化器将使⽤索引. 同样在联结多个表时使⽤索引也可以提⾼效率. 2)另⼀个使⽤索引的好处是,它提供了主键(primary key)的唯⼀性验证.。
那些LONG或LONG RAW数据类型, 你可以索引⼏乎所有的列. 通常, 在⼤型表中使⽤索引特别有效. 当然,你也会发现, 在扫描⼩表时,使⽤索引同样能提⾼效率.代价:虽然使⽤索引能得到查询效率的提⾼,但是我们也必须注意到它的代价. 索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时, 索引本⾝也会被修改. 这意味着每条记录的INSERT , DELETE , UPDATE将为此多付出4 , 5 次的磁盘I/O . 因为索引需要额外的存储空间和处理,那些不必要的索引反⽽会使查询反应时间变慢.。
⽽且表越⼤,影响越严重。
使⽤索引需要注意的地⽅:1、避免在索引列上使⽤NOT , 我们要避免在索引列上使⽤NOT, NOT会产⽣在和在索引列上使⽤函数相同的影响. 当ORACLE”遇到”NOT,他就会停⽌使⽤索引转⽽执⾏全表扫描.2、避免在索引列上使⽤计算.WHERE⼦句中,如果索引列是函数的⼀部分.优化器将不使⽤索引⽽使⽤全表扫描.举例:代码如下:低效:SELECT … FROM DEPT WHERE SAL * 12 > 25000;⾼效:SELECT … FROM DEPT WHERE SAL > 25000/12;3、避免在索引列上使⽤IS NULL和IS NOT NULL避免在索引中使⽤任何可以为空的列,ORACLE性能上将⽆法使⽤该索引.对于单列索引,如果列包含空值,索引中将不存在此记录. 对于复合索引,如果每个列都为空,索引中同样不存在此记录. 如果⾄少有⼀个列不为空,则记录存在于索引中.举例: 如果唯⼀性索引建⽴在表的A列和B列上, 并且表中存在⼀条记录的A,B值为(123,null) , ORACLE将不接受下⼀条具有相同A,B值(123,null)的记录(插⼊). 然⽽如果所有的索引列都为空,ORACLE将认为整个键值为空⽽空不等于空. 因此你可以插⼊1000 条具有相同键值的记录,当然它们都是空! 因为空值不存在于索引列中,所以WHERE⼦句中对索引列进⾏空值⽐较将使ORACLE停⽤该索引.代码如下:低效:(索引失效) SELECT … FROM DEPARTMENT WHERE DEPT_CODE IS NOT NULL;⾼效:(索引有效) SELECT … FROM DEPARTMENT WHERE DEPT_CODE >=0;4、注意通配符%的影响使⽤通配符的情况下Oracle可能会停⽤该索引。
浅谈Oracle数据库SQL性能优化

1引言 随着 软件 技术 的不 断发展 , 系统性 能越来 越重 要。 信息系统都 离不开 数据库应用, 而O r a c l e  ̄据库的应 用系统一般规模 比较大, 如 何优化O RAC L E 数据库 的性能就显得尤为重要 。 为 了保证O r a c l e  ̄ 据库运行在最佳 的性能状态下 , 在信息系统开发之前就应该考虑数 据库 的优化策 略。 优化策略一般包括服务器操作系统参数调整 、 数 据库参数调整 、 网络 性能调整 、 应用程序s Q 分析及设计等几个 方面 , 本文就如何优化s Q L 语句的方法 来实现对O RAC L E 数据库性 能的优化 。
时 间 最 少 的也 就 是 所 谓 成 本 最 低 的一 种 方 法 。
( 1 ) 索引优化 要尽可 能的使 用索引 , 减少磁盘 的I / 0 操作 。 ( 2 ) 连接手段 在进行查询连接 时优化器将所有连接 的方法全 来强迫选择最佳索引 。 部列举 出来 , 计算每一种连接的成本, 选择成本最低的一种 。 如连接 例如: s e l e c t * f r o m t b— — r p — — b i z s _ a p p — — f i n— — l i s t w h e r e a p p— — d a t e > 时用 到的数据 无法 获得 , 一般 系统会使 用平均密度作为依据 , 估算 y s d a t e 一1 a n d a p p — da t e <s ys da t e a n d e x c h — i d = 9 1 0 0 1 ’ 可能的命 中率 。 如, 一个存储过程或触 发器 中, 有表达 式的值在编译 s 时无法得到 , 优 化器 就只能使用 它的平均密度 来估 计命 中的记录 O RAC L E 选择 的是 e x c h _ i d 索引为先 , a p p _ d a t e 索引在后 , 数。 例如: D EC L ARE @v lu a e mo n e y 如果用RUL E 规则, 也只会选择 e x c h _ i d索引 , 表分析 后仍 不改变 S E L E C T n a me F RO M e mp l o y e e W HE R E s a l a r y =@v a l u e 选择 ( OR AC L E 对确 定条件的优先级权值 比非确定条件高 ) 只是 由于 ̄ a l u e 的值在执行 前不知道 , 它 只能使用其平均密度来估 解决方法 : 计这条命令将要命 中的记录数 。 a ) e x c h _ i d= ‘ 9 1 0 0 1 ’改 为 e x c h _ i d l l ”=‘ 9 1 0 0 1 ’ b ) s e l e c t后面使用强制索引条件 , 强制不让 使用e x c h _ i d 索引 ( 3 ) 其他 手段 如 , 数 据表 空间和索引表 空间的分 离 , 关系密切 的表之间的表空 间的分离 , 表 空间的物理分布 , 都可以提 高应用的 s e l ct/ e * + n o _ i n d e x ( a i d x _ r p — b i z s a p p f i n l i s t 一 5 ) / * f r o m t b —r p — bi z s _ a pp — in f _ l i s t a w he r e a p p— d a t e >s ys da t e —l a n d 性 能。 a p p _ d a t e <s ys d a t e a nd e xc h _ i d =’ 9 1 0 0 1 ’ 遵守这些原则就可 以优化排序操作 , 提 高s Q L 查询性 能。 2 ) 对于多表关联查询 , 需要通过观察执行计划和S QL 语句的关 3 Or a c l e 数据库S QL 查询优化的过程和方法 联条件 , 找出当前索引路径 , 分析最佳索引路径 , 通过屏 蔽等手段让 3 . 1 Or a c l e  ̄ l 据 库S QL 查询 语 句 处理过 程 下转第 1 9 6 页
oracle之使用OracleDeveloper对SQL进行简单调优(二)

oracle 之使⽤OracleDeveloper 对SQL 进⾏简单调优(⼆)使⽤Oracle Developer 对SQL 进⾏简单进⾏简单调优调优Oracle Developer 是Oracle 提供的免费数据库连接⼯具,⾏内数据中⼼⽣产操作间默认使⽤该⼯具执⾏SQL ,如遇到现场需要对⽣产SQL 进⾏优化查询的需要熟悉Oracle Developer 的基本使⽤,本⽂结合Oracle Developer ⼯具展⽰如何查看SQL ,如果进⾏基本优化。
⼀、 Oracle Developer 和 Oracle 命令1. Oracle DeveloperSQL 解释Oracle Developer ⼯具⾥⾯的“解释”功能只针对当前的sql 进⾏了⼀个预估的资源消耗以及执⾏路径,参考数据是系统⾥存在的表统计信息。
结果显⽰与实际执⾏可能存在差异,且表的详细信息,在其它功能下显⽰更为详细。
SQL 优化指导Oracle Developer ⼯具⾥⾯的sql 优化指导功能,对要优化分析的sql 进⾏了真实的执⾏,该功能展⽰的结果,包含了部分解释功能的结果,也就是根据表⾥⾯的统计信息预估的执⾏计划;它⼀般还包含优化建议;另外还展⽰了该sql 的实际执⾏计划和并⾏执⾏时的sql 性能结果。
SQL 跟踪Oracle Developer ⼯具⾥⾯的sql 跟踪功能,对要优化分析的sql 进⾏了实际的执⾏,详细的展⽰了执⾏过程中对 索引 CPU 缓存IO 和块的改变情况,也列出了执⾏过程中涉及的数据量和资源消耗;此功能包含了sql 解释中的表统计信息。
2. Oracle 命令autotraceOracle 命令 autotrace 是分析sql 的真实执⾏计划,查看sql 执⾏效率的⼀个⽐较简单⼜⽅便的⼯具。
它实际上是对sql 实际执⾏过程信息的⼀个收集和信息统计。
set autotrace on 开启autotrace ,后⾯执⾏sql 语句会⾃动显⽰sql 执⾏结果和跟踪信息。
oracle sql 优化技巧

oracle sql 优化技巧(实用版3篇)目录(篇1)1.Oracle SQL 简介2.优化技巧2.1 减少访问数据库次数2.2 选择最有效率的表名顺序2.3 避免使用 SELECT2.4 利用 DECODE 函数2.5 设置 ARRAYSIZE 参数2.6 使用 TRUNCATE 替代 DELETE2.7 多使用 COMMIT 命令2.8 合理使用索引正文(篇1)Oracle SQL 是一款广泛应用于各类大、中、小微机环境的高效、可靠的关系数据库管理系统。
为了提高 Oracle SQL 的性能,本文将为您介绍一些优化技巧。
首先,减少访问数据库的次数是最基本的优化方法。
Oracle 在内部执行了许多工作,如解析 SQL 语句、估算索引的利用率、读数据块等,这些都会大量耗费 Oracle 数据库的运行。
因此,尽量减少访问数据库的次数,可以有效提高系统性能。
其次,选择最有效率的表名顺序也可以明显提升 Oracle 的性能。
Oracle 解析器是按照从右到左的顺序处理 FROM 子句中的表名,因此,合理安排表名顺序,可以减少解析时间,提高查询效率。
在执行 SELECT 子句时,应尽量避免使用,因为 Oracle 在解析的过程中,会将依次转换成列名,这是通过查询数据字典完成的,耗费时间较长。
DECODE 函数也是一个很好的优化工具,它可以避免重复扫描相同记录,或者重复连接相同的表,提高查询效率。
在 SQLPlus 和 SQLForms 以及 ProC 中,可以重新设置 ARRAYSIZE 参数。
该参数可以明显增加每次数据库访问时的检索数据量,从而提高系统性能。
建议将该参数设置为 200。
当需要删除数据时,尽量使用 TRUNCATE 语句替代 DELETE 语句。
执行 TRUNCATE 命令时,回滚段不会存放任何可被恢复的信息,所有数据不能被恢复。
因此,TRUNCATE 命令执行时间短,且资源消耗少。
在使用 Oracle 时,尽量多使用 COMMIT 命令。
Oracle数据库参数优化

千里之行,始于足下。
Oracle数据库参数优化Oracle数据库参数优化是指通过调整数据库的配置参数,提高数据库的性能和稳定性。
下面是一些常见的Oracle数据库参数优化技巧:1. SGA参数优化:- 调整sga_target参数以控制SGA的大小。
SGA包括数据库缓冲区、共享池、重做日志缓冲区等,适当调整SGA的大小可以减少IO操作,提高数据库性能。
- 调整db_cache_size参数以增大数据库缓冲区的大小,提高数据块的访问速度。
- 调整shared_pool_size参数以增大共享池的大小,提高SQL语句的解析和执行效率。
2. PGA参数优化:- 调整pga_aggregate_target参数以控制PGA的大小。
PGA是用于处理SQL查询和排序的内存区域,适当调整PGA的大小可以减少磁盘IO操作,提高查询和排序的性能。
3. Redo日志参数优化:- 调整log_buffer参数以增大重做日志缓冲区的大小,减少频繁的重做日志刷新操作,提高数据库的写入性能。
- 调整log_checkpoint_timeout参数以控制重做日志刷新的频率,避免过于频繁的刷新。
4. 并行处理参数优化:- 调整parallel_max_servers参数以增大并行处理的资源限制,提高并行查询和并行DML操作的性能。
第1页/共2页锲而不舍,金石可镂。
- 调整parallel_min_servers参数以设置最小的并行处理资源数,避免并行操作的启动延迟。
5. SQL优化:- 使用合适的索引和优化的SQL语句,优化查询的执行计划。
- 使用绑定变量而不是直接将参数传递到SQL语句中,避免SQL重解析,提高性能。
6. 服务器参数优化:- 调整processes参数以增加数据库的并发连接数。
- 调整sessions参数以控制数据库的最大会话数。
- 调整open_cursors参数以增大打开游标的数量,避免游标溢出。
以上是一些常见的Oracle数据库参数优化技巧,但具体的优化策略需要根据实际情况进行调整,可以参考Oracle官方文档和专业的DBA建议。
Oracle数据库的SQL语句优化

文章 编 号 :06 7 (0 )30 2 -3 10 24 5 2 1 0 -140 1
汁 算 机 现 代 化 J U N IY I N AHU I A J U XA D I A S
总第 17期 8
O al 数 据 库 的 S L语 句 优 化 rc e Q
2 Wu a o gu If m t nT c n l yC . Ld , h n4 0 7 , hn ) . h nH n x n r ai e h oo o, t. Wu a 3 0 4 C i o o g a
Ab t a t I aa a e a p ia in s se ,p r r n e b c me n ft erman p o lms n e e o b e o v d w t h n sr c :n d t b s p l t y tms e o ma c e o s o e o i c o f h i r b e e d d t e r s le i t e i — h
钟小 权 叶 , 猛
( . 汉邮 电科 学 研 究 院研 究 生 院 , 北 武 汉 40 7 ; . 1武 湖 3 04 2 武汉 虹 旭 信 息技 术 有 限 责 任 公 司 , 北 武 汉 40 7 ) 湖 30 4 摘 要 : 着数 据 库 应 用 系统 中数 据 的增 加 , 随 系统 的性 能提 高成 为 数 据 库 系 统 中需 要 解 决 的 主 要 问 题 , 系统 硬 件 不 变 的 在 情 况 下 ,Q S L语 句 的 优化 成为 系统性 能提 高 的 主要 途 径 。 本 文通 过 分 析 O al 数 据 库 执 行 S L语 句 的 过 程 , 用 比 较 rc e Q 采 S L语 句优 化 之 前 和优 化之 后 的执 行 时 间和 调 用 的 数据 块数 量 方 法 来 判 断 优 化 效 果 , Q 最后 得 到 消耗 时 间 少和 调 用数 据 块 少 的 S L语 句。 Q
优化SQL对ORACLE数据库性能的提高

3科技资讯科技资讯S I N &T NOLOGY I NFO RM TI ON 2008NO .28SC I EN CE &TECH NO LOG Y I N FOR M A TI O N 信息技术大多数情况下,系统运行缓慢不是由于所有部件都饱和引起的,而是由于系统中的某个部分限制了整体的性能,这部分称为瓶颈。
通常影响ORA CL E 数据库性能指标的三个瓶颈主要是:CP U 、内存、I /O 。
数据库性能的优化主要是or a c l e 数据库参数的调整、磁盘I /O 调整、应用程序S QL语句分析及设计、网络性能调整等。
本文主要通过优化S QL 语句来提高ORACL E 数据库的性能。
1SQ L 语句处理流程如图1所示。
1.1打开游标从上图可以看出处理S QL 语句的第一步就是要打开一个游标,事实上,一个完整的S QL 处理过程就是一个游标的生命周期。
1.2共享SQLOr a cl e 内存中有一个区叫SHA R ED _PO OL ,这个区的主要作用就是将S Q L 语句存放在这个区内,当客户发出一个新的S QL 语句,数据库引擎首先会到这个区查找是否有相同的S QL ,如果有,则避免了解析、分析索引、制定执行计划等一系列的动作。
如果没有则需要进行ha r d pa r s e 。
1.3绑定变量如果在S QL 中指定了绑定变量,需要在这个阶段给S QL 附上绑定变量的值。
1.4并行处理如果S Q L 需要进行并行处理,在这一阶段需要把整个S Q L 分割成多个并行的部分。
1.5执行查询Or a c l e 按照执行计划指定的方式执行SQL,执行UPDATE 和DE LE TE 语句时,必须将行锁定,以免其他用户修改。
Or a cl e 先从数据库缓冲区中寻找是否存在所要的数据块,如果存在,就直接读或修改,否则从物理文件中读到数据库缓冲区中。
1.6返回结果对S EL ECT 语句需要返回结果的语句,首先看是否需要排序,需要,则排序后返回给用户,然后根据内存的大小不同,可以一次取出一行数据,也可以一次取一组数据。
常见Oracle数据库优化策略与方法

常见Oracle数据库优化策略与方法
Oracle数据库优化是提高数据库性能的关键步骤,可以采取多种策略。
以下是一些常见的Oracle数据库优化策略:
1.硬件优化:这是最基本的优化方式。
通过升级硬件,比如增加RAM、使用
更快的磁盘、使用更强大的CPU等,可以极大地提升Oracle数据库的性能。
2.网络优化:通过优化网络连接,减少网络延迟,可以提高远程查询的效率。
3.查询优化:对SQL查询进行优化,使其更快地执行。
这包括使用更有效的
查询计划,减少全表扫描,以及使用索引等。
4.表分区:对大表进行分区可以提高查询效率。
分区可以将一个大表分成多
个小表,每个小表可以单独存储和查询。
5.数据库参数优化:调整Oracle数据库的参数设置,使其适应工作负载,可
以提高性能。
例如,调整内存分配,可以提升缓存性能。
6.数据库设计优化:例如,规范化可以减少数据冗余,而反规范化则可以提
升查询性能。
7.索引优化:创建和维护索引是提高查询性能的重要手段。
但过多的索引可
能会降低写操作的性能,因此需要权衡。
8.并行处理:对于大型查询和批量操作,可以使用并行处理来提高性能。
9.日志文件优化:适当调整日志文件的配置,可以提高恢复速度和性能。
10.监控和调优:使用Oracle提供的工具和技术监控数据库性能,定期进行性
能检查和调优。
请注意,这些策略并非一成不变,需要根据实际情况进行调整。
在进行优化时,务必先备份数据和配置,以防万一。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据库的调优包括多个层面,如:操作系统调优、数据合理有效的存
储、数据库服务器参数调整、应用层调优等 对应用开发层的SQL的调优,是最直接有效的手段,可解决80%以上 对应用开发层的SQL的调优,是最直接有效的手段,可解决80%以上 的数据库访问效率问题 本次培训主要讲述一些书写高效SQL语句常用规则 本次培训主要讲述一些书写高效SQL语句常用规则
规则:总是使用索引的第一个列 规则:
如果索引是建立在多个列上(复合索引), 只有在它的第一个列 如果索引是建立在多个列上(复合索引),
(leading column)被where子句引用时,优化器才会选择使用该索引. column)被where子句引用时,优化器才会选择使用该索引. create table multiindexusage ( inda number , indb number , descr varchar2(10)); create index multindex on multiindexusage(inda,indb); 通过索引扫描: select * from multiindexusage where inda = 1; 全表扫描: select * from multiindexusage where indb = 1;
规则:合理有效的使用索引提高查询效率 规则:
在多数情况下,通过索引提高查询效率是非常有效的办法 索引一定要建的合理,并且被正确的使用 选择合适的索引列规则: 选择在where子句中常用的查询列做索引字段 选择在where子句中常用的查询列做索引字段 选择常用来关联表的字段做索引字段 对普通的B TREE索引,应该选择具有选择性高(high selectivity)的 对普通的B-TREE索引,应该选择具有选择性高(high selectivity)的 字段做索引字段,若字段的不同取值很少,即选择性低,则适合建位 图索引 不要在经常被修改的字段上建索引。索引会降低 update ,insert ,delete等操作的效率。 ,delete等操作的效率。
规则:避免改变索引列的类型 规则:
当比较不同数据类型的数据时, ORACLE自动对列进行简单的类型转换. 当比较不同数据类型的数据时, ORACLE自动对列进行简单的类型转换.
内部隐式的类型转变会降低执行效率,更重要的,如果转换列为索引 列,则由于内部转换(相当于对索引列进行了函数运算) 列,则由于内部转换(相当于对索引列进行了函数运算)的原因,该索 引将不被使用。例如: select * from user where user_id =123456 若user_id字段类型为字符串型,则oracle自动把上述语句修改为: user_id字段类型为字符串型,则oracle自动把上述语句修改为: select * from user where to_number(user_id) =123456 修改为: select * from user where user_id =to_char(123456) 由于类型转换也要耗费时间,最好避免,修改为: select * from user where user_id =‘123456’
规则:避免在索引列上使用计算或在非基于函数的 规则: 索引列上使用函数
如果一定要对使用函数的列启用索引, ORACLE新的功能: 基于函数的 如果一定要对使用函数的列启用索引, ORACLE新的功能:
索引(Function索引(Function-Based Index) 是一个较好的方案. 是一个较好的方案. CREATE INDEX EMP_I ON EMP (UPPER(ename)); /*建立基于函数的 /*建立基于函数的 索引* 索引*/ SELECT * FROM emp WHERE UPPER(ename) = ‘BLACKSNAIL’; /*将 /*将 使用索引* 使用索引*/ 基于函数的索引要求等式匹配 create index emp_ename_substr on eemp ( substr(ename,1,2) ); --高效 --高效 select * from emp where substr(ename,1,2)=’SM’;(INDEX RANGE SCAN ) --低效 --低效 select * from emp where subst查询效率 规则:
数据库表索引设计原则
表索引原则上在5个内; 单字段上索引原则上不能超过2个; 复合索引原则上一次包含字段不能超过3个; 分区表原则上全部使用本地索引(LOCAL) 注意:在用分析命令对分区索引进行分析时,每一个分区的数据 值的范围信息会放入Oracle的数据字典中。Oracle可以利用这个信息 来提取出那些只与SQL查询相关的数据分区。 例如,假设你已经定义了一个分区索引,并且某个SQL语句需要在一 个索引分区中进行一次索引扫描。Oracle会仅仅访问这个索引分区, 而且会在这个分区上调用一个此索引范围的快速全扫描。因为不需要 访问整个索引,所以提高了查询的速度。
规则:选择最有效率的表名顺序 规则:
ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此 ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,
FROM子句中写在最后的表( FROM子句中写在最后的表(基础表 也叫驱动表 driving table)将被 table)将被 最先处理. 最先处理. 在FROM子句中包含多个表的情况下,应该选择记录条数最少的表作为 FROM子句中包含多个表的情况下, 基础表. ORACLE处理多个表时, 会运用排序及合并的方式连接它们. 基础表.当ORACLE处理多个表时, 会运用排序及合并的方式连接它们. 首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行排序, 首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行排序,然 后扫描第二个表(FROM子句中最后第二个表),最后将所有从第二个表 后扫描第二个表(FROM子句中最后第二个表),最后将所有从第二个表 中检索出的记录与第一个表中合适记录进行合并. 中检索出的记录与第一个表中合适记录进行合并. 如果有3个以上的表连接查询, 那就需要选择交叉表(intersection 如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表. table)作为基础表, 交叉表是指那个被其他表所引用的表.
规则:合理有效的使用索引提高查询效率 规则:
通过索引查询,得到查询结果分成两个步骤,首先扫描索引找到符合
条件的记录的rowid,然后再根据rowid从记录表中得到结果记录。 条件的记录的rowid,然后再根据rowid从记录表中得到结果记录。 当查询返回的记录数很多时,从记录表中读取的数据量也很大,不如 不通过索引,直接全表扫描效率更高。( 不通过索引,直接全表扫描效率更高。(一般建议在查询数据量10%以 下使用索引) )
规则:合理有效的使用索引提高查询效率 规则:
B*TREE索引 TREE索引
模拟为二叉树数据结构, 模拟为二叉树数据结构,有两个记录项 rowid (它是行的物理位置) (它是行的物理位置) 正被索引的列值 位图索引(bitmap) 位图索引(bitmap) 以矩阵模式为基础,对于每一行, 以矩阵模式为基础,对于每一行,将位图于它的匹配值相对应 位图索引在oracle的数据仓库应用中常用。 位图索引在oracle的数据仓库应用中常用。 相比与B_TREE索引,位图索引效率更高,占用空间更小。 相比与B_TREE索引,位图索引效率更高,占用空间更小。 对低选择性的字段,可以考虑建位图索引。
规则:避免在索引列上使用计算或在非基于函数的 规则: 索引列上使用函数
常见的未正确使用索引的例子 :
在下面的例子里, 在下面的例子里, ‘!=' 将不使用索引. 记住, 索引只能告诉你什 将不使用索引. 记住, 么存在于表中, 而不能告诉你什么不存在于表中. 么存在于表中, 而不能告诉你什么不存在于表中. 不使用索引: 不使用索引: SELECT ACCOUNT_NAME FROM TRANSACTION WHERE AMOUNT !=0; 使用索引: 使用索引: SELECT ACCOUNT_NAME FROM TRANSACTION WHERE AMOUNT >0;
规则:避免在索引列上使用NOT与<> NOT与 规则:避免在索引列上使用NOT
NOT会产生和在索引列上使用函数相同的影响. ORACLE”遇 NOT会产生和在索引列上使用函数相同的影响. 当ORACLE”遇 到”NOT,会停止使用索引转而执行全表扫描. 到”NOT,会停止使用索引转而执行全表扫描. 当在索引列上使用<>时,ORACLE也会会停止使用索引转而执行全表扫 当在索引列上使用<>时,ORACLE也会会停止使用索引转而执行全表扫 描.
规则:选择最有效率的表名顺序 规则:
注意:上述表明顺序规则并不是绝对的,不同的优化方式配置
(rule-based or cost-based),可能有不同的结果。此条规则可以 rulecost-based),可能有不同的结果。此条规则可以 这样理解:尝试调整from后各个表的顺序,往往可以优化sql的查询 这样理解:尝试调整from后各个表的顺序,往往可以优化sql的查询 效率,最合理的表名顺序应该根据实际的运行结果并结合执行计划分 析确定
规则:避免在索引列上使用计算或在非基于函数的 规则: 索引列上使用函数
下面的例子中, ‘||'是字符连接函数. 就象其他函数那样, 下面的例子中, ‘||'是字符连接函数. 就象其他函数那样, 停用了索 引. 不使用索引: 不使用索引: SELECT ACCOUNT_NAME,AMOUNT FROM TRANSACTION WHERE ACCOUNT_NAME||ACCOUNT_TYPE='AMEXA'; 使用索引: 使用索引: SELECT ACCOUNT_NAME,AMOUNT FROM TRANSACTION WHERE ACCOUNT_NAME = ‘AMEX' AND ACCOUNT_TYPE=' A';