文档库 最新最全的文档下载
当前位置:文档库 › oracle优化

oracle优化

oracle优化
oracle优化

数据库系统和操作系统一样,在计算机上安装成功后,还需要进一步配置和优化,从而使其具有更强大的功能和运行在最佳状态。如果在设计阶段因为各种因素没有进行较为合理的配置和计划,那么就需要在后期对数据库系统进行优化。

数据库系统性能的优化,除了在设计阶段对其逻辑存储结构和物理存储结构设计进行优化,使之在满足需求条件下,时空开销性能最佳外,还可在运行阶段,采取一些优化措施,使系统性能最佳。本专题所讨论的性能优化主要指运行阶段的性能优化,即讨论如何使用Oracle 所提供的优化手段来提高系统性能。大多数性能问题并不是一种孤立的症状,而是系统设计的结果,因此性能优化就集中在那些导致不可接受特征的同一的、固定的和潜在的问题上。优化是数据库设计中“计划”、“设计”、“监视”和“优化”四大步骤的最后一步。除了用Oracle优化器来优化数据库的性能外,DBA还可通过优化Oracle的参数设置等手段来优化数据库的性能,对参数的细微优化便能影响系统整体性能。

为了有目的优化系统性能,首先应明确优化目标,然后再根据目标优化各种初始参数的设置,以达到更好效果。可有如下几个优化目标:

◆应用程序设计的优化

◆指定类型SQL语句的优化

◆内存使用的优化

◆数据存储、物理存储和逻辑存储的优化

◆网络通信量的优化

DBA可选定上述一个或多个目标来实施优化。性能优化主要是通过优化初始化参数来实现。本专题从以下几个方面来谈谈如何优化Oracle数据库,使其具有最佳性能。

(1)优化初始参数

(2)优化内存

(3)优化I/O

(4)优化资源争用

(5)其它参数优化

可变参数的优化

在对Oracle数据库进行优化时,需要用到许多的参数,其中有一部分参数对系统性能影响较大,这部分参数叫可变参数。可变参数按其作用可以分为两大类,一大类是起限制作用的,如OPEN_CURSORS;另一大类是影响系统性能的,如DB_BLOCK_BUFFERS。

在进行数据库系统性能优化时,需要熟练掌握和了解一些可变参数。本文讨论了一些对系统性能有较大影响的参数。

限制类可变参数

(1)DML_LOCKS

该参数表明多少个用户,可同时能修改多少张表。例如:有三个用户同时修改二张表,则要求表上的总数为6。若置为0,则组织队列不起作用,其性能会稍有提高。使用该参数时不能用DROP TABLE、CREATE INDEX或显式封锁。

(2)LICENSE_MAX_SESSION

该参数指出允许并发用户会话的最大数。若此参数为0,则不能实施并发。若并发的用户会话数已达到此极限,则只有具有RESTRICTED SESSION权限的用户才能连接到服务器。(3)LICENSE_MAX_USERS

该参数指出在一个数据库上可建立的最大用户数。当达到最大值时,便不能再建新用户,可改变此值以放松限制。在LICENSE_MAX_SESSION或LICENSE_MAX_USER为0时,则并发会话或任何用户都不能用。若对不同的实例,此参数不同时,则以第一个登录的数据库实例的参数为准。

(4)MAX_DUMP_FILE_SIZE

该参数指定操作系统中写跟踪文件的块的最大值。可用此值来限制跟踪文件的空间。

(5)OPEN_CURSORS

该参数指明一个用户进程能同时打开光标的最大数,它能限制每个用户进程占用的内存空间量。

(6)OPEN_LINKS

该参数指定并发连接到远程数据库的最大用户进程数。若同时引用多个数据库,则应该增大该值。例如:同时交替访问A、B和C三个数据库时,若OPEN_LINKS设置为2,则需花费等待连接时间。此参数只用于分布事务。若该参数设置为0,则不允许进行分布事务处理。(7)PROCESS

该参数指定同时连接到Oracle服务器上的最大用户进程数。该参数值包括6个后台进程和一个登录,因此,该参数值为20,则只能有13或14个并发用户连接到服务器。

(8)ROW_LOCKING

该参数指定行封锁方式。若设置为“ALWAYS”,则在修改表时只实施行封锁。若设置为“INTENT”时,则行封锁只适用于SELECT FOR UPDATE,而在修改时实施表封锁。

影响系统性能类可变参数

(1)CHECKPOINT_PROCESS

该参数根据是否要求检查点而设置成TRUE或者FALSE。当所有缓冲区的信息写到磁盘时,检查点进程(CHPT)建立一个静态的点。在归档日志文件中做一个记号表示有一个检查点发生。检查点发生在归档日志转换的时候或当达到log_checkpoint_interval定义的块数的时候。当设置此参数为TRUE时,后台进程CHPT便可工作。在检查点期间内,若日志写进程(LGWR)的性能减低,则可用CHPT进程加以改善。

(2)DB_BLOCK_CHECKPOINT_BATCH

该参数的值设置得较大时,可加速检查点的完成。当指定的值比参数

DB_BLOCK_CHECKPOINT_BATCH大时,其效果和指定最大值相同。

(3)DB_BLOCK_BUFFERS

该参数是在SGA中可作缓冲用的数据库块数。该参数决定SGA的大小,对数据库性能具有决定性因素。若取较大的值,则可减少I/O次数,但要求内存空间较大。每个缓冲区的大小由参数DB_BLOCK_SIZE决定。

(4)DB_BLOCK_SIZE

该参数表示Oracle数据库块的大小,以字节为单位,典型值为2048或4096。该值一旦设定则不能改变。它影响表及索引的FREELISTS参数的最大值。

(5)DB_FILES

该参数为数据库运行时可打开的数据文件最大数目。

(6)DB_FILE_MULTIBLOCK_READ_COUNT

该参数表示在顺序扫描时一次I/O操作可读的最大块数,该最大块数取决于操作系统,其值在4至16或者32是比较好。

(7)D1SCRETE_TRANSACTION_ENABLED

该参数实现一个更简单、更快的回滚机制,以改进某些事务类型的性能。当设置为TRUE 时,可改善某些类型的事务性能。

(8)LOG_ARCHIVE_BUFFER_SIZE

此参数的值依赖于操作系统,它与LOG_ARCHIVE_BUFFER 参数一起用于调整有归档日志的运行,使其运行速度尽量加快,但不能快到降低性能。仅当直接归档到磁带设备时才需要增加这些参数的值,重做日志缓冲区要等待归档日志缓冲区变得可用。

(9) LOG_ARCHIVE_BUFFER

该参数指定用于归档的日志时的缓冲区数。

(10) LOG_BUFFER

该参数指明分配给SGA中的日志缓冲区的字节数,该参数值较大时,可减少日志I/O的次数。对于繁忙的系统不宜采用大于或等于64K的值。缺省值—般为数据库块的4倍。(11)LOG_CHECKPOINT_TIMEOUT

该参数指明两个检查点之间的时间间隔,若指定为0时,则说明不允许进行基于时间的检查点。

(12)LOG_CHECKPOINT_INTERVAL

该参数用来确定检查点进程的执行频率。这个数值设置成取检查点之前处理的重做缓冲区块的数量。

(13)LOG_FILES

该参数指定运行期间数据库可打开的日志文件数。若需要较大的SGA空间,而不需多个日志文件,则可减少该值。

(14)LOG_SIMULTANEOUS_COPIES

该参数是日志缓冲区副本闩锁的最大数,为同时写日志项所用。为提高性能,可设置此参数

为两倍的CPU数,对单进程系统,该值多数设置为0,此时断开闩锁。

(15)LOG_SMALL_ENTRY_MAX_SIZE

该参数与LOG_SIMULTANEOUS_COPIES参数配合使用。若日志项大于此项,则在给缓冲区分配空间并获得日志复制闩锁之后,用户进程释放日志复制闩锁。

(16)OPTIMIZRER_MODE

若该参数的值为RULE,则ORACLE优化器选择基于规则的优化;若设置为COST,并且在数据字典中存在有统计信息,则优化器选择基于代价的优化方法进行优化。

(17)SEQUENCE_CACHE_ENTRIES

该参数指明在SGA中可进行高速缓存的序列数,用于直接存取。该高速缓存区是基于最近最少使用(LRU)的算法进行管理的。若此值设置得较高,则可达到较高的并发性。

(18)SEQUENCE_CACHE_HASH_BUCKETS

该参数用于加速查看高速缓冲区最近请求的最新序列的桶式地址数,每个桶式地址占8个字节。高速缓冲区以散列表排列,该参数应为质数。

(19)SERIALIZEABLE

此参数用于保证重复读的一致性。当它设置为TRUE时,查询可保证表级读一致,以防止在此查询提交之前的修改。

(20)SHARED_POOL_SIZE

该参数指定共享池的大小,其中包括共享光标及存储过程。在多用户系统中,较大的SHARED_POOL_SIZE值可改善SQL语句的执行性能,但较小的值可节省内存。

(21)SMALL_TABLE_THRESHOLD

该参数决定SGA中用于扫描的缓冲区的数目,若表的数目小于该值,则该表可整个地读入高速缓存区。若表大于该值,则立即重用该缓冲区。一般用缺省值可使性能最好。

(22)SORT_AREA_TETAINED_SIZE

这是会话内存的最大数量,用于内存排序。当从排序空间提出最后—行时,便释放该内存。若排序要较大的内存,则分配一临时段,排序便可在盘上进行。用于排序的最大总量可由SORT_AREA_SIZE指定,而不用此参数。可以分配同样大小的多个排序空间,不过一般对于复杂的查询才需要。

(23) SORT_AREA_SIZE

该参数用于指定进行外排序(磁盘)时所需PGA内存的最大数量,以字节为单位。当排序行写入磁盘时,该内存被释放。增大该参数的值,可改进排序效率。一般不调整该参数,除非排序量很大时才调整。

(24) SORT_SPACEMP_SIZE

该参数仅在排序量很大时才调整该参数。可用下式设置该参数,使排序能最佳地使用盘空间:[(total_sort_bytes)/(SORT_AREA_SIZE)]十64

其中,total_sort_bytes为:

(number_of_records)*[sum_of_aver_average_column_sizes+(12*number of(al)]

(25)SQLTRACE

该参数设置为TRUE时,便可跟踪,以获得改善性能的信息。因为跟踪会增加开销,所以一般仅在收集信息时才置为TRUE。在实际使用时,可用ALTER SESSION命令覆盖它。(26)TRANSACTION

该参数设置并发事务的最大数。若此值较大,则需增加SGA空间和分配的回滚段数量。缺省值大于PROCESS时,可允许递归事务。

OracleSQL的优化

Oracle SQL的优化 标签:oraclesql优化date数据库subquery 2009-10-14 21:18 18149人阅读评论(21) 收藏举报分类: Oracle Basic Knowledge(208) SQL的优化应该从5个方面进行调整: 1.去掉不必要的大型表的全表扫描 2.缓存小型表的全表扫描 3.检验优化索引的使用 4.检验优化的连接技术 5.尽可能减少执行计划的Cost SQL语句: 是对数据库(数据)进行操作的惟一途径; 消耗了70%~90%的数据库资源;独立于程序设计逻辑,相对于对程序源代码的优化,对SQL语句的优化在时间成本和风险上的代价都很低; 可以有不同的写法;易学,难精通。 SQL优化: 固定的SQL书写习惯,相同的查询尽量保持相同,存储过程的效率较高。 应该编写与其格式一致的语句,包括字母的大小写、标点符号、换行的位置等都要一致 ORACLE优化器: 在任何可能的时候都会对表达式进行评估,并且把特定的语法结构转换成等价的结构,这么做的原因是 要么结果表达式能够比源表达式具有更快的速度 要么源表达式只是结果表达式的一个等价语义结构 不同的SQL结构有时具有同样的操作(例如: = ANY (subquery) and IN (subquery)),ORACLE会把他们映射到一个单一的语义结构。 1 常量优化: 常量的计算是在语句被优化时一次性完成,而不是在每次执行时。下面是检索月薪大于2000的的表达式: sal > 24000/12

sal > 2000 sal*12 > 24000 如果SQL语句包括第一种情况,优化器会简单地把它转变成第二种。 优化器不会简化跨越比较符的表达式,例如第三条语句,鉴于此,应尽量写用常量跟字段比较检索的表达式,而不要将字段置于表达式当中。否则没有办法优化,比如如果sal上有索引,第一和第二就可以使用,第三就难以使用。 2 操作符优化: 优化器把使用LIKE操作符和一个没有通配符的表达式组成的检索表达式转换为一个“=”操作符表达式。 例如:优化器会把表达式ename LIKE 'SMITH'转换为ename = 'SMITH' 优化器只能转换涉及到可变长数据类型的表达式,前一个例子中,如果ENAME 字段的类型是CHAR(10),那么优化器将不做任何转换。 一般来讲LIKE比较难以优化。 其中: ~~IN 操作符优化: 优化器把使用IN比较符的检索表达式替换为等价的使用“=”和“OR”操作符的检索表达式。 例如,优化器会把表达式ename IN ('SMITH','KING','JONES')替换为 ename = 'SMITH' OR ename = 'KING' OR ename = 'JONES‘ oracle 会将 in 后面的东西生成一存中的临时表。然后进行查询。 如何编写高效的SQL: 当然要考虑sql常量的优化和操作符的优化啦,另外,还需要: 1 合理的索引设计: 例:表record有620000行,试看在不同的索引下,下面几个SQL的运行情况:语句A SELECT count(*) FROM record WHERE date >'19991201' and date <'19991214‘and amount >2000 语句B

大型ORACLE数据库优化设计方案

大型ORACLE数据库优化设计方案 本文主要从大型数据库ORACLE环境四个不同级别的调整分析入手,分析ORACLE的系统结构和工作机理,从九个不同方面较全面地总结了ORACLE数据库的优化调整方案。 对于ORACLE数据库的数据存取,主要有四个不同的调整级别,第一级调整是操作系统级 包括硬件平台,第二级调整是ORACLE RDBMS级的调整,第三级是数据库设计级的调整,最后一个调整级是SQL级。通常依此四级调整级别对数据库进行调整、优化,数据库的整体性能会得到很大的改善。下面从九个不 同方面介绍ORACLE数据库优化设计方案。 一.数据库优化自由结构OFA(Optimal flexible Architecture) 数据库的逻辑配置对数据库性能有很大的影响,为此,ORACLE公司对表空间设计提出了一种优化结构OFA。使用这种结构进行设计会大大简化物理设计中的数据管理。优化自由结构OFA,简单地讲就是在数据库中可以高效自由地分布逻辑数据对象,因此首先要对数据库中的逻辑对象根据他们的使用方式和物理结构对数据库的影响来进行分类,这种分类包括将系统数据和用户数据分开、一般数据和索引数据分开、低活动表和高活动表分开等等。数据库逻辑设计的结果应当符合下面的准则:(1)把以同样方式使用的段类型存储在一起; (2)按照标准使用来设计系统;(3)存在用于例外的分离区域;(4)最小化表空间冲突;(5)将数 据字典分离。 二、充分利用系统全局区域SGA(SYSTEM GLOBAL AREA) SGA是oracle数据库的心脏。用户的进程对这个内存区发送事务,并且以这里作为高速缓存读取命中的数据,以实现加速的目的。正确的SGA大小对数据库的性能至关重要。SGA 包括以下几个部分: 1、数据块缓冲区(data block buffer cache)是SGA中的一块高速缓存,占整个数据库大小 的1%-2%,用来存储从数据库重读取的数据块(表、索引、簇等),因此采用least recently used (LRU,最近最少使用)的方法进行空间管理。 2、字典缓冲区。该缓冲区内的信息包括用户账号数据、数据文件名、段名、盘区位置、表 说明和权限,它也采用LRU方式管理。 3、重做日志缓冲区。该缓冲区保存为数据库恢复过程中用于前滚操作。 4、SQL共享池。保存执行计划和运行数据库的SQL语句的语法分析树。也采用LRU算法 管理。如果设置过小,语句将被连续不断地再装入到库缓存,影响系统性能。 另外,SGA还包括大池、JAVA池、多缓冲池。但是主要是由上面4种缓冲区构成。对这

2020年(Oracle管理)如何优化SQL语句以提高Oracle执行效率

(Oracle管理)如何优化SQL语句以提高Oracle执 行效率

(1)选择最有效率的表名顺序(只在基于规则的优化器中有效): Oracle的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表drivingtable)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表连接查询,那就需要选择交叉表(intersectiontable)作为基础表,交叉表是指那个被其他表所引用的表。 (2)WHERE子句中的连接顺序: Oracle采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前,那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾。(3)SELECT子句中避免使用‘*’: Oracle在解析的过程中,会将‘*’依次转换成所有的列名,这个工作是通过查询数据字典完成的,这意味着将耗费更多的时间。 (4)减少访问数据库的次数: Oracle在内部执行了许多工作:解析SQL语句,估算索引的利用率,绑定变量,读数据块等。(5)在SQL*Plus,SQL*Forms和Pro*C中重新设置ARRAYSIZE参数,可以增加每次数据库访问的检索数据量,建议值为200。 (6)使用DECODE函数来减少处理时间: 使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表。 (7)整合简单,无关联的数据库访问: 如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系)。 (8)删除重复记录: 最高效的删除重复记录方法(因为使用了ROWID)例子:DELETEFROMEMPEWHEREE.ROWID>(SELECTMIN(X.ROWID)

2020年(Oracle管理)Oracle SQL性能优化方法

(Oracle管理)Oracle SQL性能优化方法

OracleSQL性能优化方法探讨 Oracle性能优化方法(SQL篇)1 1综述2 2表分区的应用2 3访问Table的方式3 4共享SQL语句3 5选择最有效率的表名顺序5 6WHERE子句中的连接顺序.6 7SELECT子句中避免使用’*’6 8减少访问数据库的次数6 9使用DECODE函数来减少处理时间7 10整合简单,无关联的数据库访问8 11删除重复记录8 12用TRUNCATE替代DELETE9 13尽量多使用COMMIT9 14计算记录条数9 15用Where子句替换HAVING子句9 16减少对表的查询10 17通过内部函数提高SQL效率.11 18使用表的别名(Alias)12 19用EXISTS替代IN12 20用NOT EXISTS替代NOT IN13 21识别低效执行的SQL语句13

22使用TKPROF 工具来查询SQL性能状态14 23用EXPLAIN PLAN 分析SQL语句14 24实时批量的处理16

1综述 ORACLE数据库的性能调整是个重要,却又有难度的话题,如何有效地进行调整,需要经过反反复复的过程。在数据库建立时,就能根据应用的需要合理设计分配表空间以及存储参数、内存使用初始化参数,对以后的数据库性能有很大的益处,建立好后,又需要在应用中不断进行应用程序的优化和调整,这需要在大量的实践工作中不断地积累经验,从而更好地进行数据库的调优。 数据库性能调优的方法 ●调整内存 ●调整I/O ●调整资源的争用问题 ●调整操作系统参数 ●调整数据库的设计 ●调整应用程序 本文针对应用程序的调整,来说明对数据库性能如何进行优化。 2表分区的应用 对于海量数据的表,可以考虑建立分区以提高操作效率。建立分区一般以关键字为分区的标志,也可以以其他字段作为分区的标志,但效率不如关键字高。建立分区的语句在建表时可以进行说明: createtableTABLENAME() partitionbyrange(PutOutNo) (partitionPART1valueslessthan(200312319999) partitionPART2valueslessthan(200412319999)

oracle数据库优化报告

o r a c l e数据库优化报告公司内部编号:(GOOD-TMMT-MMUT-UUPTY-UUYY-DTTI-

oracle数据库 优化报告 目录 1、概述 随着应用软件用户负载的增加和愈来愈复杂的应用环境,操作系统的各项性能参数、数据库的使用效率、用户的响应速度、系统的安全运行等性能问题逐渐成为系统必须考虑的指标之一。性能测试以及优化通常通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试,用来检测系统是否达到用户提出的性能指标,及时发现系统中存在的瓶颈,最后起到优化系统的目的。

随着需求不断增加,特别是复杂逻辑的需求,一旦出现高并发量时,也将可能导致数据库主机无法承载,因此数据库优化亟待解决。 2、数据库优化部分 从2018年1月份开始跟踪及分析,发现托管区数据库在环境、设计及SQL 三方面,都存在不少问题。在SQL类优化中,本地化代码编写和设计不良,是比较明显的问题。下面将分成环境、设计、SQL优化三类进行持续分析,并给出相关建议、整改方案、整改进度。 、环境优化 被关闭 zonghe托管区数据库统计信息未自动收集,如果未打开收集,会对系统性能造成较大的影响。 需要开启统计信息 开启方法如下: --执行 BEGIN (client_name => 'auto optimizer statscollection', operation => NULL, window_name =>NULL); END;

部分索引失效 需要将索引进行删除。删除命令参考如下: drop index index_name; 、设计优化 设计类问题概述 设计类问题优化建议 1、对于表的创建开发人员需要与业务人员确认后再定义 2、经常与其他表进行连接的表,在连接字段上应该建立索引 3、索引应该建在选择性高的字段上。例如:表示性别的数据列,由于只有男女两种值,就属于选择性低

大型ORACLE数据库优化设计方案

大型ORACLE数据库优化设计方案 摘要主要从大型数据库ORACLE环境四个不同级别的调整分析入手,分析ORACLE的系统结构和工作机理,从九个不同方面较全面地总结了ORACLE数据库的优化调整方案。 关键词ORACLE数据库环境调整优化设计方案 对于ORACLE数据库的数据存取,主要有四个不同的调整级别,第一级调整是操作系统级包括硬件平台,第二级调整是ORACLERDBMS级的调整,第三级是数据库设计级的调整,最后一个调整级是SQL级。通常依此四级调整级别对数据库进行调整、优化,数据库的整体性能会得到很大的改善。下面从九个不同

方面介绍ORACLE数据库优化设计方案。 一.数据库优化自由结构OFA(OptimalflexibleArchitecture) 数据库的逻辑配置对数据库性能有很大的影响,为此,ORACLE公司对表空间设计提出了一种优化结构OFA。使用这种结构进行设计会大大简化物理设计中的数据管理。优化自由结构OFA,简单地讲就是在数据库中可以高效自由地分布逻辑数据对象,因此首先要对数据库中的逻辑对象根据他们的使用方式和物理结构对数据库的影响来进行分类,这种分类包括将系统数据和用户数据分开、一般数据和索引数据分开、低活动表和高活动表分开等等。 二、充分利用系统全局区域SGA (SYSTEMGLOBALAREA) SGA是oracle数据库的心脏。用户的进程对这个内存区发送事务,并且以这里作为高速缓存读取命中的数据,以实现加速的目的。正确的SGA大小对数据库

的性能至关重要。SGA包括以下几个部分: 2、字典缓冲区。该缓冲区内的信息包括用户账号数据、数据文件名、段名、盘区位置、表说明和权限,它也采用LRU 方式管理。 3、重做日志缓冲区。该缓冲区保存为数据库恢复过程中用于前滚操作。 4、SQL共享池。保存执行计划和运行数据库的SQL语句的语法分析树。也采用LRU算法管理。如果设置过小,语句将被连续不断地再装入到库缓存,影响系统性能。 另外,SGA还包括大池、JA V A池、多缓冲池。但是主要是由上面4种缓冲区构成。对这些内存缓冲区的合理设置,可以大大加快数据查询速度,一个足够大的内存区可以把绝大多数数据存储在内存中,只有那些不怎么频繁使用的数据,才从磁盘读取,这样就可以大大提高内存区的命中率。三、规范与反规范设计数据库

优化sql语句提高oracle执行效率(34种方法)

(1)选择最有效率的表名顺序(只在基于规则的优化器中有效): Oracle的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表driving table)将被最先处理,在 FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表连接查询, 那就需要选择交叉表 (intersection table)作为基础表, 交叉表是指那个被其他表所引用的表。 (2)WHERE子句中的连接顺序: Oracle采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录 的条件必须写在WHERE子句的末尾。 (3)SELECT子句中避免使用‘*’: Oracle在解析的过程中, 会将‘*’依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间。 (4)减少访问数据库的次数: Oracle在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量, 读数据块等。 (5)在SQL*Plus , SQL*Forms和Pro*C中重新设置ARRAYSIZE参数, 可以增加每次数据库访问的检索数据量,建议值为200。 (6)使用DECODE函数来减少处理时间: 使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表。 (7)整合简单,无关联的数据库访问: 如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系)。 (8)删除重复记录: 最高效的删除重复记录方法( 因为使用了ROWID)例子: DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID)

oraclesql优化笔记

基本的Sql 编写注意事项 尽量少用IN 操作符,基本上所有的IN 操作符都可以用EXISTS 代替。 不用NOT IN操作符,可以用NOT EXISTS或者外连接+替代。 Oracle 在执行IN 子查询时,首先执行子查询,将查询结果放入临时表再执行主查询。而EXIST则是首先检查主查询,然后运行子查询直到找到第一个匹配项。NOT EXISTS:匕NOT IN效率稍高。但具体在选择IN或EXIST操作时,要根据主子表数据量大小来具体考虑。 不用“<>”或者“ !=”操作符。对不等于操作符的处理会造成全表扫描,可以用“ <” or “>”代替。 Where子句中出现IS NULL或者IS NOT NULL时,Oracle会停止使用索引而执行全表扫描。可以考虑在设计表时,对索引列设置为NOT NULL这样就可以用其他操作来取代判断NULL的操作。 当通配符“ %”或者“ _”作为查询字符串的第一个字符时,索引不会被使用。 对于有连接的列“ || ”,最后一个连接列索引会无效。尽量避 免连接,可以分开连接或者使用不作用在列上的函数替代。 如果索引不是基于函数的,那么当在Where子句中对索引列使用函数时,索引不再起作用。 Where子句中避免在索引列上使用计算,否则将导致索引失效而进行全表扫描。 对数据类型不同的列进行比较时,会使索引失效。

用“ >=”替代“ >”。 UNION操作符会对结果进行筛选,消除重复,数据量大的情况 下可能会引起磁盘排序。如果不需要删除重复记录,应该使用UNION ALL。 Oracle从下到上处理Where子句中多个查询条件,所以表连接语句应写在其他Where条件前,可以过滤掉最大数量记录的条件必须写在Where子句的末尾。 Oracle从右到左处理From子句中的表名,所以在From子句中包含多个表的情况下,将记录最少的表放在最后。(只在采用RBO 优化时有效,下文详述) Order By 语句中的非索引列会降低性能,可以通过添加索引的方式处理。严格控制在Order By 语句中使用表达式。 不同区域出现的相同的Sql 语句,要保证查询字符完全相同, 以利用SGA共享池,防止相同的Sql语句被多次分析。多利用内部函数提高Sql 效率。 当在Sql 语句中连接多个表时,使用表的别名,并将之作为每列的前缀。这样可以减少解析时间。 需要注意的是,随着Oracle 的升级,查询优化器会自动对Sql 语句进行优化,某些限制可能在新版本的Oracle 下不再是问题。尤其是采用CBO (Cost-Based Optimization ,基于代价的优化方式)时。 我们可以总结一下可能引起全表扫描的操作:

OracleSQL性能优化方法

OracleSQL性能优化方法 Oracle性能优化方法(SQL篇) (1) 1综述 (2) 2表分区的应用 (2) 3访咨询Table的方式 (3) 4共享SQL语句 (3) 5选择最有效率的表名顺序 (5) 6WHERE子句中的连接顺序. (6) 7SELECT子句中幸免使用’*’ (6) 8减少访咨询数据库的次数 (6) 9使用DECODE函数来减少处理时刻 (7) 10整合简单,无关联的数据库访咨询 (8) 11删除重复记录 (8) 12用TRUNCATE替代DELETE (9) 13尽量多使用COMMIT (9) 14运算记录条数 (9) 15用Where子句替换HA VING子句 (9) 16减少对表的查询 (10) 17通过内部函数提高SQL效率 (11) 18使用表的不名(Alias) (12) 19用EXISTS替代IN (12) 20用NOT EXISTS替代NOT IN (13) 21识不低效执行的SQL语句 (13) 22使用TKPROF 工具来查询SQL性能状态 (14) 23用EXPLAIN PLAN 分析SQL语句 (14) 24实时批量的处理 (16)

1综述 ORACLE数据库的性能调整是个重要,却又有难度的话题,如何有效地进行调整,需要通过反反复复的过程。在数据库建立时,就能依照顾用的需要合理设计分配表空间以及储备参数、内存使用初始化参数,对以后的数据库性能有专门大的益处,建立好后,又需要在应用中不断进行应用程序的优化和调整,这需要在大量的实践工作中不断地积存体会,从而更好地进行数据库的调优。 数据库性能调优的方法 ●调整内存 ●调整I/O ●调整资源的争用咨询题 ●调整操作系统参数 ●调整数据库的设计 ●调整应用程序 本文针对应用程序的调整,来讲明对数据库性能如何进行优化。 2表分区的应用 关于海量数据的表,能够考虑建立分区以提高操作效率。建立分区一样以关键字为分区的标志,也能够以其他字段作为分区的标志,但效率不如关键字高。建立分区的语句在建表时能够进行讲明: create table TABLENAME() partition by range (PutOutNo) (partition PART1 values lessthan (200312319999) partition PART2 values lessthan (200412319999) 。。。。。。 如此,在进行大部分数据查询,数据更新和数据插入时,Oracle自动判定操作应该在哪个分区进行,幸免了整表操作,提高了执行的效率

Oracle SQL性能优化方法研究

Oracle SQL性能优化方法探讨 Oracle性能优化方法(SQL篇) (1) 1综述 (2) 2表分区的应用 (2) 3访问Table的方式 (3) 4共享SQL语句 (3) 5选择最有效率的表名顺序 (5) 6WHERE子句中的连接顺序. (6) 7SELECT子句中幸免使用’*’ (6) 8减少访问数据库的次数 (6) 9使用DECODE函数来减少处理时刻 (7) 10整合简单,无关联的数据库访问 (8) 11删除重复记录 (8) 12用TRUNCATE替代DELETE (9) 13尽量多使用COMMIT (9) 14计算记录条数 (9) 15用Where子句替换HAVING子句 (9) 16减少对表的查询 (10) 17通过内部函数提高SQL效率 (11)

18使用表的不名(Alias) (12) 19用EXISTS替代IN (12) 20用NOT EXISTS替代NOT IN (13) 21识不低效执行的SQL语句 (13) 22使用TKPROF 工具来查询SQL性能状态 (14) 23用EXPLAIN PLAN 分析SQL语句 (14) 24实时批量的处理 (16)

1综述 ORACLE数据库的性能调整是个重要,却又有难度的话题,如何有效地进行调整,需要通过反反复复的过程。在数据库建立时,就能依照顾用的需要合理设计分配表空间以及存储参数、内存使用初始化参数,对以后的数据库性能有专门大的益处,建立好后,又需要在应用中不断进行应用程序的优化和调整,这需要在大量的实践工作中不断地积存经验,从而更好地进行数据库的调优。 数据库性能调优的方法 ●调整内存 ●调整I/O ●调整资源的争用问题 ●调整操作系统参数 ●调整数据库的设计 ●调整应用程序 本文针对应用程序的调整,来讲明对数据库性能如何进行优化。 2表分区的应用 关于海量数据的表,能够考虑建立分区以提高操作效率。建

oracle数据库优化报告

oracle数据库 优化报告

目录 1、概述 (3) 2、数据库优化部分 (3) 2.1、环境优化 (3) 2.1.1 统计信息收集被关闭 (3) 2.1.2 部分索引失效 (4) 2.2、设计优化 (4) 2.2.1 设计类问题概述 (4) 2.2.2 设计类问题优化建议 (5) 2.3、SQL优化 (5) 2.3.1 SQL_ID= 7gf3typgc469a (5) 2.3.2 SQL_ID= bdcfdz26x5hm9 (6) 3、数据库优化总结 (7)

1、概述 随着应用软件用户负载的增加和愈来愈复杂的应用环境,操作系统的各项性能参数、数据库的使用效率、用户的响应速度、系统的安全运行等性能问题逐渐成为系统必须考虑的指标之一。性能测试以及优化通常通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试,用来检测系统是否达到用户提出的性能指标,及时发现系统中存在的瓶颈,最后起到优化系统的目的。 随着需求不断增加,特别是复杂逻辑的需求,一旦出现高并发量时,也将可能导致数据库主机无法承载,因此数据库优化亟待解决。 2、数据库优化部分 从2018年1月份开始跟踪及分析,发现托管区数据库在环境、设计及SQL三方面,都存在不少问题。在SQL类优化中,本地化代码编写和设计不良,是比较明显的问题。下面将分成环境、设计、SQL优化三类进行持续分析,并给出相关建议、整改方案、整改进度。 2.1、环境优化 2.1.1 被关闭 zonghe托管区数据库统计信息未自动收集,如果未打开收集,会对系统性能造成较大的影响。

需要开启统计信息 开启方法如下: --执行 BEGIN dbms_auto_task_admin.enable(client_name => 'auto optimizer statscollection', operation => NULL, window_name =>NULL); END; 2.1.2 部分索引失效 需要将索引进行删除。删除命令参考如下: drop index index_name; 2.2、设计优化 2.2.1 设计类问题概述 序号 类型 问题描述 1 表 ZJ_KZH_DATE 、ZJ_CRM_S_ORDER_GATHER 等本 地表,设计了大量的V1,V2,需要开发人员核对需 求 2 索引 索引定义较混乱,常与其他表进行连接的表,在连接

确保Oracle数据库sql语句高效执行的优化总结(一)

SQL 的优化主要涉及几个方面: (1)相关的统计信息缺失或者不准确 (2)索引问题 (3)SQL的本身的效率问题,比如使用绑定变量,批量DML 采用bulk等,这个就考验写SQL的基本功了,这一点也是最主要的一点。 一、SQL 编写注意事项 1.1 查看SQL 对于生产环境上的SQL,可以从AWR 或者Statspack 报告中获取相关的SQL信息。这部分参考: 查看SQL 的性能怎么样,最直接的工具就是通过执行计划,通过执行计划可以看到SQL 的执行路径,逻辑读,物理读等信息,可以这些信息,可以帮助我们判断SQL 是否还有优化的余地。 1.2 SQL 编写的具体注意事项 这部分工作是基本功。在SQL 编写过程中,避免一些低效的写法,能将SQL 的效率提高几倍。如: 与使用TRUNC 相比,使用TO_CHAR 所用的CPU 时间与前者相差一个数量级(即相差12倍)。因为TO_CHAR 必须把日期转换为一个串,这要使用一

个更大的代码路径,并利用当前的所有NLS来完成这个工作。然后必须执行一个串与串的比较。另一方面,TRUNC 只需把后5 个字节设置为1.然后将两个7 字节的二进制数进行比较。因此,如果只是要截断一个DATE 列,你将应该避免使用TO_CHAR。 1.3 多表关联方式 表之间的关联有如下三种方式: (1)Nested Loop Inner table 循环与outer table匹配,这种是表有索引,选择性较好,表之间的差距不大。===》两层for 循环,小表匹配大表。 (2)Hash John 小表做hash ,放内存,然后拿大表的每条记录做hash,然后与之前小表的Hash 值匹配。==》大表匹配小表。 (3)Sorted Merge Into 表有序,并且没有索引。 二. 相关理论说明 2.1 Oracle 优化器:CBO 和RBO Oracle 的优化器有两种: (1)RBO(Rule-BasedOptimization): 基于规则的优化器 (2)CBO(Cost-BasedOptimization): 基于代价的优化器

Oracle_SQL规范与优化

1.性能优化 ●【规则6】尽量避免相同语句由于书写格式的不同,而导致多次语法分析。 ●【规则7】尽量使用共享的SQL语句,也就是说,在SQL中尽量采用绑定变量的方式, 而不是常量; ●【规则8】尽量不使用“SELECT *”这样的语句,即使需要查询表中的所有行,也需列 出所有的字段名; ●【规则9】尽量避免4个以上表的链表操作,例如:A = B and B = C and C = D,如果业务 上需要,可以考虑通过中间表的方式进行变通; ●【规则9】大量的排序操作影响系统性能,所以尽量减少order by和group by排序操作。 如必须使用排序操作,请遵循如下规则: (1)排序尽量建立在有索引的列上。 (2)如结果集不需唯一,使用union all代替union。 ●【规则10】系统可能选择基于规则的优化器,所以将结果集返回数据量小的表作为驱 动表(from后边最后一个表)。 说明:驱动表的选择和很多的因素有关系,不仅仅是表的顺序,这点仅做参考,不过养成这个习惯有助于以后进行SQL的优化。 ●【规则11】索引的使用。 (1)尽量避免对索引列进行计算。 (2)尽量注意比较值与索引列数据类型的一致性,避免使用数据库的类型自动转换功能 (3)对于复合索引,SQL语句必须使用主索引列 (4)索引中,尽量避免使用NULL。 (5)对于索引的比较,尽量避免使用NOT=(!=) (6)查询列和排序列与索引列次序保持一致 ●【规则12】查询的WHERE过滤原则,应使过滤记录数最多的条件放在最前面。 ●【规则13】使用%TYPE、%ROWTYPE方式声明变量,使变量声明的类型与表中的保持同 步 ●【规则14】在IF/ELSE查询中,使用DECODE ●【规则15】在SQL 中使用WHERE 子句过滤数据,而不是在程序中到处使用它进行过 滤 ●【规则16】执行动态SQL,建议用execute immediate SQL子句; ●【规则17】尽量避免使用union,若需要排重,建议使用from 子句把查询结果union all 起来后,再通过group by 排重, 如: SELECT id FROM ( SELECT id FROM a UNION ALL SELECT id

Oracle性能优化总结

个人理解,数据库性能最关键的因素在于IO,因为操作存是快速的,但是读写磁盘是速度很慢的,优化数据库最关键的问题在于减少磁盘的IO,就个人理解应该分为物理的和逻辑的优化,物理的是指oracle产品本身的一些优化,逻辑优化是指应用程序级别的优化 物理优化: 一、优化存

3.管理员可以通过下述语句来查看数据缓冲区的使用情况 select name,value from v$sysstat where name in('db block gets','consistent gets','physica l reads'); 数据缓冲区使用命中率(physical reads除以db block gets加consistent gets之和)一定要小于10%,否则需要增加数据缓冲区大小 4.管理员可以通过执行下述语句,查看日志缓冲区的使用情况 select name,value from v$sysstat where name in ('redo entries','redo log space requests') 根据查询出的结果可以计算出日志缓冲区的申请失败率:requests除以entries 申请失败率应该解决与0,否则说明日志缓冲区开设太小,需要增加Oracle数据库的日志缓冲区 二、物理I/0的优化 1.在磁盘上建立数据文件前首先运行磁盘碎片整理程序 为了安全地整理磁盘碎片,需关闭打开数据文件的实例,并且停止服务。如果有足够的连续磁盘空间建立数据文件,那么就容易避免数据文件产生碎片。 2.不要使用磁盘压缩(Oracle文件不支持磁盘压缩) 3.不要使用磁盘加密 加密像磁盘压缩一样加了一个处理层,降低磁盘读写速度。如果担心自己的数据可能泄露,可以使用dbms_obfuscation包和label security选择性地加密数据的敏感部分 4.使用RAID raid使用应注意: 选择硬件raid超过软件raid;日志文件不要放在raid5卷上,因为raid5读性能高而写性能差;把日志文件和归档日志放在与控制文件和数据文件分离的磁盘控制系统上 5.分离页面交换文件到多个磁盘物理卷 跨越至少两个磁盘建立两个页面文件。可以建立四个页面文件并在性能上受益,确保所有页面文件的大小之和至少是物理存的两倍。

Oracle中sql优化原则

Oracle中sql优化原则 公布时刻:2006.05.17 01:31来源:不详作者:kingshare 1。差不多检验的语句和已在共享池中的语句之间要完全一样 2。变量名称尽量一致 3。合理使用外联接 4。少用多层嵌套 5。多用并发 语句的优化步骤一样有: 1。调整sga区,使得sga区的是用最优。 2。sql语句本身的优化,工具有explain,sql trace等 3。数据库结构调整 4。项目结构调整 写语句的体会: 1。关于大表的查询使用索引 2、少用in,exist等 3、使用集合运算 1.关于大表查询中的列应尽量幸免进行诸如 To_char,to_date,to_number 等转换 2.有索引的尽量用索引,有用到索引的条件写在前面 如有可能和有必要就建立一些索引 3.尽量幸免进行全表扫描,限制条件尽可能多,以便更快 搜索到要查询的数据 如何让你的SQL运行得更快 交通银行长春分行电脑部 任亮 ---- 人们在使用SQL时往往会陷入一个误区,即太关注于所得的结果是否正确,而忽略了不同的实现方法之间可能存在的性能差异,这种性能差异在大型的或是复杂的数据库环境中(如联机事务处理OLTP或决策支持系统DSS)中表现得尤为明显。笔者在工作实践中发觉,不良的SQL往往来自于不恰当的索引设计、不充份的连接条件和不可优化的where子句。在对它们进行适当的优化后,其运行速度有了明显地提高!下面我将从这三个方面分不进行总结: ---- 为了更直观地讲明咨询题,所有实例中的SQL运行时刻均通过测试,不超过1秒的均表示为(< 1秒)。

---- 测试环境-- ---- 主机:HP LH II ---- 主频:330MHZ ---- 内存:128兆 ---- 操作系统:Operserver5.0.4 ----数据库:Sybase11.0.3 一、不合理的索引设计 ----例:表record有620000行,试看在不同的索引下,下面几个SQL的运行情形: ---- 1.在date上建有一非个群集索引 select count(*) from record where date > 19991201 and date < 19991214and amount > 2000 (25秒) select date,sum(amount) from record group by date (55秒) select count(*) from record where date > 19990901 and place in (BJ,SH) (27秒) ---- 分析: ----date上有大量的重复值,在非群集索引下,数据在物理上随机存放在数据页上,在范畴查找时,必须执行一次表扫描才能找到这一范畴内的全部行。 ---- 2.在date上的一个群集索引 select count(*) from record where date > 19991201 and date < 19991214 and amount > 2000 (14秒) select date,sum(amount) from record group by date (28秒) select count(*) from record where date > 19990901 and place in (BJ,SH)(14秒) ---- 分析: ---- 在群集索引下,数据在物理上按顺序在数据页上,重复值也排列在一起,因而在范畴查找时,能够先找到那个范畴的起末点,且只在那个范畴内扫描数据页,幸免了大范畴扫描,提高了查询速度。 ---- 3.在place,date,amount上的组合索引 ---- 4.在date,place,amount上的组合索引 ---- 5.总结: ---- 缺省情形下建立的索引是非群集索引,但有时它并不是最佳的;合理的索引设计要建立

Oracle数据库性能优化

1系统问题 XX公司BI系统上线运行以来,客户反映系统目前存在着下面的几个问题,涉及到数据库和ETL. 问题一:表空间增长太快,每个月需增加3—5G空间。 问题二:ETL JOB会经常导致数据库产生表空间不足错误。 2系统优化分析 2.1分析思路 要解决表空间的问题,我们必须搞清楚下面几个问题: 思路一:真正每个月数据仓库增量是多少空间 目的:得出一个正确的月表空间增长量。 思路二:目前的数据仓库表空间是是如何分布的。 目的:找出那些对象是最占空间,分析其合理性。 2.2分析过程 要得到真实的数据分布必须对表进行分析,首先需要对数据仓库的oracle数据库进行表分析,。执行下面脚本可以对数据库进行表分析。

脚本一 analyze table SA_IMS_PRODUCT_GROUP compute statistics; analyze table SA_CONSUMP_ACT_DEL compute statistics; analyze table SA_FINANCE_ACT compute statistics; analyze table SA_CONSUMP_TGT_DEL compute statistics; analyze table SA_FACT_IS compute statistics; analyze table SA_CPA compute statistics; analyze table SA_REF_TERR_ALIGNMENT_DEL compute statistics; analyze table SA_IMS_MTHLC_BK compute statistics; analyze table SA_IMS_CHPA compute statistics; analyze table SA_FINANCE_PNL compute statistics; analyze table SA_CUST_TARG_SEG compute statistics; analyze table SA_CONSUMP_ACT compute statistics; analyze table SA_FINANCE_BS compute statistics; analyze table SA_FINANCE_BGT_QTY compute statistics; analyze table SA_CONSUMP_ACT0423 compute statistics; analyze table SA_CALLS compute statistics; analyze table SA_COMPANY_DAILY_SALES_ALL compute statistics; analyze table SA_IMS_MTHLC compute statistics; analyze table SA_IMS_MTHUS compute statistics; analyze table SA_CONSUMP_TGT compute statistics; analyze table TEST_TABLE compute statistics; analyze table SA_DOCTOR_CYCLE_EXTRACT compute statistics; analyze table SA_EXCHANGE_ACT compute statistics;

oracle查询优化改写技巧和案例(学习笔记)

oracle查询优化改写技巧和案例(学习笔记) 第一章 将空值转换成实际值 函数coalesce(exp1,exp2,...) 返回第一个为非空的值,避免了返回空值; 查找满足多个条件的行 用到or:只要达到其中一个条件就可以的; 查询所有的提成的员工:即提成不为空,comm is NOT NULL;这个很好的例子; 用括号把多个条件给分隔开; 在where字句中引用别名的列; 即要引用别名的列时必须是一张表中的字段; select * from (sal as 工资 ,comm as 提成from emp) x where 工资 >2000; 拼接列 用“||”把各列连起来 员工的工作是:ename || ‘的工作是’|| job 在slect语句中使用条件逻辑 即用case来解决:格式为 字段, case when then ; when then ; else ; end as 别名 情景:当工资<2000元时,就返回“过低”,<4000 就返回“过高”, 复习考题:(P9)要按照工资档次统计人数; 限制返回的行数 用rownum是依次对数据做出的标识,是所有的数据取出来后才能确定其序号; rownum<= 2而不能rownum = 2; 查询某个序号可以这样: select * from (select rownum as sn,emp.* from emp) where rownum <=2) where sn = 2;

从表中随机返回n条记录 先随机排序,再取数据(正确): select empno,ename from (select empno,ename from emp order by ()) where rownum <=3;先取数据再随机排序(错误): select empno,ename from emp where rownum <=3 order by (); 模糊查询 通配符主要有“like"、"_"、"%" 如果查询中包含通配符就要用到转义字符: select * from v where vname like '\_like' ESCAPE '\'; 第二章给查询结果排序 以指定的次序返回查询结果 ASC:升序排序,从小到大排序;desc:倒序排序,即从大到小; order by 3 asc:表示按第三列排序:这种排序适用于该列取值不定时或者说经常改变的列,很方便,比如查询的列增加了,而我们只是排序第一列; 按多个字段排序 排序的字段要用","分开,比如:order by A desc, B asc; 按字符串排序 用到了substr()函数;主要是运用了快速查找顾客的电话的尾号4的顺序; substr(phone_number,-4) 表示后四位; ()函数 translate(expr,from_string,to_string):from_string和to_string以字符为单位,对应字符一一替换; 如果to_string 为空,则返回空值;如果to_string对应的位置没有字符,删除 from_string中列出的字符将会被消掉; 运用: 按数字和字母混合字符串中的字母排序 把重要的东西提取出来,次要的东西踢掉,这道题是对translate的运用; 先构造视图 create or replace view v as select empno || '' || ename as data from emp;

相关文档
相关文档 最新文档