Oracle数据库优化

合集下载

oracle数据库性能调优

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优化方法总结

oracle优化方法总结

千里之行,始于足下。

oracle优化方法总结Oracle优化是提高数据库性能和响应能力的重要步骤。

本文总结了一些常见的Oracle优化方法。

1. 使用索引:索引是提高查询性能的主要方法。

通过在表中创建适当的索引,可以加快查询速度,并减少数据访问的开销。

但是要注意不要过度使用索引,因为过多的索引会增加写操作的开销。

2. 优化查询语句:查询语句的效率直接影响数据库的性能。

可以通过合理地编写查询语句来提高性能。

例如,使用JOIN来替代子查询,尽量避免使用通配符查询,使用LIMIT来限制结果集的大小等。

3. 优化表结构:表的设计和结构对数据库的性能也有很大的影响。

合理的表设计可以减少数据冗余和不必要的数据存储,提高查询速度。

例如,适当地使用主键、外键和约束,避免过多的数据类型和字段等。

4. 优化数据库参数设置:Oracle有很多参数可以用来调整数据库的性能。

根据具体的应用场景和需求,可以根据情况调整参数的值。

例如,调整SGA和PGA的大小,设置合适的缓冲区大小,调整日志写入方式等。

5. 使用分区表:当表的数据量很大时,可以考虑将表分成多个分区。

分区表可以加速查询和维护操作,提高数据库的性能。

可以按照时间、地域、业务等来进行分区。

6. 优化存储管理:Oracle提供了多种存储管理选项,如表空间和数据文件管理。

合理地分配存储空间和管理数据文件可以提高数据库的性能。

例如,定期清理无用的数据文件,使用自动扩展表空间等。

第1页/共2页锲而不舍,金石可镂。

7. 数据压缩:对于大量重复数据或者冷数据,可以考虑使用Oracle的数据压缩功能。

数据压缩可以减少磁盘空间的使用,提高IO性能。

8. 使用并行处理:对于大型计算或者批处理任务,可以考虑使用Oracle的并行处理功能。

并行处理可以将任务分成多个子任务,并行执行,提高处理能力和效率。

9. 数据库分区:对于大型数据库,可以考虑将数据库分成多个独立的分区。

数据库分区可以提高数据的并行处理能力,减少锁竞争和冲突,提高数据库的性能。

Oracle数据库内存优化操作说明

Oracle数据库内存优化操作说明

Oracle数据库内存优化操作说明Oracle数据库内存优化是提高数据库性能的重要手段之一。

通过设置合理的内存参数,可以有效地削减IO操作,提高数据访问速度。

本文将介绍一些常见的Oracle数据库内存优化操作。

一、调整PGA参数PGA(Program Global Area)是每个数据库会话独有的内存区域,用于存储排序、哈希操作等临时数据。

调整PGA参数可以提高排序和连接操作的性能。

1. 设置PGA_AGGREGATE_TARGET参数该参数把握PGA内存的总量,一般建议设置为SGA的1/3到1/2。

可以通过以下命令设置:ALTER SYSTEM SET PGA_AGGREGATE_TARGET=XXXM;2. 调整SORT_AREA_SIZE参数该参数把握每个排序操作使用的PGA内存大小,一般建议设置为100MB到200MB。

可以通过以下命令设置:ALTER SESSION SET SORT_AREA_SIZE = XXXM;3. 调整HASH_AREA_SIZE参数第1页/共4页该参数把握每个哈希操作使用的PGA内存大小,一般建议设置为SORT_AREA_SIZE的1/2到1倍。

可以通过以下命令设置:ALTER SESSION SET HASH_AREA_SIZE = XXXM;二、调整SGA参数SGA(System Global Area)是Oracle数据库的全局共享内存区域,用于存储缓存数据、SQL执行方案等。

调整SGA参数可以提高数据访问的速度。

1. 调整SHARED_POOL_SIZE参数该参数把握缓存SQL语句的内存大小,一般建议设置为SGA的1/4到1/3。

可以通过以下命令设置:ALTER SYSTEM SET SHARED_POOL_SIZE=XXXM;2. 调整DB_CACHE_SIZE参数该参数把握数据库缓冲区的内存大小,一般建议设置为SGA的1/2到2/3。

可以通过以下命令设置:ALTER SYSTEM SET DB_CACHE_SIZE=XXXM;3. 调整LOG_BUFFER参数该参数把握数据库日志缓冲区的内存大小,一般建议设置为10MB到100MB。

Oracle数据库参数优化

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性能优化面试题

oracle性能优化面试题

oracle性能优化面试题一、概述Oracle性能优化是数据库管理中的重要环节,通过合理的调整和优化,可以提升数据库的运行效率和响应速度,提高系统的稳定性和可用性。

在面试中,常常会涉及到Oracle性能优化相关的问题,下面是一些常见的Oracle性能优化面试题。

二、索引优化1. 请说明什么是索引?索引是一种特殊的数据库对象,它能够加快数据库的查询速度。

索引由一个或多个列组成,它们的值会按照一定的顺序进行排序,并建立索引数据结构以支持快速查找。

2. 如何确定何时创建索引?创建索引需要权衡查询的速度和更新的效率。

一般来说,当查询的频率远远大于更新的频率时,可以考虑创建索引。

同时也需要考虑查询的字段是否经常被使用,以及查询的覆盖度等因素。

3. 请说明常见的索引类型?常见的索引类型包括唯一索引、非唯一索引、主键索引、聚簇索引和非聚簇索引等。

4. 如何选择合适的索引?选择合适的索引需要考虑查询的频率、更新的频率、查询的覆盖度等因素。

同时还需要考虑索引的大小以及对于查询的影响。

三、SQL优化1. 请说明常见的SQL调优手段?常见的SQL调优手段包括使用合适的索引、优化SQL语句的写法、使用合适的连接方式、减少数据库的访问次数等。

2. 如何使用执行计划进行SQL优化?执行计划是Oracle数据库为了优化查询语句而生成的查询执行计划,其中包含了查询的操作步骤、连接方式、访问路径等信息。

可以通过查看执行计划来判断查询是否需要进行优化,并通过优化查询的方式来提升性能。

3. 如何优化大表查询?优化大表查询可以通过分页查询、增加条件过滤、创建合适的索引等方式来进行。

同时也可以考虑对大表进行分区或者分表的方式来提高查询效率。

四、资源优化1. 如何优化内存资源?优化内存资源可以通过调整SGA和PGA的大小来实现。

SGA包括共享池、数据库缓存和重做日志缓冲等,可以通过调整参数来合理分配内存。

PGA是为每个会话分配的私有内存区域,可以通过调整PGA_AGGREGATE_TARGET参数来优化。

0racle数据库的优化探讨

0racle数据库的优化探讨

0racle数据库的优化探讨摘要:Oracle数据库作为全球第一大数据库厂商,在国内外获得了广泛应用,本文对Oracle数据库性能调整和优化进行了简要分析和研究,对各种优化技术进行了深入的探讨,将SQL语句优化、Oracle内存分配调整作为论文的主要研究内容。

关键词:数据库优化随着数据库规模的扩大,用户数量的增加,数据库应用系统的响应速度下降,性能问题越来越突出。

数据库系统的性能调整与优化对于整个系统的正常运行起着至关重要的作用。

基于此,本文主要研究SQI 语句、Oracle内存分配的性能优化问题,给出了一般情况下Oracle数据库应用系统的性能优化方一法,以期推动Oracle数据库性能优化技术的发展。

1 SQL查询优化数据库系统是管理信息系统的核心,从大多数系统的应用实例来看,查询操作在各种数据库操作中占据的比重最大,查询速度的快慢直接影响数据库的推广和应用,对于大型数据库来说,这一点显得尤其重要。

由于查询操作在SQL语句中代价最大,因此优质的查询语句可以大大提高应用系统的性能。

1.1 查找有问题的SQL语句①利用SQL Trace工具分析SQL语句。

Oracle的SQL Trace工具是确定SQL语句是否被合理优化的最好方法之一。

如果发现当前会话行为异常或性能下降,则可以通过该工具获得有关系统操作性能的信息,如解析、执行和返回数据的次数、CPU时间和执行时间、物理读和逻辑读操作次数、库缓冲区命中率等。

一旦为会话激活了SQL-TRACE Oracl。

就会在udump管理区创建跟踪文件。

由于SQL Trace将这些信息以一种不可读的格式存放在跟踪文件中,因p一个字段的标签同时在主查询和where子句中的查询中出现,那么当主查询中的字段值改变之后,子查询必须重新查询一次。

对于子查询来说,查询嵌套层次越多,效率越低,因此应当尽量避免它。

如果子查询不可避免,那么要在子查询中过滤掉尽可能多的行。

在Oracle中相关子查询的执行效率特别低,引入临时表可以使其速度快100倍左右。

oracle数据库级别优化分析工具介绍

oracle数据库级别优化分析工具介绍

oracle数据库级别优化分析工具介绍当我们对数据库优化诊断时,需要收集相应的信息以供参考,从个人的使用经验来说,这种统计数据分为两大类一类是数据库级别的统计信息二类是os级别的统计信息下面就分别介绍在不一致的级别下,常用什么工具来收集信息帮助优化诊断首先是oracle数据库级别优化分析工具介绍目录:1.statspack2.ASH3.AWR4.ORACLE EXPLAIN PLAN的总结(查询sql的执行计划)a.autotraceb.explain的使用1.statspacka。

安装sql> sqlplus "/ as sysdba"SQL> select file_name from dba_data_files;SQL> create tablespace perfstat datafile 'e:\oracle\oradata\skate\perfstat.d bf' size 2000m;sql> @ORACLE_HOME\rdbms\admin\spcreate.sqlb。

使用SQL> conn perfstat/passwd收集统计信息sql> execute statspack.snap或者SQL> exec statspack.SNAP(i_snap_level =>5);生成报告sql> @ORACLE_HOME\rdbms\admin\spreport.sql定时收集信息有两种方式,一种是oracle job,一种是os的crontab,我比较习惯用o s级别的crontab设定其每个小时自动收集一次采样的jobdeclareVariable job number ;begindbms_job.submit(:job, "statspack.snap;" ,trunc( sysdate + 1/24 , 'hh24' ), "trunc(sysdate+1/24,'hh24')" );commit ;end ;/查看job使用情况SQL> select job,schema_user,next_date,interval,what from user_jobs自动停止采样jobdeclareVariable job number ;begindbms_job.submit(:job, "dbms_job.broken(44,true);" ,trunc( sysdate + 1 ), "null" );commit ;end ;/清空所有stats统计信息表里的数据sql> @ORACLE_HOME\rdbms\admin\sptrunc.sqlsnapshot的level,这能够通过EXEC STATSPACK.MODIFY_STATSPACK_PARAME TER(i_snap_level=N)来修改,N能够为0,5,6,7,10,缺省为5。

常见Oracle数据库优化策略与方法

常见Oracle数据库优化策略与方法

常见Oracle数据库优化策略与方法
Oracle数据库优化是提高数据库性能的关键步骤,可以采取多种策略。

以下是一些常见的Oracle数据库优化策略:
1.硬件优化:这是最基本的优化方式。

通过升级硬件,比如增加RAM、使用
更快的磁盘、使用更强大的CPU等,可以极大地提升Oracle数据库的性能。

2.网络优化:通过优化网络连接,减少网络延迟,可以提高远程查询的效率。

3.查询优化:对SQL查询进行优化,使其更快地执行。

这包括使用更有效的
查询计划,减少全表扫描,以及使用索引等。

4.表分区:对大表进行分区可以提高查询效率。

分区可以将一个大表分成多
个小表,每个小表可以单独存储和查询。

5.数据库参数优化:调整Oracle数据库的参数设置,使其适应工作负载,可
以提高性能。

例如,调整内存分配,可以提升缓存性能。

6.数据库设计优化:例如,规范化可以减少数据冗余,而反规范化则可以提
升查询性能。

7.索引优化:创建和维护索引是提高查询性能的重要手段。

但过多的索引可
能会降低写操作的性能,因此需要权衡。

8.并行处理:对于大型查询和批量操作,可以使用并行处理来提高性能。

9.日志文件优化:适当调整日志文件的配置,可以提高恢复速度和性能。

10.监控和调优:使用Oracle提供的工具和技术监控数据库性能,定期进行性
能检查和调优。

请注意,这些策略并非一成不变,需要根据实际情况进行调整。

在进行优化时,务必先备份数据和配置,以防万一。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

• 数据库SQL分页 采用数据库SQL分页需要两次SQL完成 一个SQL计算总数量 一个SQL返回分页后的数据 优点:性能好 缺点:编码复杂,各种数据库语法不同, 需要两次SQL交互。
• 2、只返回需要的字段 通过去除不必要的返回字段可以提高性能,例: 调整前:select * from product where company_id=?; 调整后:select id,name from product where company_id=?; 优点: 1、减少数据在网络上传输开销 2、减少服务器数据处理开销 3、减少客户端内存占用 4、字段变更时提前发现问题,减少程序BUG 5、如果访问的所有字段刚好在一个索引里面,则可以使用 纯索引访问提高性能。 缺点:增加编码工作量 由于会增加一些编码工作量,所以一般需求通过开发规范来 要求程序员这么做,否则等项目上线后再整改工作量更大。
位置。ROWID内容包括文件号、对像号、数据块号、 记录槽号 。
• 三、数据库访问优化法则详解 • 1、减少数据访问 • 1.1、创建并使用正确的索引
• 索引会大大增加表记录的DML(INSERT,UPDATE,DELETE)开销,正
确的索引可以让性能提升100,1000倍以上,不合理的索引也可能会 让性能下降100倍 。

使用存储过程

大型数据库一般都支持存储过程,合理的利用存储过程也可以提高系统性能。如 你有一个业务需要将A表的数据做一些加工然后更新到B表中,但是又不可能一条 SQL完成,这时你需要如下3步操作:
数据块是数据库中数在磁盘中存储的最小单位,也是一 次IO访问的最小单位,一个数据块大小DBA在创建数据
库或表空间时指定,可指定为2k、4K、8K、16K或
32K字节,一个数据库可以包括多个数据文件,一个数 据文件内又包含多个数据块 。
2、ROWID
ROWID是每条记录在数据库中的唯一标识,通过
ROWID可以直接定位记录到对应的文件号及数据块
• • •
小表(记录数小于10000行的表):筛选比例<10%; 大表:(筛选返回记录数)<(表总记录数*单条记录长度)/10000/16 单条记录长度≈字段平均内容长度之和+字段数*2
• 如何知道SQL是否使用了正确的索引? • 简单SQL可以根据索引使用语法规则判断,复杂的
SQL不好办,判断SQL的响应时间是一种策略,但
• •
我们一般在什么字段上建索引? 这是一个非常复杂的话题,需要对业务及数据充分分析后再能得出结果。主键 及外键通常都要有索引,其它需要建索引的字段应满足以下条件:
• • • •
1、字段出现在查询条件中,并且查询条件可以使用索引; 2、语句执行频率高,一天会有几千次以上; 3、通过字段条件可筛选的记录集很小,那数据筛选比例是多少才适合? 这个没有固定值,需要根据表数据量来评估,以下是经验公式,可用于快速评 估:
• 索引对于Update性能降低47%
• 索引对于Delete性能降低29%
• 因此对于写IO压力比较大的系统,表的索引需要仔细评估
必要性,另外索引也会占用一定的存储空间。
• 只通过索引访问数据 • 有些时候,我们只是访问表中的几个字段,并且字段内容较少, 我们可以为这几个字段单独建立一个组合索引,这样就可以直 接只通过访问索引就能得到数据,一般索引占用的磁盘空间比 表小很多,所以这种方式可以大大减少磁盘IO开销。 • 如:select id,name from company where type='2'; • 如果这个SQL经常使用,我们可以在type,id,name上创建组合 索引 • create index my_comb_index on company(type,id,name); • 有了这个组合索引后,SQL就可以直接通过my_comb_index 索引返回数据,不需要访问company表。 • 切记,性能优化是无止境的,当性能可以满足需求时即可, 不要过度优化。在实际数据库中我们不可能把每个SQL请求 的字段都建在索引里,所以这种只通过索引访问数据的方法一 般只用于核心应用,也就是那种对核心表访问量最高且查询字 段数据量很少的查询。
• 二、返回更少的数据
• 1、数据分页处理:客户端分页(应用程序或者浏览器)、应用服务器 分页、数据库SQL分页。
客户端分页:
将数据从应用服务器全部下载到本பைடு நூலகம்应用程序或浏览器,在应用
程序或浏览器内部通过本地代码进行分页处理
优点:编码简单,减少客户端与应用服务器网络交互次数 缺点:首次交互时间长,占用客户端内存 适应场景:客户端与应用服务器网络延时较大,但要求后续操作 流畅,如手机GPRS,超远程访问(跨国)等等。
数据库访问性能优化
2012-05-25
• 一、数据库优化法则
1、减少数据访问(减少硬盘访问)
2、返回更少数据(减少网络传输或磁盘访问)
3、减少交互次数(减少网络传输) 4、减少服务器CPU开销(减少CPU及内存开销) 5、利用更多的资源(增加资源)
•二、Oracle数据库两个基本概念 1、数据块(Block)
• 设置Fetch Size 当我们采用select从数据库查询数据时, 数据默认并不是一条一条返回给客户端的, 也不是一次全部返回客户端的,而是根据 客户端fetch_size参数处理,每次只返回 fetch_size条记录,当客户端游标遍历到尾 部时再从服务端取数据,直到最后全部传 送完成。所以如果我们要从服务端一次取 大量数据时,可以加大fetch_size,这样可 以减少结果数据传输的交互次数及服务器 数据准备时间,提高性能。
• 3、减少交互次数 • batch DML 数据库访问框架一般都提供了批量提交的接口,jdbc 支持batch的提交处理方法,当你一次性要往一个表中插 入1000万条数据时,如果采用普通的executeUpdate处理, 那么和服务器交互次数为1000万次,按每秒钟可以向数据 库服务器提交10000次估算,要完成所有工作需要1000秒。 如果采用批量提交模式,1000条提交一次,那么和服务器 交互次数为1万次,交互次数大大减少。采用batch操作一 般不会减少很多数据库服务器的物理IO,但是会大大减少 客户端与服务端的交互次数,从而减少了多次发起的网络 延时开销,同时也会降低数据库的CPU开销。
通过这样处理可以大大减少SQL请求的数量,从而提高性能。那如果有10000 个ID,那是不是全部放在一条SQL里处理呢?答案肯定是否定的。首先大部 份数据库都会有SQL长度和IN里个数的限制,如ORACLE的IN里就不允许超 过1000个值。 另外当前数据库一般都是采用基于成本的优化规则,当IN数量达到一定值时 有可能改变SQL执行计划,从索引访问变成全表访问,这将使性能急剧变化。 随着SQL中IN的里面的值个数增加,SQL的执行计划会更复杂,占用的内存 将会变大,这将会增加服务器CPU及内存成本。
INDEX_COLUMN <= ?
INDEX_COLUMN between ? and ?
INDEX_COLUMN in (?,?,...,?)
INDEX_COLUMN like ?||'%'(后导模糊查询) T1. INDEX_COLUMN=T2. COLUMN1(两个表通过索引字段关联)
• SQL什么条件不会使用索引? •
• 常见的索引有B-TREE索引、位图索引、全文索引,位图索引一般用
于数据仓库应用,全文索引由于使用较少。 • B-TREE索引包括很多扩展类型,如组合索引、反向索引、函数索引 等等。 • 一个表中可以建多个索引,一个索引也可以由多个字段组成,称为组 合索引。
• SQL什么条件会使用索引? • 当字段上建有索引时,通常以下情况会使用索引: INDEX_COLUMN = ? INDEX_COLUMN > ? INDEX_COLUMN >= ? INDEX_COLUMN < ?
• 目前ORACLE有SQL执行计划的算法约300种,而且一直在增加,所以
SQL执行计划是一个非常复杂的课题,一个普通DBA能掌握50种就很不错 了,就算是资深DBA也不可能把每个执行计划的算法描述清楚。虽然有这
么多种算法,但并不表示我们无法优化执行计划,因为我们常用的SQL执
行计划算法也就十几个,如果一个程序员能把这十几个算法搞清楚,那就 掌握了80%的SQL执行计划调优知识。
是这会受到数据量、主机负载及缓存等因素的影响, 有时数据全在缓存里,可能全表访问的时间比索引 访问时间还少。要准确知道索引是否正确使用,需 要到数据库中查看SQL真实的执行计划,这个话题 比较复杂,详见SQL执行计划专题介绍。 •
• 索引对DML(INSERT,UPDATE,DELETE)附加的开销有多 少? • 这个没有固定的比例,与每个表记录的大小及索引字段大 小密切相关,以下是一个普通表测试数据,仅供参考: • 索引对于Insert性能降低56%
如 果你的查询表中有大字段或内容较多的字段,如备注信息、文 件内容等等,那在查询表时一定要注意这方面的问题,否则可能会带 来严重的性能问题。如果表经常要 查询并且请求大内容字段的概率很 低,我们可以采用分表处理,将一个大表分拆成两个一对一的关系表, 将不常用的大内容字段放在一张单独的表中。如一张存储上 传文件的 表: T_FILE(ID,FILE_NAME,FILE_SIZE,FILE_TYPE,FILE_CONTENT) 我们可以分拆成两张一对一的关系表: T_FILE(ID,FILE_NAME,FILE_SIZE,FILE_TYPE) T_FILECONTENT(ID, FILE_CONTENT) 通过这种分拆,可以大大提少T_FILE表的单条记录及总大小,这样在 查询T_FILE时性能会更好,当需要查询FILE_CONTENT字段内容时 再访问T_FILECONTENT表。
相关文档
最新文档