常用sql查询优化规则

合集下载

sql map字段

sql map字段

SQL Map是一款流行的开源工具,用于分析、监控和优化SQL查询。

在本文中,我们将介绍SQL Map的核心功能、如何使用它来分析和优化SQL查询,以及它与其他工具的比较。

一、SQL Map概述SQL Map是一款开源的SQL查询分析工具,旨在帮助开发人员优化数据库性能。

它能够收集数据库的查询信息,包括查询执行时间、执行次数、返回结果集大小等。

这些信息可以帮助开发人员识别性能瓶颈,并采取相应的优化措施。

二、SQL Map核心功能1. 查询分析:SQL Map能够分析数据库中的查询语句,并生成详细的查询报告。

报告包括查询语句的执行时间、执行次数、返回结果集大小等信息。

2. 查询优化:SQL Map提供了多种查询优化方法,例如使用索引、优化查询条件、减少查询返回结果集大小等。

开发人员可以根据实际情况选择合适的优化方法。

3. 监控和报警:SQL Map可以监控数据库的查询性能,并在查询执行时间超过预设阈值时发出报警。

这有助于开发人员及时发现性能瓶颈,并采取相应的措施。

4. 自定义规则:SQL Map支持自定义规则,开发人员可以根据自己的需求定义规则,并监控符合这些规则的查询。

5. 集成开发环境(IDE)插件:SQL Map提供了集成开发环境(IDE)插件,例如Visual Studio Code和Eclipse等,方便开发人员在开发过程中使用SQL Map。

三、使用SQL Map进行查询分析要使用SQL Map进行查询分析,需要以下步骤:1. 下载SQL Map并安装:可以从官网下载SQL Map安装包,按照提示进行安装。

2. 打开SQL Map:安装完成后,启动SQL Map并连接到目标数据库。

3. 分析查询:在SQL Map界面中,可以看到数据库中的所有查询语句及其执行信息。

可以右键单击查询语句,选择“分析”来分析查询。

4. 查看查询报告:分析查询后,可以在SQL Map界面中查看查询报告。

报告包括查询语句的执行时间、执行次数、返回结果集大小等信息。

hive sql物理执行计划和逻辑执行计划的优化规则

hive sql物理执行计划和逻辑执行计划的优化规则

hive sql物理执行计划和逻辑执行计划的优化规则Hive是一个基于Hadoop的数据仓库解决方案,它提供了类似于SQL查询的方式来处理存储在Hadoop集群中的大规模数据。

Hive SQL 的执行计划是将SQL查询转换为一系列物理操作的详细计划。

这个计划决定了数据在集群上的处理方式,包括数据的读取、过滤、聚合等操作。

在Hive中,有两种类型的执行计划:逻辑执行计划和物理执行计划。

逻辑执行计划是指将SQL查询转换为一系列逻辑操作的计划。

它描述了查询的逻辑结构和操作顺序,而不考虑物理存储和执行方式。

逻辑执行计划是Hive优化器的输入,它负责将逻辑执行计划转换为物理执行计划。

逻辑执行计划的优化规则是为了改进查询性能而对逻辑计划进行的一系列优化。

以下是一些常见的逻辑执行计划优化规则:1.谓词下推(Predicate Pushdown):将过滤操作在数据源上推。

这样可以尽早地过滤掉不满足查询条件的数据,减少数据的传输和处理开销。

2.列剪裁(Column Pruning):仅选择查询结果中需要的列,减少数据的传输和处理开销。

这可以通过在逻辑执行计划中删除不需要的投影操作来实现。

3.合并相邻的操作(Merger Adjacent Operations):将相邻的相同操作合并为一个操作,减少操作的数量和数据的传输开销。

例如,将多个相邻的投影操作合并为一个投影操作。

4.等值连接优化(Equi-Join Optimization):如果连接操作中使用了等值连接条件,可以优化连接的顺序和方式。

例如,将连接操作转换为MapJoin操作,通过加载连接表到内存中来加速查询。

5.子查询优化(Subquery Optimization):优化子查询的执行方式,将复杂的子查询转换为更简单的查询,提高查询性能。

物理执行计划是指将逻辑执行计划转换为一系列具体的物理操作的计划。

物理执行计划考虑了数据的存储方式、数据分布和计算资源等因素,以选择最优的编码、存储和执行方式来处理查询。

sql parallel用法

sql parallel用法

SQL Parallel用法SQL Parallel是一种在数据库中执行并行查询的技术。

通过将查询任务分解成多个子任务,并同时在多个处理单元上执行,可以显著提高查询性能和响应时间。

本文将介绍SQL Parallel的基本原理、使用场景以及一些常用的优化技巧。

基本原理SQL Parallel的基本原理是将一个大型查询任务分解成多个小任务,并在多个处理单元上同时执行这些子任务。

每个子任务都可以独立地访问数据库,然后将结果合并起来返回给用户。

为了实现并行执行,数据库管理系统需要具备以下几个关键特性:1.并行查询计划:数据库管理系统需要能够生成并行查询计划,即将查询任务分解成多个子任务,并确定这些子任务之间的依赖关系。

2.并行执行引擎:数据库管理系统需要具备并行执行引擎,能够同时在多个处理单元上执行子任务,并进行结果合并。

3.数据分区:为了实现并行执行,数据通常会被划分成多个分区,每个分区可以由不同的处理单元进行处理。

使用场景SQL Parallel适用于以下情况:1.大数据量查询:当查询涉及到大量数据时,使用SQL Parallel可以加快查询速度。

通过将数据划分成多个分区进行并行处理,可以充分利用多个处理单元的计算能力。

2.复杂查询:当查询包含多个复杂的子查询或连接操作时,使用SQLParallel可以提高查询性能。

将复杂查询拆分成多个子任务,并在多个处理单元上并行执行,可以减少整体执行时间。

3.实时数据分析:对于需要实时分析大量数据的应用场景,使用SQLParallel可以提高响应时间。

通过并行执行查询任务,可以更快地获取到实时数据分析的结果。

优化技巧下面是一些常用的SQL Parallel优化技巧:1.数据划分:将数据按照某种规则进行划分,并将每个分区放置在不同的处理单元上。

这样可以避免不必要的数据传输和通信开销,提高并行执行效率。

2.并行连接:对于包含连接操作的查询,可以将连接操作拆分成多个子任务,并在多个处理单元上并行执行。

sql优化常用面试题

sql优化常用面试题

sql优化常用面试题SQL优化是数据库开发和维护中非常重要的一项工作。

在面试过程中,面试官通常会提出一些与SQL优化相关的问题,以下是一些常见的SQL优化面试题:1. 如何进行SQL优化?SQL优化可以通过以下几个方面实现:1.1. 索引优化:合理创建索引并保证索引的使用;1.2. 查询优化:使用合适的查询语句、减少不必要的查询、优化查询条件和排序等;1.3. 数据库设计优化:合理设计数据库结构,避免冗余字段和表,减少数据的存储和检索;1.4. 优化表结构:适当分割数据表,避免表过大,减少数据操作的时间;1.5. SQL语句优化:合理编写SQL语句,避免使用子查询、JOIN 操作等可能导致性能下降的语句。

2. 什么是索引?为什么要使用索引?索引是一种数据结构,用于加快数据库的检索速度。

通过将特定列上的索引值与实际数据进行映射,可以快速定位到包含指定数据的记录,提高查询效率。

索引的使用可以带来以下优点:- 加快数据检索速度:通过索引,数据库可以直接访问到符合查询条件的数据,加快查询速度;- 提高查询性能:索引可以减少数据库的扫描操作,降低系统资源的占用;- 支持唯一性约束:通过创建唯一索引,可以确保数据表中某些列的唯一性;- 支持排序:通过创建排序索引,可以直接按照索引顺序返回数据。

3. 什么是SQL执行计划?SQL执行计划是数据库执行SQL语句时生成的一种执行计划,用于指导数据库如何执行SQL查询。

执行计划是由数据库的查询优化器生成的,它会根据表结构、索引情况等因素评估查询的成本,并生成一种最优的执行计划。

SQL执行计划包括了查询语句的扫描方式、连接类型、索引使用情况等信息,有助于分析查询的性能瓶颈以及优化性能。

4. 如何通过查看SQL执行计划来进行优化?通过查看SQL执行计划,可以获取查询语句的执行细节,从而进行性能优化。

4.1. 扫描方式优化:通过查看执行计划中的扫描方式,可以了解查询是如何扫描表的(全表扫描、索引扫描等),针对不同的扫描方式,可以针对性地进行优化,如创建合适的索引、优化查询条件等。

sql语言的标准

sql语言的标准

sql语言的标准一、概述SQL(StructuredQueryLanguage)是一种用于管理关系数据库系统的标准语言。

它被广泛用于各种数据库管理系统,如MySQL、Oracle、SQLServer等。

本标准旨在规范SQL语言的使用和行为,以确保在不同的数据库管理系统之间的一致性和互操作性。

二、语法规则1.语句结构:SQL语句通常以一个或多个关键字开头,后面跟着表名、列名、条件、操作符和值等元素。

语句以分号结尾。

2.关键字:SQL关键字用于指定操作类型,如SELECT、INSERT、UPDATE、DELETE等。

3.表格和列:表格是SQL中的基本数据结构,由列和行组成。

列名是表格中每个单元格的名称,行是表格中的数据单元。

4.条件:条件用于筛选表格中的数据。

常用的条件包括等于、不等于、大于、小于、包含等。

5.操作符:操作符用于执行各种数据操作,如加法、减法、乘法、除法等。

6.排序和分组:SQL支持对表格数据进行排序和分组,以便对数据进行更高级的查询和分析。

三、标准内容1.语法规则:详细描述SQL语句的语法结构,包括关键字、表格和列的命名规则、条件和操作符的使用方法等。

2.数据类型:定义SQL支持的数据类型,包括数字、字符串、日期等。

3.查询语句:规定如何使用SELECT语句从表格中检索数据,包括通配符的使用、聚合函数的使用等。

4.插入语句:规定如何使用INSERT语句向表格中插入数据。

5.更新语句:规定如何使用UPDATE语句修改表格中的数据。

6.删除语句:规定如何使用DELETE语句删除表格中的数据。

7.事务处理:规定如何使用事务来确保数据库操作的原子性、一致性和隔离性。

8.安全性:规定如何使用SQL语句来保护数据库的安全性,包括用户身份验证、权限管理等。

9.性能优化:提供一些优化SQL语句的建议,以提高查询性能和响应速度。

四、标准实施1.数据库管理系统开发商:数据库管理系统开发商应遵循本标准,确保其产品支持SQL语言的规范使用。

第九章 sql 数据库 关系查询处理与查询优化 中央财经

第九章 sql 数据库 关系查询处理与查询优化 中央财经
– 使用索引(或散列)得到Sno为‘200215121’ 元组的指针 – 通过元组指针在student表中检索到该学生
• [例1-C3] 以C3为例,Sage>20,并且Sage 上有B+ 树索引
– 使用B+树索引找到Sage=20的索引项,以此为入口点在 B+树的顺序集上得到Sage>20的所有元组指针 – 通过这些元组指针到student表中检索到所有年龄大于20的 学生。
连接操作的实现(续)
4. Hash Join方法
– 把连接属性作为hash码,用同一个hash函 数把R和S中的元组散列到同一个hash文件 中
– 步骤:
• 划分阶段(partitioning phase):
– 对包含较少元组的表(比如R)进行一遍处理 – 把它的元组按hash函数分散到hash表的桶中
• 试探阶段(probing phase):也称为连接阶段(join phase)
– 对另一个表(S)进行一遍处理 – 把S的元组散列到适当的hash桶中 – 把元组与桶中所有来自R并与之相匹配的元组连接起来
连接操作的实现(续)
• 上面hash join算法前提:假设两个表中 较小的表在第一阶段后可以完全放入内 存的hash桶中
• [例2] SELECT * FROM Student,SC
WHERE Student.Sno=SC.Sno;
连接操作的实现(续)
• 1. 嵌套循环方法(nested loop)
• 2. 排序-合并方法(sort-merge join 或merge join)
• 3. 索引连接(index join)方法 • 4. Hash Join方法
• 用多种等价的关系代数表达式来完成这一查询 Q1=πSname(σS.Sno=SC.Sno∧o='2'(S×SC)) • 执行查询的总时间≈105+2×5×104≈105s • Q2=πSname(σo='2'(S∞SC)) • 总的执行时间≈105+50+50≈205s • Q3=πSname(S∞σo='2' (SC)) • 总的执行时间≈5+5≈10s。

SQL Server的查询优化

SQL Server的查询优化

连接的两表 , 一个较大另一个较小 , 则可 以选择嵌套循环连 接 , 并选择较小 的表作 为外表 。
在关系数据库管理 系统 中, 能是一 个关键 性的 问题 , 性 特 别是怎样通过优化使性 能达 到最佳状 态 。关 系数据 库系统 对 用户的查询要求 隐藏查询路径 和存 取方法 , 用户 只需指 出需 要 查询的 内容 , 由 D M 而 B S负责 选 择具 体 的查 询路 径 和存 取 方 法 。为 了提高和达到用户接受 的查询性 能 , 关系系统 中查询 优
维普资讯
山西科技
S A X CE C N E H O O Y H N I IN E A DT C N L G S
2O O8年第 5 期
9月 2 0日出版
● 信 息 技 术
S L S re 的 查 询 优 化 Q evr
张 兴 李海芳2
能 的高低 。影响 S LSre 系统 性能 的主要 因素有 : Q e r v ①系统 硬
合并乘 积和其后的选择为连接运算 ; 去掉多余 的属性 。可能时 对每个 叶结 点或 中间结点 加上 必要 的投影操作 , 以除去对后续 操作没 有影 响的属性 , 减少 中 间结果 ;
找 出公共子 表达式。
其一般准则有 :
的响应时间和最大 的吞吐率 , 从而获得最佳性能 。其 中响应 时 间是处理查询并将结果集 中的首行返 回给用 户所需 的时 间长 度, 而吞 吐率是 服务 器 在给 定时 内处理 的查 询 总数 的度 量
值 。因 此 , 响应 时 间 的 长 短 和 吞 吐 率 的 大 小 直 接 影 响到 系统 性
选择运算尽 可能先做 , 目的是 为了减 小中间关系 ; 在执行连接操作 前对文件适 当进行预处理 , 如排序或在连 接属性上建立索 引 ; 投影运算 和选择运算同时做 , 目的是避免重复扫描关系 ; 将投影运算 与其 前面或后面的双 目运算结合起来 , 以减少

表连接优化

表连接优化

浓密树 它连接的两个输入可能都不是表,这种树的结构是完全自由的,查询优化 器只有在没有其他选择的情况下才会选择他。他常会出现在有无法合并的 视图或者子查询的时候。
连接的类型 两种写法 1、SQL-86 2、oracle9i开始支持SQL-92 我们下面来看看连接类型 1、交叉连接(笛卡尔连接) 将一张表的所有记录与另一张表的所有记录进行组合的操作。
当一条SQL语句引用多张表的时候,查询优化器不仅要确定每张表的访问路径, 而且需要确定这些表的连接顺序和连接方法。 查询优化器的目标是通过尽早的过滤不需要的数据,减少需要处理的数据量。
连接树 数据库引擎支持的所有的连接方法都是每次只能处理两个数据集,他们被称为 左节点(left input)和右节点(right input),左节点先于右节点执行。 当需要对两个以上的数据集进行连接的时候,查询优化器会评估不同的连接树。
连接条件 限制条件
从实现的角度看,查询优化器误用限制条件与连接条件也是正常的,一 方面,连接条件可用来过滤数据,另一方面,为了最大程度的降低连接 使用的数据量,限制条件可能会在连接条件之前进行过滤。
首先执行的是限制条件 然后进行表连接
嵌套循环连接 嵌套循环连接处理的两个数据集被称为外部循环(outer loop,也就是驱动 数据源,driving row source)和内部循环(inner loop)。 外部循环作为左子节点,内部循环作为右子节点。 当外部循环执行一次的时候,内部循环需要针对外部循环返回的每条记录 执行一次。
注意:无法控制块预取功能的使用,如何以及是否使用块预取是数据库引擎自行 决定的。
其他可选的执行计划 只有当内部循环或者外部循环是 基于唯一索引扫描的时候才会使 用这种类型的执行计划。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.说明数据库系统需要保存大量历史记录,系统内存在许多历史记录表,因此常常出现系统运行一段时间,表记录数达到一定数量后,系统响应明显变慢的现象。

为尽可能的提高SQL 执行的效率,我们在编写SQL语句应该遵循一定的优化规则,使代码风格统一、规范。

充分利用表索引,避免进行全表扫描;充分利用结构化编程方式,提高查询的复用能力,也许完全遵守以下方法速度未必达到想要的结果,但是养成一个好的编程习惯是重要的。

2.调优方法2.1. 相同功能、性能的SQL语句ORACLE采用共享内存SGA的机制,因此ORACLE会对每个不同写法的SQL进行分析,并且占用共享内存;如果书写格式完全相同,则ORACLE只分析一次,遇到相同书写格式的SQL,会直接从共享内存中获取结果集;这样便能减少共享池的开销以及代码的复用。

处理方法:保证书写格式相同,包括大小写,空格位置,表别名等一致;将一些通用的SQL 语句作为公共函数由其它函数调用的方式使用。

2.2. 动态SQL:动态SQL采用变量动态绑定的方式,避免重复解析。

2.3. 连接方式与表名顺序多表查询时需要选择最有效率的表名顺序(基于规则的优化器有效),ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名;因此写在最后的那张基础表最先被处理,即选择记录数最少的表作为基础表,首先,扫描FROM子句中最右的那个表,并对记录进行排序,然后扫描FROM子句中最后第二个表,最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并。

2.4. 查询条件顺序ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前,那些可以过滤掉最大数量记录的条件适合写在WHERE子句的末尾。

2.5. 语法和语义2.5.1.SELECT子句中避免使用' * '使用'*' ,Oracle便会查询数据字典,依次解析各列名,应明确指定各列的名称,这样也便于理解。

Select * from t_user t;2.5.2.使用表的别名(Alias)多表查询时,使用表的别名,同样可以避免解析,避免歧义,提高效率。

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

下面是检索月薪大于2000的的表达式:sal > 24000/12sal > 2000sal*12 > 24000如果SQL语句包括第一种情况,优化器会简单地把它转变成第二种。

优化器不会简化跨越比较符的表达式,例如第三条语句,鉴于此,应尽量写用常量跟字段比较检索的表达式,而不要将字段置于表达式当中。

否则没有办法优化,比如如果sal上有索引,第一和第二就可以使用,第三就难以使用。

2.6. 函数和表达式2.6.1. 用>=替代>例如:DEPTNO上有一个索引,高效: SELECT * FROM EMP WHERE DEPTNO >=4低效:SELECT * FROM EMP WHERE DEPTNO >3两者的区别在于,前者DBMS将直接跳到第一个DEPT等于4的记录而后者将首先定位到DEPTNO=3的记录并且向前扫描到第一个DEPT大于3的记录。

2.6.2. 使用DECODE函数来减少处理时间使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表.2.6.3.用TRUNCATE替代DELETE当删除表中的记录时,在通常情况下,回滚段(rollback segments ) 用来存放可以被恢复的信息. 如果你没有COMMIT事务,ORACLE会将数据恢复到删除之前的状态(准确地说是恢复到执行删除命令之前的状况) ,而当运用TRUNCATE时,回滚段不再存放任何可被恢复的信息.当命令运行后,数据不能被恢复,因此很少的资源被调用,执行时间也会很短。

TRUNCATE只在删除全表或分区适用,TRUNCATE是DDL不是DML2.7. 常用操作符优化2.7.1.LIKE操作符组合没有通配符的表达式优化器把使用LIKE操作符和一个没有通配符的表达式组成的检索表达式转换为一个“=”操作符表达式。

例如:优化器会把表达式ename LIKE 'SMITH'转换为ename = 'SMITH'优化器只能转换涉及到可变长数据类型的表达式,前一个例子中,如果ENAME字段的类型是CHAR(10),那么优化器将不做任何转换。

一般来讲LIKE比较难以优化。

2.7.2.用EXISTS替代IN,not exists 替换not in优化器把使用IN比较符的检索表达式替换为等价的使用“=”和“OR”操作符的检索表达式。

用IN/ not in将启用全表扫描,使用EXISTS将利用索引,提高查询效率。

EXISTS 要远比IN的效率高。

里面关系到full table scan和range scan。

几乎将所有的IN操作符子查询改写为使用EXISTS的子查询。

例如,优化器会把表达式ename IN ('SMITH','KING','JONES')替换为ename = 'SMITH' OR ename = 'KING' OR ename = 'JONES‘语句1SELECT dname, deptno FROM deptWHERE deptno NOT IN(SELECT deptno FROM emp);语句2SELECT dname, deptno FROM deptWHERE NOT EXISTS(SELECT deptno FROM empWHERE dept.deptno = emp.deptno);2要比1的执行性能好很多。

因为1中对emp进行了full table scan,这是很浪费时间的操作。

而且1中没有用到emp的INdex。

因为没有WHERE子句。

而2中的语句对emp进行的是range scan。

2.7.3.用表连接替换EXISTS2.7.4.用EXISTS替换DISTINCT2.7.5.避免在索引列上使用IS NULL和IS NOT NULL不能用null作索引,任何包含null值的列都将不会被包含在索引中。

即使索引有多列这样的情况下,只要这些列中有一列含有null,该列就会从索引中排除。

也就是说如果某列存在空值,即使对该列建索引也不会提高性能。

任何在WHERE子句中使用is null或is not null 的语句优化器是不允许使用索引的。

举例如下:低效(索引失效) :SELECT * FROM DEPARTMENT WHERE DEPT_CODE IS NOT NULL;高效(索引有效) : SELECT * FROM DEPARTMENT WHERE DEPT_CODE >=0;2.7.6. 用UNION-ALL 替换UNION当SQL语句需要UNION两个查询结果集合时,这两个结果集合会以UNION-ALL的方式被合并,然后在输出最终结果前进行排序。

如果用UNION ALL替代UNION,这样排序就不是必要了。

效率就会因此得到提高。

2.7.7.用UNION替换OR (适用于索引列)如果不产生大量重复值,可以考虑把子句拆开。

拆开的子句中应该包含索引。

通常情况下,用UNION替换WHERE子句中的OR将会起到较好的效果。

对索引列使用OR将造成全表扫描。

注意,以上规则只针对多个索引列有效。

如果有column没有被索引,查询效率可能会因为你没有选择OR而降低。

2.7.8.用WHERE替代ORDER BYORDER BY 子句只在两种严格的条件下使用索引: ORDER BY中所有的列必须包含在相同的索引中并保持在索引中的排列顺序。

ORDER BY中所有的列必须定义为非空。

WHERE 子句使用的索引和ORDER BY子句中所使用的索引不能并列.2.7.9.用WHERE子句替换HA VING子句避免使用HA VING子句,HA VING 只会在检索出所有记录之后才对结果集进行过滤。

这个处理需要排序,总计等操作。

如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销。

例子如下:低效:SELECT REGION,A VG(LOG_SIZE)FROM LOCATIONGROUP BY REGIONHA VING REGION REGION != 'SYDNEY' AND REGION != 'PERTH'高效SELECT REGION,A VG(LOG_SIZE)FROM LOCATIONWHERE REGION REGION != 'SYDNEY'AND REGION != 'PERTH'GROUP BY REGIONHA VING 中的条件一般用于对一些集合函数的比较,如COUNT() 等等。

除此之外,一般的条件应该写在WHERE子句中。

2.7.10.GROUP BY的使用提高GROUP BY 语句的效率,可以通过将不需要的记录在GROUP BY 之前过滤掉。

下面两个查询返回相同结果但第二个明显就快了许多。

2.7.11.BETWEEN 操作符:优化器总是用“>=”和“<=”比较符来等价的代替BETWEEN操作符。

例如:优化器会把表达式sal BETWEEN 2000 AND 3000用sal >= 2000 AND sal <= 3000来代替。

2.7.12.NOT 操作符:优化器总是试图简化检索条件以消除“NOT”逻辑操作符的影响,这将涉及到“NOT”操作符的消除以及代以相应的比较运算符。

例如,优化器将下面的第一条语句用第二条语句代替:NOT deptno = (SELECT deptno FROM emp WHERE ename = 'TAYLOR')deptno <> (SELECT deptno FROM emp WHERE ename = 'TAYLOR')通常情况下一个含有NOT操作符的语句有很多不同的写法,优化器的转换原则是使“NOT”操作符后边的子句尽可能的简单,即使可能会使结果表达式包含了更多的“NOT”操作符。

例如,优化器将如下所示的第一条语句用第二条语句代替:NOT (sal < 1000 OR comm IS NULL)NOT sal < 1000 AND comm IS NOT NULL sal >= 1000 AND comm IS NOT NULL 2.7.13.ANY和SOME 操作符优化:优化器将跟随值列表的ANY和SOME检索条件用等价的同等操作符和“OR”组成的表达式替换。

相关文档
最新文档