`
csbison
  • 浏览: 154807 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Oracle优化笔记1

阅读更多

Oracle优化笔记
 
 
    摘自《Oracle 10g SQL 开发指南》
        

1. 使用WHERE而不是HAVING
2. 使用UNION ALL 而不是UNION
3. 使用EXISTS而不是IN
4. 使用EXISTS而不是 DISTINCT ;(因为DISTINCT在禁止重复行之前要排序检索到的行)

 

   
        查看解析计划:

    

1. explain plan for YOUR_SQL
2. select * from table(dbms_xplan.display());  

 

1. 用EXISTS替换DISTINCT
当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT. 一般可以考虑用EXIST替换
 例如:
低效:
    SELECT DISTINCT DEPT_NO,DEPT_NAME
    FROM DEPT D,EMP E
    WHERE D.DEPT_NO = E.DEPT_NO
高效:
    SELECT DEPT_NO,DEPT_NAME
    FROM DEPT D
    WHERE EXISTS ( SELECT 1
                    FROM EMP E
                    WHERE E.DEPT_NO = D.DEPT_NO);
  EXISTS 使查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果.

 

2. 最高效的删除重复记录方法 ( 因为使用了ROWID)
DELETE FROM EMP a
WHERE a.ROWID > (SELECT MIN(b.ROWID)
                   FROM EMP b  WHERE a.EMP_NO = b.EMP_NO);
-- 对于select语句中 过滤重复记录,则可以使用类似
SELECT * FROM EMP a
WHERE a.ROWID = (SELECT MIN(b.ROWID) FROM EMP b  WHERE a.EMP_NO = b.EMP_NO);

 

3. 尽量多使用COMMIT
只要有可能,在程序中尽量多使用COMMIT, 这样程序的性能得到提高,需求也会因为COMMIT所释放的资源而减少:
 COMMIT所释放的资源:
a.       回滚段上用于恢复数据的信息.
b.       被程序语句获得的锁
c.       redo log buffer 中的空间
d.       ORACLE为管理上述3种资源中的内部花费

 

    ·表索引一些注意的地方:

1. WHERE语句将决定是否有使用索引。
 

* 需要当心的WHERE子句

某些SELECT 语句中的WHERE子句不使用索引. 这里有一些例子.

在下面的例子里, ‘!=’ 将不使用索引. 记住, 索引只能告诉你什么存在于表中, 而不能告诉你什么不存在于表中.

不使用索引:

SELECT ACCOUNT_NAME

FROM TRANSACTION

WHERE AMOUNT !=0;

使用索引:

SELECT ACCOUNT_NAME

FROM TRANSACTION

WHERE AMOUNT >0;

下面的例子中, ‘||’是字符连接函数. 就象其他函数那样, 停用了索引.

不使用索引:

SELECT ACCOUNT_NAME,AMOUNT

FROM TRANSACTION

WHERE ACCOUNT_NAME||ACCOUNT_TYPE=’AMEXA’;

使用索引:

SELECT ACCOUNT_NAME,AMOUNT

FROM TRANSACTION

WHERE ACCOUNT_NAME = ‘AMEX’

AND  ACCOUNT_TYPE=’ A’;

下面的例子中, ‘+’是数学函数. 就象其他数学函数那样, 停用了索引.

不使用索引:

SELECT ACCOUNT_NAME, AMOUNT

FROM TRANSACTION

WHERE AMOUNT + 3000 >5000;

使用索引:

SELECT ACCOUNT_NAME, AMOUNT

FROM TRANSACTION

WHERE AMOUNT > 2000 ;

下面的例子中,相同的索引列不能互相比较,这将会启用全表扫描.

不使用索引:

SELECT ACCOUNT_NAME, AMOUNT

FROM TRANSACTION

WHERE ACCOUNT_NAME = NVL(:ACC_NAME,ACCOUNT_NAME);

使用索引:

SELECT ACCOUNT_NAME, AMOUNT

FROM TRANSACTION

WHERE ACCOUNT_NAME LIKE NVL(:ACC_NAME,’%’);

译者按:

如果一定要对使用函数的列启用索引, ORACLE新的功能: 基于函数的索引(Function-Based Index) 也许是一个较好的方案.

 CREATE INDEX EMP_I ON EMP (UPPER(ename)); /*建立基于函数的索引*/

 SELECT * FROM emp WHERE UPPER(ename) = ‘BLACKSNAIL’; /*将使用索引*/

   

2. 数值类型转换将可能不会使用索引。所以尽可能将索引的列定义为NUMBER类型。
 

现在,假设EMP_TYPE是一个字符类型的索引列.

SELECT …
FROM EMP

WHERE EMP_TYPE = 123

这个语句被ORACLE转换为:

SELECT …

FROM EMP

WHERE TO_NUMBER(EMP_TYPE)=123

因为内部发生的类型转换, 这个索引将不会被用到!

   

3. 避免在索引列上使用计算.
WHERE子句中,如果索引列是函数的一部分.优化器将不使用索引而使用全表扫描.
 
举例:
 
 
低效:
 
SELECT …
FROM DEPT
WHERE SAL * 12 > 25000;
 
高效:
SELECT …
FROM DEPT
WHERE SAL  > 25000/12;
 
译者按:
这是一个非常实用的规则,请务必牢记

   

4. DECODE的使用.
DECODE compares expr to each search value one by one. If expr is equal to a search, then Oracle Database returns the corresponding result. If no match is found, then Oracle returns default. If default is omitted, then Oracle returns null.
 
使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表.
例如:
   SELECT COUNT(*),SUM(SAL)
   FROM EMP
   WHERE DEPT_NO = 0020
   AND ENAME LIKE ‘SMITH%’;
   SELECT COUNT(*),SUM(SAL)
   FROM EMP
   WHERE DEPT_NO = 0030
   AND ENAME LIKE ‘SMITH%’;
你可以用DECODE函数高效地得到相同结果
SELECT COUNT(DECODE(DEPT_NO,0020,’X’,NULL)) D0020_COUNT,
        COUNT(DECODE(DEPT_NO,0030,’X’,NULL)) D0030_COUNT,
        SUM(DECODE(DEPT_NO,0020,SAL,NULL)) D0020_SAL,
        SUM(DECODE(DEPT_NO,0030,SAL,NULL)) D0030_SAL
FROM EMP WHERE ENAME LIKE ‘SMITH%’;
类似的,DECODE函数也可以运用于GROUP BY 和ORDER BY子句中.

 

5. row_number和over partition by的使用.
下面语句的作用是根据msisdn分组,并查询出create_time最新的记录

select msisdn,imsi,user_type,1  reg_type,city_id,prov_id,create_time

            from(

                  select msisdn,imsi,user_type ,city_id,prov_id,create_time,

                         row_number()over(partition by msisdn order by create_time desc) r

                  from   UDPAIR_HIS

                  where  udpair_id between id and MIDDLE_ID

                )

            where r=1;


   

 

分享到:
评论

相关推荐

    oracle优化笔记

    ### Oracle优化笔记 #### SQL语句优化 在SQL语句优化方面,主要关注查询效率、减少数据冗余以及提升整体性能。以下几点是常见的优化手段: 1. **使用索引**:合理创建索引可以显著提高查询速度。例如,基于功能的...

    Oracle学习笔记-日常应用、深入管理、性能优化

    资源名称:Oracle学习笔记-日常应用、深入管理、性能优化内容简介:Oracle学习笔记-日常应用、深入管理、性能优化Oracle 11g是最具代表性的高端关系型数据库管理系统,它在世界各地的大型商务数据库应用系统中被广泛...

    ORACLE学习笔记之调节性能优化篇

    Oracle数据库性能优化是数据库管理员和开发人员日常工作中不可或缺的部分,它涉及到查询优化、资源管理、系统调整等多个方面。本文主要围绕ORACLE数据库的性能优化,特别是如何通过不同的方式来追踪和分析SQL语句的...

    李兴华Oracle全部笔记

    再者,李兴华的笔记可能涉及Oracle的性能优化,这包括SQL查询优化、索引优化、数据库参数调优等,这些都是数据库管理员日常工作中不可或缺的部分。他可能分享了如何使用Oracle的 Explain Plan 和 SQL Trace 工具来...

    oracle实用笔记 命令 文档 pdf

    1. **Oracle SQL语法**:SQL(Structured Query Language)是用于管理和操作数据库的标准语言。在Oracle中,SQL用于创建、修改和查询表,以及执行各种数据操作任务。例如,`CREATE TABLE`用于创建新表,`ALTER TABLE...

    Oracle学习笔记 PDF

    ### Oracle学习笔记知识点详解 #### 一、Oracle简介 Oracle是一家知名的软件公司,以其数据库管理系统闻名全球。该公司成立于1977年,总部位于美国加利福尼亚州。Oracle不仅提供数据库解决方案,还涉及中间件、...

    Oracle学习笔记精华版

    总之,Oracle学习笔记精华版是一份全面且深入的学习资料,涵盖了Oracle数据库的关键概念、管理和优化技术,对于任何想要在Oracle领域提升自己的人来说都是宝贵的资源。通过系统学习和实践,读者可以有效地掌握Oracle...

    oracle培训笔记2

    在"Oracle培训笔记2"中,我们可以看到一系列的课程涵盖了XML基础和多行函数的应用,这些都是Oracle数据库管理和开发中的关键知识点。 XML(可扩展标记语言)在Oracle中的应用非常广泛,特别是在数据交换和存储非...

    韩顺平oracle课堂笔记

    除了上述重点,笔记可能还包含了Oracle的其他重要概念,如索引、触发器、视图、事务管理、备份恢复策略、性能优化技巧等。索引能显著提升查询速度,但过度使用也可能导致写操作变慢;触发器用于在特定事件发生时自动...

    ORACLE学习笔记:日常应用、深入管理、性能优化.part1/2

    ORACLE学习笔记:日常应用、深入管理、性能优化.part1

    Oracle学习笔记——日常应用、深入管理、性能优化 示例代码

    Oracle 11g是最具代表性的高端关系型数据库管理系统,它在世界各地的大型商务数据库应用系统中被广泛...本书设计了大量的应用情景,介绍了数据库管理员和开发人员常用的管理、维护和优化Oracle 11g数据库的技术和技巧。

    Oracle优化笔记

    Oracle优化笔记 很多很全的优化

    Oracle学习笔记.pdf

    Oracle是世界上最广泛使用的数据库管理系统之一,它提供了丰富的功能和组件,包括数据存储、查询优化、安全性、并发控制等。以下是对Oracle学习笔记中提到的一些关键知识点的详细解释: 1. **SQL执行顺序**: SQL...

    oracle_sql笔记

    这篇笔记主要涵盖了Oracle SQL的基础知识、高级特性和实际应用技巧。 一、基础SQL语法 Oracle SQL遵循标准的SQL语法,包括SELECT、INSERT、UPDATE、DELETE四大语句。用于查询数据的基本结构是SELECT字段列表FROM...

    李兴华—oracle课堂笔记(全).rar

    1. **Oracle基础知识**:首先,笔记可能会介绍Oracle的基本概念,如数据库架构、表空间、数据块等。这包括数据库的创建、启动和关闭,以及如何管理和维护数据库实例。 2. **SQL语言**:Oracle支持结构化查询语言...

    韩顺平Oracle教学笔记.docx

    韩顺平Oracle数据库教程笔记涵盖了Oracle数据库的基础知识和高级技术,涵盖了数据类型、查询语句、条件语句、排序语句、分组语句、联结语句、子查询、数据操作、视图、索引、存储过程、触发器、数据库设计、数据库...

    Oracle数据库笔记大全

    在实际操作中,Oracle数据库的管理和开发涉及大量细节和技巧,如性能优化、备份恢复、安全设置等。理解这些基本概念和操作是成为Oracle数据库管理员或开发人员的基础。通过不断学习和实践,可以更好地掌握Oracle...

    oracle教程笔记

    数据库管理是Oracle教程笔记的重点,包括表空间和数据文件的管理、用户权限和角色的分配、备份与恢复策略、性能优化等。理解这些概念有助于确保数据库的稳定运行和数据的安全性。 在学习过程中,你还需要关注索引的...

    ORACLE DBA工作笔记 运维数据迁移与性能调优

    3. Oracle数据库的架构和存储结构,例如表空间、段、数据块等概念,对这些基础概念的深入理解对于数据迁移和性能优化至关重要。 4. Oracle的数据备份和恢复技术,因为数据迁移往往需要确保数据的安全性和完整性,...

Global site tag (gtag.js) - Google Analytics