OracleSQL的优化
OracleSQL性能优化及案例分析
OracleSQL性能优化及案例分析
标题:Oracle SQL性能优化及案例分析
一、引言
Oracle数据库作为全球最受欢迎的数据库之一,其性能优化问题一直是用户和开发者的焦点。尤其是在处理大量数据或复杂查询时,性能问题可能会严重影响应用程序的响应时间和用户体验。因此,对Oracle SQL进行性能优化及案例分析显得尤为重要。
二、Oracle SQL性能优化
1、索引优化
索引是提高Oracle SQL查询性能的重要工具。通过创建合适的索引,可以大大减少查询所需的时间,提高数据库的响应速度。然而,过多的索引可能会导致额外的存储空间和插入、更新、删除的性能损失。因此,需要根据实际应用的需求,合理地选择需要索引的字段。
2、查询优化
编写高效的SQL查询语句也是提高Oracle SQL性能的关键。这包括选择正确的查询语句、避免在查询中使用复杂的子查询、使用连接
(JOIN)代替子查询等。还可以使用Oracle SQL Profiler来分析和优化查询语句的性能。
3、数据库参数优化
Oracle数据库有许多参数可以影响SQL性能,如内存缓冲区、磁盘I/O参数等。根据实际应用的需求和硬件环境,对这些参数进行合理的调整,可以提高Oracle SQL的性能。
三、案例分析
1、案例一:索引优化
问题描述:在一个电商系统中,用户在搜索产品时,使用全文本搜索功能时经常出现延迟。
解决方案:通过分析用户搜索的习惯和需求,对产品表的名称和描述字段创建全文索引。同时,调整Oracle的全文搜索参数以提高搜索效率。
2、案例二:查询优化
oracle sql 优化技巧
oracle sql 优化技巧
(实用版3篇)
目录(篇1)
1.Oracle SQL 简介
2.优化技巧
2.1 减少访问数据库次数
2.2 选择最有效率的表名顺序
2.3 避免使用 SELECT
2.4 利用 DECODE 函数
2.5 设置 ARRAYSIZE 参数
2.6 使用 TRUNCATE 替代 DELETE
2.7 多使用 COMMIT 命令
2.8 合理使用索引
正文(篇1)
Oracle SQL 是一款广泛应用于各类大、中、小微机环境的高效、可靠的关系数据库管理系统。为了提高 Oracle SQL 的性能,本文将为您介绍一些优化技巧。
首先,减少访问数据库的次数是最基本的优化方法。Oracle 在内部执行了许多工作,如解析 SQL 语句、估算索引的利用率、读数据块等,这些都会大量耗费 Oracle 数据库的运行。因此,尽量减少访问数据库的次数,可以有效提高系统性能。
其次,选择最有效率的表名顺序也可以明显提升 Oracle 的性能。Oracle 解析器是按照从右到左的顺序处理 FROM 子句中的表名,因此,合理安排表名顺序,可以减少解析时间,提高查询效率。
在执行 SELECT 子句时,应尽量避免使用,因为 Oracle 在解析的过程中,会将依次转换成列名,这是通过查询数据字典完成的,耗费时间较长。
DECODE 函数也是一个很好的优化工具,它可以避免重复扫描相同记录,或者重复连接相同的表,提高查询效率。
在 SQLPlus 和 SQLForms 以及 ProC 中,可以重新设置 ARRAYSIZE 参数。该参数可以明显增加每次数据库访问时的检索数据量,从而提高系统性能。建议将该参数设置为 200。
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语句,优化查询的执行计划。
OracleSQL优化
(摘录自互联网)
一:Oracle 与SQL相关的几个概念
1. 选用适合的ORACLE优化器
ORACLE的优化器共有3种:
a. RULE (基于规则)
b. COST (基于成本)
c. CHOOSE (选择性)
设置缺省的优化器,可以通过对init.ora文件中OPTIMIZER_MODE参数的各种声明,如RULE,COST,CHOOSE, ALL_ROWS,FIRST_ROWS . 你当然也在SQL 句级或是会话(session)级对其进行覆盖. 为了使用基于成本的优化器(CBO, Cost-Based Optimizer) , 你必须经常运行analyze 命令,以增加数据库中的对象统计信息(object statistics)的准确性. 如果数据库的优化器模式设置为选择性(CHOOSE),那么实际的优化器模式将和是否运行过analyze命令有关. 如果table已经被analyze过, 优化器模式将自动成为CBO , 反之,数据库将采用RULE形式的优化器.
在缺省情况下,ORACLE采用CHOOSE优化器, 为了避免那些不必要的全表扫描(full table scan) , 你必须尽量避免使用CHOOSE优化器,而直接采用基于规则或者基于成本的优化器.
2. 访问Table的方式
ORACLE 采用两种访问表中记录的方式:
a. 全表扫描
全表扫描就是顺序地访问表中每条记录. ORACLE采用一次读入多个数据块(database block)的方式优化全表扫描.
b. 通过ROWID访问表
你可以采用基于ROWID的访问方式情况,提高访问表的效率, , ROWID包
oracle的sql优化
Oracle SQL 优化
Oracle SQL 优化是指通过使用各种技术来提高 Oracle SQL 查询的性能。这些技术包括:
使用索引:索引可以帮助 Oracle 数据库快速找到数据,从而提高查询性能。
使用分区:分区可以将大型表分成更小的部分,从而提高查询性能。
使用物化视图:物化视图是预先计算的查询结果,可以提高查询性能。
使用连接提示:连接提示可以告诉 Oracle 数据库如何连接表,从而提高查询性能。
使用并行查询:并行查询可以同时使用多个处理器来执行查询,从而提高查询性能。
Oracle SQL 优化器 :
Oracle SQL 优化器是一个内置的工具,可以帮助用户优化 SQL 查询。优化器会分析查询并生成一个执行计划,该计划指定了 Oracle 数据库将如何执行查询。用户可以通过查看执行计划来了解查询的性能瓶颈,并进行相应的优化。
Oracle SQL 优化技巧:
使用 EXPLAIN PLAN 命令:EXPLAIN PLAN 命令可以显示查询的执行计划。
使用绑定变量:绑定变量可以防止 SQL 语句在每次执行时都重新编译。
使用批处理:批处理可以将多个 SQL 语句组合成一个批处理作业,从而提高性能。
使用游标:游标可以逐行处理数据,从而提高性能。
使用临时表:临时表可以存储中间结果,从而提高性能。
Oracle SQL 优化工具:
Oracle SQL Developer:Oracle SQL Developer 是一个集成开发环境,可以帮助用户开发和优化 SQL 查询。
Oracle Enterprise Manager:Oracle Enterprise Manager 是一个管理工具,可以帮助用户监控和优化 Oracle 数据库。
oracle性能优化面试题
oracle性能优化面试题
一、概述
Oracle性能优化是数据库管理中的重要环节,通过合理的调整和优化,可以提升数据库的运行效率和响应速度,提高系统的稳定性和可用性。在面试中,常常会涉及到Oracle性能优化相关的问题,下面是一些常见的Oracle性能优化面试题。
二、索引优化
1. 请说明什么是索引?
索引是一种特殊的数据库对象,它能够加快数据库的查询速度。索引由一个或多个列组成,它们的值会按照一定的顺序进行排序,并建立索引数据结构以支持快速查找。
2. 如何确定何时创建索引?
创建索引需要权衡查询的速度和更新的效率。一般来说,当查询的频率远远大于更新的频率时,可以考虑创建索引。同时也需要考虑查询的字段是否经常被使用,以及查询的覆盖度等因素。
3. 请说明常见的索引类型?
常见的索引类型包括唯一索引、非唯一索引、主键索引、聚簇索引和非聚簇索引等。
4. 如何选择合适的索引?
选择合适的索引需要考虑查询的频率、更新的频率、查询的覆盖度
等因素。同时还需要考虑索引的大小以及对于查询的影响。
三、SQL优化
1. 请说明常见的SQL调优手段?
常见的SQL调优手段包括使用合适的索引、优化SQL语句的写法、使用合适的连接方式、减少数据库的访问次数等。
2. 如何使用执行计划进行SQL优化?
执行计划是Oracle数据库为了优化查询语句而生成的查询执行计划,其中包含了查询的操作步骤、连接方式、访问路径等信息。可以通过
查看执行计划来判断查询是否需要进行优化,并通过优化查询的方式
来提升性能。
3. 如何优化大表查询?
优化大表查询可以通过分页查询、增加条件过滤、创建合适的索引
oracle数据库sql优化方案
oracle数据库sql优化方案
概述:
在使用Oracle数据库进行开发和运维过程中,SQL语句的性能常常
是一个关键问题。本文将介绍一些基本的Oracle数据库SQL优化方案,旨在提高系统查询性能和响应速度。
1. SQL语句优化准则
在进行SQL语句的优化之前,我们需要遵循以下准则:
- 减少表之间的连接数量,尽量使用JOIN语句而不是子查询。
- 选择恰当的索引,合理利用索引可以提高查询效率。
- 避免使用SELECT *,仅选择需要的列。
- 尽量减少SQL语句中的函数使用,函数会增加查询的开销。
- 针对复杂查询,可以考虑使用分页查询或数据缓存等技术。
2. 查询计划分析
查询计划是Oracle数据库优化的重要工具,通过分析查询计划可以
找到潜在的性能问题。可以使用以下工具进行查询计划分析:- 使用EXPLAIN PLAN命令生成查询计划。
- 使用SQL Trace功能记录SQL执行过程,通过跟踪文件进行分析。
- 使用Oracle Enterprise Manager等性能监控工具,查看查询计划和执行统计信息。
3. 索引优化
索引是提高查询性能的重要手段,合理使用和优化索引可以显著提升系统的响应速度。以下是一些索引优化的常用技巧:
- 使用唯一索引替代非唯一索引,减少索引的冗余。
- 避免在过大的列上创建索引,可以使用函数索引或局部索引进行优化。
- 对经常用于查询的列创建索引,包括WHERE子句中经常使用的列和经常进行连接的列。
- 定期进行索引重建和统计信息收集。
4. 数据库配置优化
除了对SQL语句进行优化,还可以通过调整数据库配置来提升性能:
oracle数据库sql优化
千里之行,始于足下。
oracle数据库sql优化
Oracle数据库是关系型数据库系统中的一种,在实际应用中,它的性能往往是关键因素之一。为了提高Oracle数据库的性能,我们可以进行SQL优化。SQL优化可以减少查询时间、减少资源消耗,提高数据库的整体性能。
首先,我们可以通过索引来优化SQL查询。索引可以加快数据库的查找速度,减少查询的时间。在选择索引时,我们可以根据查询的条件和数据的分布情况进行选择,合理选择索引可以大大提高查询效率。
另外,我们还可以考虑使用合适的查询语句。比如,使用where子句来限制查询的范围,避免全表扫描;使用join来连接多个表,减少查询的次数;使用子查询来优化查询的复杂度等。
此外,在设计数据库时,我们也要考虑到数据的规范化和反规范化。规范化有助于提高数据的一致性和可维护性,但在查询性能方面可能会受到一定的影响。因此,对于经常被查询的数据,我们可以考虑进行反规范化,将其冗余存储在多个表中,以提高查询性能。
另外,我们还可以通过设置合适的数据库参数来优化SQL。比如,通过调整SGA和PGA的大小来合理分配内存资源;通过调整数据库的缓冲池来提高缓存命中率;通过设置合适的日志模式来提高事务处理的效率等。
另外,一个高效的数据库应用还需要考虑到并发访问的问题。通过合理的数据库设计和应用程序的编写,可以减少多个用户同时访问数据库时的冲突和阻塞,提高并发访问的效率。
第1页/共2页
锲而不舍,金石可镂。
总之,通过合理的索引设计、合适的查询语句、数据库参数的优化和并发访问的处理,我们可以大大提高Oracle数据库的性能。当然,在实际应用中,SQL优化是一个持续的过程,需要不断地进行监控和调整,以保持数据库的高性能。
常见Oracle数据库优化策略与方法
常见Oracle数据库优化策略与方法
Oracle数据库优化是提高数据库性能的关键步骤,可以采取多种策略。以下是一些常见的Oracle数据库优化策略:
1.硬件优化:这是最基本的优化方式。通过升级硬件,比如增加RAM、使用
更快的磁盘、使用更强大的CPU等,可以极大地提升Oracle数据库的性能。
2.网络优化:通过优化网络连接,减少网络延迟,可以提高远程查询的效率。
3.查询优化:对SQL查询进行优化,使其更快地执行。这包括使用更有效的
查询计划,减少全表扫描,以及使用索引等。
4.表分区:对大表进行分区可以提高查询效率。分区可以将一个大表分成多
个小表,每个小表可以单独存储和查询。
5.数据库参数优化:调整Oracle数据库的参数设置,使其适应工作负载,可
以提高性能。例如,调整内存分配,可以提升缓存性能。
6.数据库设计优化:例如,规范化可以减少数据冗余,而反规范化则可以提
升查询性能。
7.索引优化:创建和维护索引是提高查询性能的重要手段。但过多的索引可
能会降低写操作的性能,因此需要权衡。
8.并行处理:对于大型查询和批量操作,可以使用并行处理来提高性能。
9.日志文件优化:适当调整日志文件的配置,可以提高恢复速度和性能。
10.监控和调优:使用Oracle提供的工具和技术监控数据库性能,定期进行性
能检查和调优。
请注意,这些策略并非一成不变,需要根据实际情况进行调整。在进行优化时,务必先备份数据和配置,以防万一。
oracle sql优化常用的15种方法
oracle sql优化常用的15种方法
1. 使用合适的索引
索引是提高查询性能的重要手段。在设计表结构时,根据查询需求
和数据特点合理地添加索引。可以通过创建单列索引、复合索引或者
位图索引等方式来优化SQL查询。
2. 确保SQL语句逻辑正确
SQL语句的逻辑错误可能会导致低效查询。因此,在编写SQL语
句前,需要仔细分析查询条件,确保逻辑正确性。
3. 使用连接替代子查询
在一些场景下,使用连接(JOIN)操作可以替代子查询,从而减少
查询的复杂度。连接操作能够将多个数据集合合并为一个结果集,避
免多次查询和表的扫描操作。
4. 避免使用通配符查询
通配符查询(如LIKE '%value%')在一些情况下可能导致全表扫描,性能低下。尽量使用前缀匹配(LIKE 'value%')或者使用全文索引进
行模糊查询。
5. 注意选择合适的数据类型
选择合适的数据类型有助于提高SQL查询的效率。对于整型数据,尽量使用小范围的数据类型,如TINYINT、SMALLINT等。对于字符
串数据,使用CHAR字段而不是VARCHAR,可以避免存储长度不一
致带来的性能问题。
6. 优化查询计划
查询计划是数据库在执行SQL查询时生成的执行计划。通过使用EXPLAIN PLAN命令或者查询计划工具,可以分析查询计划,找出性
能瓶颈所在,并对其进行优化。
7. 减少磁盘IO
磁盘IO是影响查询性能的重要因素之一。可以通过增加内存缓存
区(如SGA)、使用高速磁盘(如SSD)、使用合适的文件系统(如ASM)等方式来减少磁盘IO。
8. 分区表
对于大数据量的表,可以考虑使用分区表进行查询优化。分区表可
oracle sql优化原理
oracle sql优化原理
Oracle SQL 优化原理
在数据库应用程序中,SQL 查询的性能是至关重要的。优化SQL 查询可以提高数据库的响应时间,降低系统资源的消耗。Oracle SQL 优化是通过优化执行计划来实现的,执行计划是由Oracle 数据库根据查询语句生成的一种操作序列,用于检索和处理数据。
在进行 Oracle SQL 优化时,需要考虑以下几个原理:
1. 数据库索引:索引是提高查询性能的关键。通过在表中创建索引,可以加快数据检索的速度。索引可以基于一个或多个列进行创建,它们可以使查询更加高效。但是索引也会增加数据插入和更新的开销,因此需要根据具体情况权衡索引的使用。
2. 数据库统计信息:Oracle 数据库会收集和存储有关表和索引的统计信息,这些统计信息对于生成最优执行计划至关重要。通过定期收集统计信息,可以帮助优化器更好地选择执行计划,提高查询性能。
3. 数据库表设计:合理的数据库表设计可以提高查询性能。避免过度规范化的设计,减少表之间的关联查询,可以减少查询的复杂度。此外,还应该避免使用过多的冗余列,以免增加数据更新的开销。
4. 使用合适的 SQL 查询语句:使用合适的 SQL 查询语句可以减少
查询的复杂度,提高查询性能。例如,可以使用连接查询代替子查询,使用 EXISTS 代替 IN 子句等。此外,还可以使用优化器提示来指导优化器生成更优的执行计划。
5. 避免全表扫描:全表扫描是指对整个表进行扫描,这是一种效率较低的操作。可以通过创建索引、使用合适的查询条件和限制返回的行数等方式来避免全表扫描。
ORACLE执行计划和SQL调优
ORACLE执行计划和SQL调优
1、Oracle执行计划
Oracle执行计划是Oracle数据库服务器在执行SQL语句时的步骤在
称为执行计划。执行计划是一个结构化的描述,它描述了数据库服务器必
须执行哪些操作来实现特定的SQL语句。它是SQL语句在执行过程中的一
个步骤,它引导Oracle数据库服务器创建或执行查询的最佳方法。
Oracle执行计划是一个经过调优的程序,用户可以查看执行计划,
以便了解Oracle数据库服务器做了什么,以及查询操作执行的方式。用
户可以查看执行计划,以调整查询方式,改善性能,最大限度地优化查询。
SQL调优是优化SQL语句,改善SQL语句性能的一种方法。SQL调优
的目的是通过优化SQL语句,减少查询所需时间,提高系统性能。SQL调
优是一个需要综合评判的复杂过程,它涉及到一些方法,策略和技术,诸
如索引、联接、子查询、缓存、存储过程和函数等。
为了SQL调优,必须首先了解当前系统环境,如数据库类型,操作系
统及版本,服务器硬件规格等;其次,了解SQL语句的数据库操作,如索引,连接,排序,聚合,加锁等操作;最后,应选择最佳的执行计划,如
索引覆盖,全表扫描,哈希连接等,实现SQL语句的最佳执行效率。
另外,还应注意,在进行SQL优化时。
ORACLESQL性能优化
ORACLESQL性能优化
1.使用正确的查询语句:使用正确的查询语句是提高SQL性能的关键。确定要返回的结果集,只选择所需的列,使用合适的过滤条件和连接条件
来减少需要检索的数据量。
2.创建适当的索引:索引是提高查询性能的重要因素之一、为经常使
用的列创建索引可以加快查询速度。但是,过多或不必要的索引可能会降
低性能。因此,只为那些经常用于查询和过滤的列创建索引。
3. 根据数据分布选择合适的索引类型:Oracle提供了多种类型的索引,包括B-tree索引、位图索引和哈希索引。根据数据分布选择合适的
索引类型可以提高查询性能。
4. 使用合适的查询优化技术:Oracle提供了多种查询优化技术,如
联接、子查询、视图和分区等。选择合适的查询优化技术可以提高查询性能。
5. 避免重复查询:在同一查询中避免多次访问相同的表和数据。可
以使用临时表或Oracle的WITH子句来保存查询结果,以便以后多次使用。
6.使用绑定变量:绑定变量可以减少SQL执行时间并减少资源的消耗。使用绑定变量可以将SQL缓存起来以供以后使用,避免重复解析查询。
7.使用合适的数据库连接方式:选择合适的数据库连接方式可以提高
查询性能。使用连接池可以避免频繁的连接和断开操作,减少资源消耗。
8. 监控和调优SQL语句:使用Oracle提供的监控工具来监控和调优SQL语句的执行。根据监控结果进行优化,从而提高SQL查询性能。
9.确保数据库统计信息的及时更新:数据库统计信息对于优化查询非常重要。及时更新统计信息可以帮助优化器选择合适的执行计划,提高查询性能。
Oracle SQL优化
(摘录自互联网)
一:Oracle 与SQL相关的几个概念
1. 选用适合的ORACLE优化器
ORACLE的优化器共有3种:
a.RULE (基于规则)
b. COST (基于成本)
c. CHOOSE (选择性)
设置缺省的优化器,可以通过对init.ora文件中OPTIMIZER_MODE参数的各种声明,如RULE,COST,CHOOSE, ALL_ROWS,FIRST_ROWS . 你当然也在SQL 句级或是会话(session)级对其进行覆盖. 为了使用基于成本的优化器(CBO, Cost-Based Optimizer) , 你必须经常运行analyze 命令,以增加数据库中的对象统计信息(object statistics)的准确性. 如果数据库的优化器模式设置为选择性(CHOOSE),那么实际的优化器模式将和是否运行过analyze命令有关. 如果table 已经被analyze过, 优化器模式将自动成为CBO , 反之,数据库将采用RULE形式的优化器.
在缺省情况下,ORACLE采用CHOOSE优化器, 为了避免那些不必要的全表扫描(full table scan) , 你必须尽量避免使用CHOOSE优化器,而直接采用基于规则或者基于成本的优化器.
2.访问Table的方式
ORACLE 采用两种访问表中记录的方式:
a.全表扫描
全表扫描就是顺序地访问表中每条记录. ORACLE 采用一次读入多个数据块(database block)的方式优化全表扫描.
b.通过ROWID访问表
你可以采用基于ROWID的访问方式情况,提高访问表的效率, , ROWID包含了表中记录的物理位置信息..ORACLE采用索引(INDEX)实现了数据和存放数据的物理位置(ROWID)之间的联系. 通常索引提供了快速访问ROWID的方法,因此那些基于索引列的查询就可以得到性能上的提高.
ORACLE SQL性能优化(全)
什么叫做重编译问题
什么叫做重编译?
下面这个语句每执行一次就需要在SHARE POOL 硬解析一 次,一百万用户就是一百万次,消耗CPU和内存,如果业务 量大,很可能导致宕库……
如果绑定变量,则只需要硬解析一次,重复调用即可
select * from dConMsg where contract_no = 32013484095139
共享游标:好处
1. 减少解析 2. 动态内存调整 3. 提高内存使用率
书写可共享的SQL
绑定变量和共享游标
ORACLE 优化器模式 概述
Oracle的优化器共有3种模式:RULE (基于规则)、COST (基于成本)、CHOOSE(基于选择)。
设置缺省的优化器的方法,是在启动参数文件中针对 OPTIMIZER_ MODE参数的各种声明进行选择,如RULE、COST、 CHOOSE、ALL_ ROWS、FIRST_ ROWS。当然也可以在SQL语 句级别或是会话级别对其进行覆盖。
绑定变量解决重编译问题
未使用绑定变量的语句
sprintf(sqlstr, "insert into scott.test1 (num1, num2) values (%d,%d)",n_var1, n_var2);
EXEC SQL EXECUTE IMMEDIATE :sqlstr ; EXEC SQL COMMIT;
优化sql语句提高oracle执行效率
优化sql语句提高oracle执行效率
1.尽可能高效:采用最有效的查询方式、避免使用不必要的查询语句、提高检索速度而非数据量。
2.避免使用子查询:尽量不使用子查询,把子查询换成联合查询或者
通过多表连接更新数据。
3.避免重复读取:尽量从数据库中读取一次数据,不要读取多次相同
的数据,避免多次查询,提高数据库的查询效率。
4.避免使用NOTIN和NOTEXISTS:尽量不用NOTIN和NOTEXISTS查询
语句,因为这种查询方式比较耗时,可以把NOTIN换成LEFTJOIN不为空
即可。
5.避免使用OR:尽量不用OR,用AND替代OR,AND通常比OR更有效。
6.避免使用模糊查询:尽量不用模糊查询,模糊查询效率较低,可以
用相似查询替代模糊查询。
7.合并多个表:如果有多个表,尽量合并这些表,以便减少查询次数。
8. 使用索引: 设置索引来提高查询速度,尽可能在 Where、Group by、Having、Order by等关键字中使用索引。
9. 优化sql语句顺序: 尽可能把WHERE条件的语句写在前面,以便
优先查询出少量的数据来,提高查询效率;把ORDER BY语句写在最后,
以便能有效地利用索引。
10.选择可用的查询方法:使用最适合的查询方法,选择适当的SELECT语句、JOIN语句和UNION语句,以使SQL语句更快地返回结果。
11. 避免使用Distinct: Distinct能会导致查询效率降低,尽量避免使用Distinct。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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
SELECT count(*) FROM record
WHERE date >'19990901' and place IN ('BJ','SH')
语句C
SELECT date,sum(amount) FROM record
group by date
1 在date上建有一个非聚集索引
A:(25秒)
B:(27秒)
C:(55秒)
分析:
date上有大量的重复值,在非聚集索引下,数据在物理上随机存放在数据页上,在围查找时,必须执行一次表扫描才能找到这一围的全部行。
2 在date上的一个聚集索引
A:(14秒)
B:(14秒)
C:(28秒)
分析:
在聚集索引下,数据在物理上按顺序在数据页上,重复值也排列在一起,因而在围查找时,可以先找到这个围的起末点,且只在这个围扫描数据页,避免了大围扫描,提高了查询速度。
3 在place,date,amount上的组合索引
A:(26秒)
C:(27秒)
B:(<1秒)
分析:
这是一个不很合理的组合索引,因为它的前导列是place,第一和第二条SQL没有引用place,因此也没有利用上索引;第三个SQL使用了place,且引用的所有列都包含在组合索引中,形成了索引覆盖,所以它的速度是非常快的。
4 在date,place,amount上的组合索引
A:(<1秒)
B:(<1秒)
C:(11秒)
分析:
这是一个合理的组合索引。它将date作为前导列,使每个SQL都可以利用索引,并且在第一和第三个SQL中形成了索引覆盖,因而性能达到了最优。
总结1
缺省情况下建立的索引是非聚集索引,但有时它并不是最佳的;合理的索引设计要建立在对各种查询的分析和预测上。一般来说:
有大量重复值、且经常有围查询(between, >,<,>=,<=)和order by、group by发生的列,考虑建立聚集索引;
经常同时存取多列,且每列都含有重复值可考虑建立组合索引;在条件表达式中经常用到的不同值较多的列上建立检索,在不同值少的列上不要建立索引。比如在雇员表的“性别”列上只有“男”与“女”两个不同值,因此就无必要建立索引。如果建立索引不但不会提高查询效率,反而会严重降低更新速度。
组合索引要尽量使关键查询形成索引覆盖,其前导列一定是使用最频繁的列。
2 避免使用不兼容的数据类型:
例如float和INt、char和varchar、bINary和varbINary是不兼容的。数据类型的不兼容可能使优化器无法执行一些本来可以进行的优化操作。例如: SELECT name FROM employee WHERE salary >60000
在这条语句中,如salary字段是money型的,则优化器很难对其进行优化,因为60000是个整型数。我们应当在编程时将整型转化成为钱币型,而不要等到运行时转化。
3 IS NULL 与IS NOT NULL:
不能用null作索引,任何包含null值的列都将不会被包含在索引中。即使索引有多列这样的情况下,只要这些列中有一列含有null,该列就会从索引中
排除。也就是说如果某列存在空值,即使对该列建索引也不会提高性能。任何在WHERE子句中使用is null或is not null的语句优化器是不允许使用索引的。
5 IN、OR子句常会使用工作表,使索引失效:
如果不产生大量重复值,可以考虑把子句拆开。拆开的子句中应该包含索引。
6 避免或简化排序:
应当简化或避免对大型表进行重复的排序。当能够利用索引自动以适当的次序产生输出时,优化器就避免了排序的步骤。以下是一些影响因素:
索引中不包括一个或几个待排序的列;
group by或order by子句中列的次序与索引的次序不一样;
排序的列来自不同的表。
为了避免不必要的排序,就要正确地增建索引,合理地合并数据库表(尽管有时可能影响表的规化,但相对于效率的提高是值得的)。如果排序不可避免,那么应当试图简化它,如缩小排序的列的围等。
7 消除对大型表行数据的顺序存取: