ORACLE优化SQL语句,提高效率(2)

ALTERINDEXREBUILD

(低效):SELECTDISTINCTDEPT_NODEPT_NAMEFROMDEPTDEMPEWHEREDDEPT_NO=EDEPT_NO(高效):SELECTDEPT_NODEPT_NAMEFROMDEPTDWHEREEXISTS(SELECTXFROMEMPEWHEREEDEPT_NO=DDEPT_NO);

示例:

;高效:SELECT…FROMDEPWHERESAL>/;

<这是一条简单易记的规则,但执行的实际效果还需要测试。
两者在Oraclei下的执行路径看起来是一样的:

效率低下:

SELECT…FROMLOCATIONWHERELOC_ININ();

效率低下:(索引无效)

SELECT…FROMDEPARTMENTWHEREDEPT_CODEISNOTNULL;

高效(索引有效)

=;

lishixinzhi/Article/program/Oracle/201311/16789

oracle数据库优化有哪些方法?

最好买一本专门关于ORACLE性能调优的书仔细看看。
\x0d\x0a1调整数据库服务器的性能\x0d\x0aOracle数据库服务器是整个系统的核心,它的性能直接影响到整个系统的性能整个系统。
调整Oracle数据库服务器的性能,需要考虑以下几个方面:注意事项:\x0d\x0a1.1。
自定义操作系统以运行Oracle数据库服务器。
\x0d\x0aOracle数据库服务器高度依赖于服务器运行的操作系统。
如果操作系统不能提供最佳性能,那么无论您如何定制它,Oracle数据库服务器都无法发挥其应有的性能。
\x0d\x0a1.1.1。
Oracle数据库服务器的系统资源调度\x0d\x0a基于可用的计算资源,调度分配给Oracle服务器的资源的原则是尽可能最大化Oracle服务器使用的资源。
特别是在客户端/服务器领域。
尽量使用服务器上的所有资源来运行Oracle服务。
\x0d\x0a1.1.2。
调整计算机系统中的内存配置。
\x0d\x0a大多数操作系统使用虚拟内存来模拟计算机上更大的内存,这实际上是硬盘上的一定空间。
当实际存储空间不能满足应用软件的需要时,操作系统就会使用这部分存储空间以页的形式替换内存中的信息,从而导致大量的磁盘I/O操作,影响应用程序的性能。
整个服务器。
为了避免过度使用虚拟内存,应增加计算机的RAM。
\x0d\x0a1.1.3。
设置Oracle数据库服务器操作系统进程的优先级。
\x0d\x0a不要调整操作系统中Oracle进程的优先级,因为在Oracle数据库系统中,所有正在运行的后台和前台数据库服务器进程都是同等重要的任务并要求相同的优先级。
因此,在安装过程中,请保持所有数据库服务器进程以默认优先级运行。
\x0d\x0a1.2。
调整内存分配\x0d\x0aOracle数据库服务器维护三个基本内存缓存,分别对应三种不同的数据类型:库缓存、字典缓存和缓冲区缓存。
库缓存和字典缓存共同构成共享池,共享池和缓冲区缓存构成系统全局区(SGA)。
SGA是一个系统范围的区域,用于快速访问数据库数据。
如果SGA本身需要频繁共享和分配,就无法达到快速访问数据的目的。
因此,SGA应该存储在主存中,而不是虚拟内存中。

内存调整主要是指调整组成SGA的内存结构的大小,以提高系统性能。
由于Oracle数据库服务器的存储结构需求与应用密切相关,因此存储结构调整应在磁盘I/O调整之前进行。
\x0d\x0a1.2.1。
库缓冲区定制\x0d\x0a库缓冲区包含私有和共享的SQL和PL/SQL区域,其大小是通过比较库缓冲区的命中率来确定的。
要自定义库缓冲区,您必须首先了解库缓冲区的活动。
库缓冲区活动统计信息存储在数据字典中动态性能表v$librarycache。
您可以查询此表以了解他们的活动并决定如何设置。
\x0d\x0a\x0d\x0aSelectsum(pins),sum(reloads)fromv$librarycache;\x0d\x0a\x0d\x0aPins列表示调用的SQL语句、PL/SQL块和对象定义的总数;打印在隐式解析SQL和PL/SQL块或重新加载对象定义期间库程序缓冲区中发生的错误。
如果sum(pins)/sum(reloads)≈0,则库缓冲区命中率合理;如果sum(pins)/sum(reloads)>1,则必须调整初始化参数shared_pool_size,以重新调整分配给共享池的内存量。
\x0d\x0a1.2.2。
数据字典缓冲区定制\x0d\x0a数据字典缓冲区包含有关数据库的结构、用户和实体信息。
数据字典的命中率对系统性能影响很大。
数据字典缓冲区的使用情况记录在v$librarycache动态性能表中,可以通过查询该表来了解其活动并决定如何调整。
\x0d\x0a\x0d\x0aSelectsum(gets),sum(getmisses)fromv$rowcache;\x0d\x0a\x0d\x0aGets列包含对应元素的请求次数统计。
Getmisses列包含导致缓冲区未命中的数据请求数。
对于频繁访问的数据字典缓冲区,sum(getmisses)/sum(gets)<10>如果大于这个百分比,就应该考虑增加数据字典缓冲区的容量,即增加数据字典缓冲区的容量。
h.您必须调整shared_pool_size初始化参数来重新调整分配给共享池的内存量。
\x0d\x0a1.2.3。
BufferCache调整\x0d\x0a用户进程访问的所有数据都是通过BufferCache来访问的,所以这部分的命中率对性能至关重要。
缓冲区缓存使用情况记录在动态性能表v$sysstat中,可以查询该表以了解其活动并确定如何调整它。
\x0d\x0a\x0d\x0aSelectname,valuefromv$sysstatwherenamein('dbblockgets','consistentgets','physicalreads');\x0d\x0a\x0d\x0adbblockgets和confirmedgets的值是请求中的读取总数文件数据缓冲区。
physicalreads的值表示请求数据时文件从磁盘读取的次数。
从缓冲区高速缓存中读取的概率称为缓冲区命中率,计算公式如下:\x0d\x0a\x0d\x0aHitRatio=1-(physicalreds/(dbblockgets+concientgets))\x0d\x0a\x0d\x0aIfHitRatio<60>db_block_buffers可以调整分配给buffercache的内存量,即h.db_block_buffers可以设置分配给缓冲区高速缓存的数据块的数量。
缓冲区高速缓存中的总字节数=db_block_buffers的值*db_block_size的值。
db_block_size的值代表数据块大小的字节数,可以查询v$参数表:\x0d\x0a\x0d\x0aselectname,valuefromv$parameterwherename='db_block_size';\x0d\x0a\x0d\x0a修改后。
上述数据库初始化参数后,必须先关闭并重新启动数据库,新设置才能生效。

oracle数据库有哪两种优化模式

OracleOptimizer有两种优化方法,即基于规则的优化(RBO)和基于成本的优化(CBO)。
RBO方法:优化器解析遵循Oracle中某些预定义规则的SQL语句。
例如,当where子句中的列包含索引时,我们通常会使用索引。
为了。
CBO法:根据单词的含义,取决于短语成本。
这里的成本主要指CPU和内存。
优化器在决定是否使用这种方法时,主要参考表和索引的统计信息。
统计信息提供有关表的大小、表中的行数、每行的长度等信息。
此统计信息最初在库中不可用,仅在执行分析后才会出现。
很多时候,过期的统计信息会导致优化器做出错误的执行计划,所以我们必须及时更新这些信息。
在Oracle8及更高版本中,Oracle列推荐CBO方法。
我们要明白,索引不一定是最优的,例如,如果一个表只包含两行数据,一次输入就可以完成整个表的检索,但是在这种情况下,索引需要整个表的检索。
最好可以通过Fulltablescan来检索。