`
shift8
  • 浏览: 150473 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

提高效率篇二

阅读更多

索引是表的一个概念部分,用来提高检索数据的效率,Oracle使用了一个复杂的自平衡B-tree结构。通常,通过索引查询数据比全表扫描要快。当 Oracle找出执行查询和Update语句的最好路径时, Oracle优化器将使用索引。同样在联结多个表时使用索引也能够提高效率。另一个使用索引的好处是,他提供了主键(primary key)的唯一性验证。那些LONG或LONG RAW数据类型, 您能够索引几乎任何的列。通常, 在大型表中使用索引特别有效. 当然,您也会发现, 在扫描小表时,使用索引同样能提高效率。虽然使用索引能得到查询效率的提高,但是我们也必须注意到他的代价。索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时, 索引本身也会被修改。这意味着每条记录的INSERT,DELETE , UPDATE将为此多付出4、 5次的磁盘I/O 。因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢。定期的重构索引是有必要的:

ALTER INDEX <INDEXNAME> REBUILD <TABLESPACENAME>

(18)用EXISTS替换DISTINCT:

当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT。一般能够考虑用EXIST替换, EXISTS 使查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立即返回结果。例子:

(低效): 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 ‘X' FROM EMP E WHERE E.DEPT_NO = D.DEPT_NO);

(19)SQL语句用大写的;因为Oracle总是先解析SQL语句,把小写的字母转换成大写的再执行。

(20)在Java代码中尽量少用连接符“+”连接字符串。

(21)避免在索引列上使用NOT通常,我们要避免在索引列上使用NOT, NOT会产生在和在索引列上使用函数相同的影响。当Oracle“碰到”NOT,他就会停止使用索引转而执行全表扫描。

(22)避免在索引列上使用计算。WHERE子句中,假如索引列是函数的一部分。优化器将不使用索引而使用全表扫描。

举例:

低效: SELECT … FROM DEPT WHERE SAL * 12 > 25000; 高效: SELECT … FROM DEPT WHERE SAL > 25000/12;

(23)用>=替代>:

高效:SELECT * FROM EMP WHERE DEPTNO >=4 低效: SELECT * FROM EMP WHERE DEPTNO >3

两者的区别在于,前者DBMS将直接跳到第一个DEPT等于4的记录而后者将首先定位到DEPTNO=3的记录并且向前扫描到第一个DEPT大于3的记录。

(24)用UNION替换OR (适用于索引列):

通常情况下,用UNION替换WHERE子句中的OR将会起到较好的效果。对索引列使用OR将造成全表扫描。注意,以上规则只针对多个索引列有效。 假如有column没有被索引,查询效率可能会因为您没有选择OR而降低。在下面的例子中,LOC_ID 和REGION上都建有索引。

高效:SELECT LOC_ID 。 LOC_DESC ,REGION FROM LOCATION WHERE LOC_ID = 10 UNION SELECT LOC_ID ,LOC_DESC ,REGION FROM LOCATION WHERE REGION = “MELBOURNE”

低效: SELECT LOC_ID ,LOC_DESC ,REGION FROM LOCATION WHERE LOC_ID = 10 OR REGION = “MELBOURNE”

(25)用IN来替换OR:

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

低效:

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

高效:

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

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

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

低效: (索引失效)

SELECT … FROM DEPARTMENT WHERE DEPT_CODE IS NOT NULL;

高效:(索引有效)

SELECT … FROM DEPARTMENT WHERE DEPT_CODE >=0;

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

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

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

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

低效: SELECT ACCT_NUM, BALANCE_AMT FROM DEBIT_TRANSACTIONS WHERE TRAN_DATE = '31-DEC-95' UNION SELECT ACCT_NUM, BALANCE_AMT FROM DEBIT_TRANSACTIONS WHERE TRAN_DATE = '31-DEC-95' 高效: SELECT ACCT_NUM, BALANCE_AMT FROM DEBIT_TRANSACTIONS WHERE TRAN_DATE = '31-DEC-95' UNION ALL SELECT ACCT_NUM, BALANCE_AMT FROM DEBIT_TRANSACTIONS WHERE TRAN_DATE = '31-DEC-95'

分享到:
评论

相关推荐

    提高写代码得效率(编程篇)

    提高写代码的效率(编程篇) 在编程领域中,提高写代码的效率是每个程序员必须面对的挑战。本文将总结如何提高代码的书写效率和练习方法。通过分析常见的编程错误和解决方法,我们可以总结出两大关键点:养成好的...

    CAD绘图技巧之提高效率篇.pdf

    在《CAD绘图技巧之提高效率篇.pdf》这一文件中,主要讨论了如何通过不同的技术手段和操作技巧,在使用CAD绘图软件时提高绘图效率。文件指出,随着计算机和网络技术的迅速发展,CAD软件在工程绘图领域的应用日益广泛...

    《如何从管理层面提升业绩-组织优化与运营效率篇》-.pptx

    【组织优化与运营效率提升】 组织优化是企业管理中至关重要的一环,它关乎着企业的业绩提升和长期发展。...通过这样的优化,企业能够更好地调动员工的积极性,提高运营效率,从而实现业绩的显著提升。

    提高编程的效率的方法

    2. **模块化和分层设计**:将复杂的问题分解为小的、可管理的部分是提高编程效率的一个重要策略。模块化可以让你专注于一个特定功能,而不是整个项目,这样可以减少错误并易于维护。同时,采用分层设计(如MVC模式)...

    信息学奥赛一本通提高篇 第1部分 基础算法(提高篇) 数据点

    《信息学奥赛一本通提高篇》是针对信息学竞赛的高级教程,主要聚焦于基础算法的提升。在第1部分“基础算法(提高篇)”中,作者深入探讨了数据结构与算法的基础知识,旨在帮助参赛者提升解决复杂问题的能力。这部分...

    富士通C手册(基础篇,提高篇,精华篇)

    富士通C手册是一系列详尽的编程指南,旨在帮助开发者深入理解和熟练运用富士通架构下的C语言。这份手册分为三个部分:基础篇、提高...无论是初学者还是专业人士,都应该认真研读,以提升自己的编程能力和项目实施效率。

    《如何从管理层面提升业绩组织优化与运营效率篇》.pptx

    《如何从管理层面提升业绩组织优化与运营效率篇》的讨论主要集中在如何通过管理策略和组织架构的调整来提高企业的业绩和运营效率。以下是对这个主题的详细阐述: 首先,营销组织优化是提升企业竞争力的关键。优化的...

    1理念与思维(效率篇xy).pptx

    《1理念与思维(效率篇xy).pptx》这份财务管理类PPT文档,深入探讨了企业管理的核心理念,以及如何通过工业化的思维模式提高企业的运营效率,进而实现成本控制和利润最大化。 企业管理理念的重塑始于对基本经济模型...

    地下车库优化停车效率专篇PPT教案.pptx

    《地下车库优化停车效率》专篇讲解了如何提高地下车库的空间利用率,主要涉及停车场的设计、柱网布局、停车方式以及交通流线等多个方面。以下是基于PPT教案的主要知识点: 1. 地库停车效率定义:地库停车效率是指...

    C#WinForm利用GDI+的双缓冲技术来提高绘图效率.pdf

    这篇文章将介绍如何使用 GDI+ 的双缓冲技术来提高绘图效率。 GDI+ 的双缓冲技术可以简单地理解为将绘图操作缓存在内存中,然后将其快速地绘制到屏幕上,从而提高绘图效率。这种技术可以减少屏幕刷新的次数,并且...

    《一本通.提高篇》教学课件ppt.rar

    提高篇》教学课件集合了多个IT领域的重要知识点,主要涵盖了基础算法、字符串算法、数据结构、图论、动态规划以及数论这六个核心部分。这些主题是计算机科学与信息技术学习中的基石,对于提升编程能力、解决复杂问题...

    信捷触摸屏用户手册提高篇之高级功能.rar

    《信捷触摸屏用户手册提高篇之高级功能》是一份专...总之,《信捷触摸屏用户手册提高篇之高级功能》是提升用户技术水平的重要资料,通过深入学习,用户不仅可以提升个人技能,也能助力企业的自动化升级和生产效率提升。

    2018学年九年级物理上册11.5机械效率同步测试提高篇新版苏科版

    这个测试旨在提高学生对机械效率的理解和应用能力。 【部分内容】涉及的知识点包括: 1. **机械效率的定义**:机械效率是指有用功与总功的比值,通常以百分比表示。 2. **额外功**:在使用机械时,除了做有用功外...

    dsp课件,基础篇+提高篇

    在提高篇中,课程会深入到更高级的主题,如快速傅里叶变换(FFT)及其算法优化,它极大地提高了频谱分析的效率。此外,还会涉及数字信号处理中的高级话题,如多率信号处理、数字下变频(DDC)、自适应滤波器以及现代...

    GDI绘图性能与效率的提高及改善

    本篇文章将深入探讨如何提高GDI绘图的性能和效率,并涉及到DirectDraw的相关技术。 首先,"基于MFC的DirectDraw高速图形绘制方法与应用.pdf"这篇文章可能会讨论如何利用Microsoft Foundation Class (MFC)库来整合...

    地下车库优化停车效率专篇PPT学习教案.pptx

    《地下车库优化停车效率专篇》的PPT学习教案详细探讨了如何提升地下车库的停车效率,这在现代城市规划和建筑设计中具有重要意义。停车效率指的是地下车库单位车位占用的面积,通过计算车库总面积除以总车辆数来得出...

    高中政治二轮复习全攻略第二篇时政热点解读专题转变职能服务民生权力规范效率提升课件.ppt

    高中政治二轮复习全攻略第二篇时政热点解读专题转变职能服务民生权力规范效率提升课件.ppt

    提高写代码得效率(编程篇).pdf

    在编程领域,提高代码编写效率是每位开发者关注的重点。以下是一些关键的知识点和实践策略,旨在帮助提升编程效率: 首先,扎实的语法基础是关键。在初入软件行业时,由于对编程语言不熟悉,可能会频繁遇到语法错误...

    绝了!Excel可以这样用:职场Excel效率提升秘笈【PDF】

    本书全面、系统地讲解了Excel在日常工作中的应用,结构独具匠心,以应知应会的知识点为主线,以实际案例和应用技巧为主题,有助于职场人士解决实际工作中的问题,提高工作效率,培养Excel应用能力。本书附带1张光盘...

Global site tag (gtag.js) - Google Analytics