OracleSQL的优化

合集下载

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 Profiler分析查询语句,发现查询中存在复杂的子查询。

将子查询改为连接(JOIN)方式,减少了查询时间。

3、案例三:数据库参数优化问题描述:在一个大型电商系统中,用户在访问高峰期经常遇到响应时间过长的问题。

oracle 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 sql优化原理

oracle sql优化原理

oracle sql优化原理Oracle SQL优化原理概述在大型企业级数据库系统中,SQL查询的性能是至关重要的。

Oracle数据库是一种广泛使用的关系型数据库管理系统,为了提高查询性能和优化数据库的运行效率,开发人员需要了解Oracle SQL 优化的原理和方法。

本文将介绍一些常见的Oracle SQL优化原理,帮助开发人员更好地理解和应用这些原理。

1. 索引的使用索引是数据库中常用的一种优化技术,可以加快数据的查询速度。

在Oracle数据库中,可以通过创建适当的索引来优化SQL查询。

索引可以根据查询的条件快速定位到相关的数据,减少数据的扫描量。

在使用索引时,需要注意选择合适的索引列,避免过多的索引造成查询性能下降。

2. 表结构设计合理的表结构设计对于SQL查询的性能也有很大影响。

首先,需要根据业务需求来设计合适的表结构,避免冗余数据和不必要的字段。

其次,需要合理选择字段类型和大小,避免字段长度过长或者过短造成存储空间的浪费。

另外,还需要注意表之间的关联关系,避免多表连接操作过多,导致查询性能下降。

3. SQL语句的编写SQL语句的编写方式也会对查询性能产生影响。

首先,需要避免使用不必要的子查询和嵌套查询,可以通过合理的SQL语句重构来提高查询效率。

其次,需要避免使用SELECT *这样的通配符查询,而是明确指定需要查询的字段,减少不必要的数据传输和处理。

另外,还需要注意使用合适的条件表达式和操作符,避免全表扫描和索引失效。

4. 统计信息的收集Oracle数据库中的统计信息对于查询优化也起着重要的作用。

统计信息包括表的行数、列的唯一值数目、列的分布情况等,可以帮助优化器选择合适的执行计划。

在查询优化过程中,可以通过定期收集统计信息来保证查询的性能。

可以使用Oracle提供的统计信息收集工具来自动收集和更新统计信息。

5. SQL执行计划的分析Oracle数据库提供了执行计划用于分析SQL查询的执行情况。

浅谈Oracle数据库SQL性能优化

浅谈Oracle数据库SQL性能优化

千里之行,始于足下。

浅谈Oracle数据库SQL性能优化
SQL性能优化在Oracle数据库中是非常重要的,并且是一个复杂而繁琐的过程。

下面是一些常见的SQL性能优化技巧。

1. 使用正确的索引:索引是加快查询速度的重要因素。

确保表中的列被正确索引,以便Oracle能够快速定位所需的数据。

2. 优化查询语句:编写高效的查询语句是提高性能的关键,避免使用大量的子查询、联合查询以及不必要的计算。

3. 提高表的设计:优化表的结构和设计,包括拆分表、合并表、垂直分区和水平分区等。

4. 使用合适的数据类型:使用合适的数据类型可以节省存储空间和提高查询效率。

5. 避免使用全表扫描:全表扫描是一种费时的操作,尽量避免使用它,使用索引或其他技术来提高查询效率。

6. 分析并优化执行计划:使用Oracle的性能分析工具来分析查询执行计划,找出慢查询的原因,并优化查询的执行计划。

7. 优化硬件和服务器配置:提高服务器的性能,如增加内存、优化磁盘和网络等。

8. 定期收集统计信息:定期收集表和索引的统计信息,以便Oracle优化查询的执行计划。

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

9. 使用缓存和预编译:使用数据库缓存和预编译技术来提高查询速度。

10. 并发控制:合理设计并发控制机制,避免不必要的锁和死锁,提高查询和更新的并发性能。

总之,SQL性能优化是一个综合性工作,需要深入了解Oracle数据库的架构和原理,并结合具体的业务场景进行优化。

通过合理的索引设计、优化查询语句、优化表设计以及优化硬件和服务器配置等手段,可以大大提高Oracle数据库的性能。

OracleSQL性能优化

OracleSQL性能优化
AND EXISTS (SELECT ‘X’ FROM DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO AND LOC = ‘MELB’)
2003-09
21
用NOT EXISTS替代NOT IN (1)
➢ 在子查询中,NOT IN子句将执行一个内部的排序和 合并,对子查询中的表执行一个全表遍历,因此是非 常低效的。
WHERE DEPT_CAT=’A’)
高效:
SELECT …. FROM EMP E
WHERE NOT EXISTS (SELECT ‘X’ FROM DEPT D
WHERE D.DEPT_NO = E.DEPT_NO AND DEPT_CAT = ‘A’)
2003-09
23
用表连接替换EXISTS
2003-09
4
选择最有效率的表名顺序(1)
➢ ORACLE的解析器按照从右到左的顺序处理FROM子句中的 表名,因此FROM子句中写在最后的表(基础表 driving table) 将被最先处理
➢ 当ORACLE处理多个表时,会运用排序及合并的方式连接它 们。首先,扫描第一个表(FROM子句中最后的那个表)并对记 录进行派序,然后扫描第二个表(FROM子句中最后第二个表), 最后将所有从第二个表中检索出的记录与第一个表中合适记 录进行合并.
SELECT … FROM EMP E
WHERE SAL > 50000 AND JOB = ‘MANAGER’ AND 25 < (SELECT COUNT(*) FROM EMP WHERE MGR = E.EMPNO)
(高效,执行时间10.6秒)MP E
WHERE 25 < (SELECT COUNT(*) FROM EMP

oracle的sql优化

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 SQL Tuning Advisor:Oracle SQL Tuning Advisor 是一个工具,可以帮助用户自动优化 SQL 查询。

Oracle sql 性能优化调整

Oracle sql 性能优化调整

Oracle sql 性能优化调整一、前言Oracle SQL是众多企业使用较多的关系型数据库之一,因其高效稳定的性能,以及其提供的强大功能,逐渐成为了广大企业进行信息系统开发、实施和数据管理的首选。

然而,在大数据时代,普通的SQL查询已经不能支撑企业的业务需求,尤其是在数据量庞大的情况下,SQL查询的效率和性能将会受到严重的制约。

本文旨在介绍Oracle SQL的性能优化调整方法,以提高企业的数据处理的效率和性能。

二、排查问题SQL性能优化的第一步是排查问题,需要对慢查询做出明确的定位。

首先需要对SQL进行分析,寻找哪个部分影响了SQL性能,包括:1.查询语句的风格是否规范。

2.SQL语句是否能够使用索引优化查询。

3.数据库的表大小是否合适。

4.缓存的大小是否合适。

5.应用响应时间是否过长。

在分析完成后,才能通过性能优化来解决问题。

三、优化处理1.优化SQL查询语句SQL查询最主要的性能瓶颈是IO瓶颈。

当表的大小超过1万条时,应该对查询语句进行合理的检索,即避免全表扫描。

对大于1万条的表,应该创建索引,以便提高SQL的效率。

2.优化SQL查询计划查询计划优化是SQL调优的关键。

因为优化查询计划是确定整个查询需要的资源和查询的优化路径。

优化查询计划意味着查询应该从哪些索引开始,除了哪些索引以外,以及使用哪些操作符等等。

这些优化计划将明显影响查询性能。

3.优化表结构和索引优化表结构和索引也是常用的Oracle SQL优化方法。

表结构的优化主要是考虑数据库表的设计是否符合0NF、1NF、3NF等规范,是否有多列重复,是否存在无用列,是否存在大型BLOB/CLOB列等问题。

对于索引优化,可以使用多个单列索引代替多列复合索引以提高查询更新效率。

此外,还可以考虑使用等值连接或外连接改变查询本身,以便减少查询的数据量。

4.优化服务器硬件和操作系统软件硬件和操作系统软件的优化也很重要,因为数据库运行的效率和性能取决于服务器硬件和操作系统软件是否能够同时支持PMI和CPU等高性能功能。

oracle数据库sql优化方案

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语句进行优化,还可以通过调整数据库配置来提升性能:- 合理设置数据库的内存参数,包括共享池大小、缓冲池大小和PGA大小等。

- 设置适当的并发连接数,避免过度连接造成资源浪费。

- 配置硬盘存储方式,使用RAID技术提高数据存取速度。

- 使用数据库分区技术,将大表分成多个子表,提高查询效率。

5. 常见问题处理在优化SQL过程中,经常会遇到一些常见的性能问题,以下是一些处理方式:- 大数据量查询问题:可以考虑分页查询、增加合适的索引或引入缓存等手段来解决。

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

Oracle SQL的优化标签:oraclesql优化date数据库subquery2009-10-14 21:18 18149人阅读评论(21) 收藏举报分类:Oracle Basic Knowledge(208)SQL的优化应该从5个方面进行调整:1.去掉不必要的大型表的全表扫描2.缓存小型表的全表扫描3.检验优化索引的使用4.检验优化的连接技术5.尽可能减少执行计划的CostSQL语句:是对数据库(数据)进行操作的惟一途径;消耗了70%~90%的数据库资源;独立于程序设计逻辑,相对于对程序源代码的优化,对SQL语句的优化在时间成本和风险上的代价都很低;可以有不同的写法;易学,难精通。

SQL优化:固定的SQL书写习惯,相同的查询尽量保持相同,存储过程的效率较高。

应该编写与其格式一致的语句,包括字母的大小写、标点符号、换行的位置等都要一致ORACLE优化器:在任何可能的时候都会对表达式进行评估,并且把特定的语法结构转换成等价的结构,这么做的原因是要么结果表达式能够比源表达式具有更快的速度要么源表达式只是结果表达式的一个等价语义结构不同的SQL结构有时具有同样的操作(例如:= ANY (subquery) and IN (subquery)),ORACLE会把他们映射到一个单一的语义结构。

1 常量优化:常量的计算是在语句被优化时一次性完成,而不是在每次执行时。

下面是检索月薪大于2000的的表达式:sal > 24000/12sal > 2000sal*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的运行情况:语句ASELECT count(*) FROM recordWHERE date >'19991201' and date <'19991214‘and amount >2000 语句BSELECT count(*) FROM recordWHERE date >'19990901' and place IN ('BJ','SH')语句CSELECT date,sum(amount) FROM recordgroup by date1 在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 消除对大型表行数据的顺序存取:在嵌套查询中,对表的顺序存取对查询效率可能产生致命的影响。

比如采用顺序存取策略,一个嵌套3层的查询,如果每层都查询1000行,那么这个查询就要查询10亿行数据。

避免这种情况的主要方法就是对连接的列进行索引。

例如,两个表:学生表(学号、、年龄??)和选课表(学号、课程号、成绩)。

如果两个表要做连接,就要在“学号”这个连接字段上建立索引。

还可以使用并集来避免顺序存取。

尽管在所有的检查列上都有索引,但某些形式的WHERE子句强迫优化器使用顺序存取。

下面的查询将强迫对orders表执行顺序操作:SELECT *FROM orders WHERE (customer_num=104 AND order_num>10 01) OR order_num=1008虽然在customer_num和order_num上建有索引,但是在上面的语句中优化器还是使用顺序存取路径扫描整个表。

因为这个语句要检索的是分离的行的集合,所以应该改为如下语句:SELECT *FROM orders WHERE customer_num=104 AND order_num>100 1UNIONSELECT *FROM orders WHERE order_num=1008这样就能利用索引路径处理查询。

8 避免相关子查询:一个列的标签同时在主查询和WHERE子句中的查询中出现,那么很可能当主查询中的列值改变之后,子查询必须重新查询一次。

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

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

9 避免困难的正规表达式:MATCHES和LIKE关键字支持通配符匹配,技术上叫正规表达式。

但这种匹配特别耗费时间。

例如:SELECT *FROM customer WHERE zipcode LIKE “98_ _ _”即使在zipcode字段上建立了索引,在这种情况下也还是采用顺序扫描的方式。

如果把语句改为SELECT *FROM customer WHERE zipcode >“98000”,在执行查询时就会利用索引来查询,显然会大大提高速度。

另外,还要避免非开始的子串。

例如语句:SELECT *FROM customer WHERE zipcode[2,3] >“80”,在WHERE子句中采用了非开始子串,因而这个语句也不会使用索引。

10 不充份的连接条件:例:表card有7896行,在card_no上有一个非聚集索引,表account有191122行,在account_no上有一个非聚集索引,试看在不同的表连接条件下,两个SQL 的执行情况:SELECT sum(a.amount) FROM account a,card b WHERE a.card_no = b.card_no(20秒)将SQL改为:SELECT sum(a.amount) FROM account a,card b WHERE a.card_no = b.card_no and a.account_no=b.account_no(<1秒)分析:在第一个连接条件下,最佳查询方案是将account作外层表,card作层表,利用card上的索引,其I/O次数可由以下公式估算为:外层表account上的22541页+(外层表account的191122行*层表card上对应外层表第一行所要查找的3页)=595907次I/O在第二个连接条件下,最佳查询方案是将card作外层表,account作层表,利用account上的索引,其I/O次数可由以下公式估算为:外层表card上的1944页+(外层表card的7896行*层表account上对应外层表每一行所要查找的4页)= 33528次I/O可见,只有充份的连接条件,真正的最佳方案才会被执行。

相关文档
最新文档