`

你是否懂得Oracle UNION ALL

阅读更多

http://database.51cto.com/art/200911/164018.htm

Oracle有很多值得学习的地方,这里我们主要介绍Oracle UNION ALL,包括介绍UNION等方面。通常情况下,用UNION替换WHERE子句中的OR将会起到较好的效果。对索引列使用OR将造成全表扫描。注意,以上规则只针对多个索引列有效。假如有column没有被索引,查询效率可能会因为您没有选择OR而降低。在下面的例子中,LOC_ID 和REGION上都建有索引。

高效:

  1. SELECT LOC_ID 。 LOC_DESC ,REGION FROM LOCATION WHERE LOC_ID = 10 UNION SELECT LOC_ID , LOC_DESC ,REGION FROM LOCATION WHERE REGION = “MELBOURNE” 

低效:

  1. SELECT LOC_ID ,LOC_DESC ,REGION FROM LOCATION WHERE LOC_ID = 10 OR REGION = “MELBOURNE” 

用IN来替换OR:

这是一条简单易记的规则,但是实际的执行效果还须检验,在Oracle8i下,两者的执行路径似乎是相同的:

低效:

  1. SELECT…. FROM LOCATION WHERE LOC_ID = 10 OR LOC_ID = 20 OR LOC_ID = 30 

高效:

  1. SELECT… FROM LOCATION WHERE LOC_IN IN (10,20,30); 

避免在索引列上使用IS NULL和IS NOT NULL:

避免在索引中使用任何能够为空的列Oracle将无法使用该索引。对于单列索引,假如列包含空值,索引中将不存在此记录。对于复合索引,假如每个列都为空,索引中同样不存在此记录。假如至少有一个列不为空,则记录存在于索引中。举例:假如唯一性索引建立在表的A列和B列上,并且表中存在一条记录的 A,B值为(123,null), Oracle将不接受下一条具备相同A,B值(123,null)的记录(插入)。然而假如任何的索引列都为空,Oracle将认为整个键值为空而空不等于空。因此您能够插入1000 条具备相同键值的记录,当然他们都是空! 因为空值不存在于索引列中,所以WHERE子句中对索引列进行空值比较将使ORACLE停用该索引。

 

总是使用索引的第一个列:

假如索引是建立在多个列上,只有在他的第一个列(leading column)被where子句引用时,优化器才会选择使用该索引。这也是一条简单而重要的规则,当仅引用索引的第二个列时,优化器使用了全表扫描而忽略了索引。

 

用Oracle UNION ALL替换UNION ( 假如有可能的话):

当SQL语句需要UNION两个查询结果集合时,这两个结果集合会以Oracle UNION ALL的方式被合并,然后在输出最终结果前进行排序。假如用 Oracle UNION ALL替代UNION,这样排序就不是必要了。效率就会因此得到提高。需要注意的是,Oracle UNION ALL将重复输出两个结果集合中相同记录。因此各位还是要从业务需求分析使用Oracle UNION ALL的可行性。 UNION 将对结果集合排序,这个操作会使用到SORT_AREA_SIZE这块内存。对于这块内存的优化也是相当重要的。

分享到:
评论

相关推荐

    union all与order by用法

    在 Oracle PL/SQL 中, UNION ALL 和 ORDER BY 的使用需要遵循一定的规则和限制。本文将详细介绍 UNION ALL 和 ORDER BY 的用法,并通过实例解释其应用场景。 UNION ALL 的用法 UNION ALL 用于合并两个或多个 ...

    27.Oracle union多表查询1

    在Oracle数据库中,`UNION` 和 `UNION ALL` 是两种用于合并多个查询结果集的方法,主要应用于多表查询。这两个操作符在处理数据时有着显著的区别。 1. **UNION 操作符** `UNION` 用于合并两个或多个`SELECT`语句的...

    oracle集合union、union all、intersect、minus

    Oracle 集合操作是指在数据库中对数据进行集合运算的操作,包括 union、union all、intersect 和 minus 等操作。这些操作可以对数据进行合并、交叉、差异等处理,提高数据处理效率。 union 操作 Union 操作是将两...

    oracle中insert, 插入批量插入及union

    oracle中insert, 插入批量插入及union

    Oracle中Union与Union All的区别(适用多个数据库)

    你可以只在最后的 `UNION` 或 `UNION ALL` 之后添加一个 `ORDER BY` 子句来对整个结果集进行排序,如: ```sql SELECT empno, ename FROM emp UNION SELECT deptno, dname FROM dept ORDER BY ename; ``` 这条语句...

    Oracle集合操作函数union、intersect、minus.docx

    Oracle 集合操作函数 union、intersect、minus Oracle 集合操作函数是用于合并多条 SELECT 语句的结果的函数,包括 UNION、INTERSECT、MINUS 等。这些函数可以将多个查询结果合并成一个结果集,以便进一步处理和...

    oracle使用forall提高sql效率

    本文介绍了 使用 forall 来提高sql执行的效率。并通过对合格员工加薪存储过程的实例介绍,揭示了使用forall的好处

    Oracle_JDBC_ALL.zip

    Oracle JDBC ALL.zip是一个包含Oracle数据库连接驱动的压缩包,主要用于Java应用程序通过JDBC(Java Database Connectivity)接口与Oracle数据库进行交互。在Java开发中,尤其是使用Maven构建项目时,通常会依赖各种...

    Oracle 10g中用FORALL处理非连续数组

    Oracle 10g 中用 FORALL 处理非连续数组 Oracle 10g 中的 FORALL 语句可以处理非连续数组,这种能力在以前的版本中是不存在的。在 Oracle 10g 中,FORALL 语句可以使用 INDICES OF 和 VALUES OF 子句来处理非连续...

    linux 裝ORACLE的PACKING all

    首先,"PACKING all"可能指的是包含所有必要的安装文件和工具的压缩包,这包括数据库安装软件、相关的补丁以及OPatch工具等。OPatch是Oracle用于应用补丁的工具,它简化了对Oracle产品和服务的维护和更新过程。 1. ...

    Oracle-[WITH & CONNECT

    union all select '1' as pid, '2' as id, '2' as name from dual union all select '1' as pid, '3' as id, '3' as name from dual union all select '2' as pid, '5' as id, '5' as name from dual union ...

    oracle判断表名是否存在

    在Oracle数据库中,判断表名是否存在是常见的数据库管理任务,这通常涉及到SQL查询或使用数据库的系统视图。以下是一些关于如何在Oracle中检查表是否存在的方法。 首先,你可以使用`ALL_TABLES`或`USER_TABLES`系统...

    Oracle11g OCA OCP 认证 All-in-One 英文版教程

    本教程"Oracle11g OCA OCP 认证 All-in-One 英文版教程"涵盖了获得这两个认证所需的所有关键知识点,包括准备1Z0-051、1Z0-052和1Z0-053三门考试。 1Z0-051考试主要关注Oracle数据库基础,包括安装与配置、数据库...

    Oracle19C RAC通过gateways连接SQL server数据库

    Oracle 19C RAC(Real Application Clusters)是一种高可用性和可伸缩性的数据库解决方案,它允许多个实例共享同一个物理数据库。在本场景中,我们探讨的是如何在Oracle 19C RAC环境中通过Oracle数据库网关(Gateway...

    oracle判断表是否存在.

    oracle 判断表 是否存在.亲自手写可用才上传的。

    Oracle Database 10g OCP Certification All-in-One Exam Guide

    《Oracle Database 10g OCP Certification All-in-One Exam Guide》是一本专为追求Oracle 10g OCP(Oracle Certified Professional)认证的学习者精心编写的综合指南。这本书旨在帮助读者掌握Oracle数据库10g的核心...

    oracle实现阶梯式累加

    UNION ALL SELECT 'B', 10, 2000 FROM DUAL UNION ALL SELECT 'C', 20, 1500 FROM DUAL UNION ALL SELECT 'D', 20, 3000 FROM DUAL UNION ALL SELECT 'E', 10, 1000 FROM DUAL; ``` 这段代码创建了一个名为`SALARY`...

Global site tag (gtag.js) - Google Analytics