`
liudaoru
  • 浏览: 1579021 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

SQL与效率[z]

阅读更多
From: http://user.qzone.qq.com/67622728/blog/1198426480

            ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table)将被最先处理. 在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.当ORACLE处理多个表时, 会运用排序及合并的方式连接它们.首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行派序,然后扫描第二个表(FROM子句中最后第二个表),最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并.
例如: A表2万条记录,B表1条记录
           选择B作为基础表 (最好的方法)
           select count(*) from a ,b执行时间0.96秒
           选择TAB2作为基础表 (不佳的方法)
           select count(*) from b,a 执行时间26.09秒

         SELECT子句中避免使用 ‘ * ‘
         当你想在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用 ‘*’ 是一个方便的方法.不幸的是,这是一个非常低效的方法. 实际上,ORACLE在解析的过程中, 会将’*’ 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间.

         <> 操作符(不等于)
         不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。
         推荐方案:用其它相同功能的操作运算代替,如
         a<>0 改为 a>0 or a<0
         a<>’’ 改为 a>’’

         WHERE子句中的连接顺序.
         ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾.
例如:(低效,执行时间156.3秒)
        select * from emp e  where  sal > 50000  and  job = ‘manager’  
        and  25 < (select count(*) from emp  where mgr=e.empno);
        (高效,执行时间10.6秒)
        select * from emp e  where 25 < (select count(*) from emp where mgr=e.empno)
        and    sal > 50000  and job = ‘manager’;

        LIKE操作符
        LIKE操作符可以应用通配符查询,里面的通配符组合可能达到几乎是任意的查询,但是如果用得不好则会产生性能上的问题,如LIKE ‘%5400%’ 这种查询不会引用索引,而LIKE ‘X5400%’则会引用范围索引。一个实际例子:用YW_YHJBQK表中营业编号后面的户标识号可来查询营业编号 YY_BH LIKE ‘%5400%’ 这个条件会产生全表扫描,如果改成YY_BH LIKE ’X5400%’ OR YY_BH LIKE ’B5400%’ 则会利用YY_BH的索引进行两个范围的查询,性能肯定大大提高。

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

     减少对表的查询,在含有子查询的SQL语句中,要特别注意减少对表的查询.
      
     尽量多使用表的别名(Alias),当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column上.这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误.

     IN 操作符
    用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格。
    但是用IN的SQL性能总是比较低的,从ORACLE执行的步骤来分析用IN的SQL与不用IN的SQL有以下区别:
    ORACLE试图将其转换成多个表的连接,如果转换不成功则先执行IN里面的子查询,再查询外层的表记录,如果转换成功则直接采用多个表的连接方式查询。由此可见用IN的SQL至少多了一个转换的过程。一般的SQL都可以转换成功,但对于含有分组统计等方面的SQL就不能转换了。
    推荐方案:在业务密集的SQL当中尽量不采用IN操作符。
    NOT IN操作符
    此操作是强列推荐不使用的,因为它不能应用表的索引。
    推荐方案:用NOT EXISTS 或(外连接+判断为空)方案代替。
分享到:
评论
1 楼 mapengjie 2010-04-01  
谢谢,我看了之后学到了一些知识

相关推荐

    SQLPrompt9.5.7z

    SQLPrompt9.5.7z 是一个压缩包文件,其中包含SQL Prompt 9.5版本的安装程序。SQL Prompt是一款强大的SQL代码辅助工具,尤其在SSMS(SQL Server Management Studio)18.4版本上已经经过验证,可以顺利运行。这款工具...

    SQL server.7z

    4. SQL Server 2014数据库修改与删除:数据库的修改通常涉及调整数据库结构,如添加、修改或删除表、索引、视图等。ALTER DATABASE语句用于修改数据库属性,如更改文件组、更改兼容级别等。而DROP DATABASE语句则...

    Sql Server数据库自动全备份的脚本(带7z压缩)

    本话题主要涉及如何使用脚本实现自动全备份,并结合7-Zip进行压缩,以节省存储空间和提高备份效率。以下将详细介绍相关知识点: 1. **SQL Server 自动备份**: SQL Server 提供了一种叫做维护计划的工具,可以设置...

    SQLPrompt_7.2.2.273中文翻译及配置.7z

    在这个“SQLPrompt_7.2.2.273中文翻译及配置.7z”压缩包中,包含了该软件的中文翻译以及作者的个人配置,这对于中文用户来说是一个非常宝贵的资源,因为它解决了语言障碍,使得国内用户能够更好地理解和使用SQL...

    省市区数据库表sql.7z

    "省市区数据库表sql.7z"这个压缩包提供了一套完整的解决方案,包括前端的省市区.js文件和后端的数据库SQL及插入语句,旨在实现前后端数据的一致性,提高协同效率。 首先,让我们关注后端的核心——省市区数据库SQL...

    sql.7zoracle常用维护sql

    "sql.7zoracle常用维护sql"这个压缩包文件很可能是包含了一系列用于Oracle数据库日常维护的SQL脚本。下面我们将深入探讨一些Oracle数据库维护中的关键SQL知识点。 1. **数据查询**:`SELECT`语句是SQL中最基本的...

    MyBatis 动态 SQL.7z

    - 动态 SQL 虽然方便,但也要注意性能问题,避免过于复杂的逻辑导致 SQL 执行效率降低。 - 使用 `&lt;if&gt;` 和 `&lt;foreach&gt;` 时,务必注意条件的正确性和避免 SQL 注入。 - 注意 MyBatis 的缓存机制可能受动态 SQL ...

    HeidiSQL_9_Portable.7z

    **HeidiSQL_9_Portable.7z** 是一个便携式版本的HeidiSQL工具,主要用于数据库管理和开发。HeidiSQL是一款广受欢迎的、轻量级的、免费的数据库管理软件,尤其适用于MySQL、MariaDB、SQL Server、PostgreSQL和SQLite...

    SQLPrompt10.1.5 SSMS18.6.7z

    总的来说,SQLPrompt10.1.5与SSMS18.6的组合为SQL Server开发者提供了强大的代码编写和数据库管理工具,提高了开发效率和代码质量。而解决证书问题的文本文件则为用户在遇到安装问题时提供了指导,确保软件的正常...

    Squeezing the Most Out of Dynamic SQL with DB2 for z/OS and OS/390

    在IT领域,尤其是在数据库管理与优化方面,"Squeezing the Most Out of Dynamic SQL with DB2 for z/OS and OS/390"这一标题指向了一项关键的专业技能——如何利用动态SQL最大限度地提高DB2 for z/OS和OS/390的性能...

    数据库管理工具+SqlDbx 6.16+中文+专业版.7z

    3. **数据浏览与编辑**:用户可以直接在SqlDbx中浏览和编辑数据库中的数据,进行增删改查操作,无需通过复杂的SQL命令。 4. **数据库对象管理**:允许用户创建、修改和删除数据库对象,如表、视图、存储过程、索引...

    DB2 for Z/OS Application Programming and SQL Guide

    通过本书的学习,读者将能够掌握DB2 for Z/OS的高级应用编程技巧,提高SQL查询效率,从而在实际工作中发挥更大的作用。 总之,《DB2 for Z/OS应用编程与SQL指南》是一本不可或缺的手册,无论你是想入门DB2 for Z/OS...

    sqlserver插件soft.7z

    标题中的"sqlserver插件soft.7z"指的是与Microsoft SQL Server相关的插件软件的压缩包,其中可能包含了用于增强SQL Server管理、开发或性能优化的工具。这种插件通常能够帮助用户更高效地编写SQL查询,提供智能提示...

    SQL Server中的SQL语句优化与效率问题

    很多人不知道SQL语句在SQL SERVER中是如何执行的,他们担心自己所写的SQL语句会被SQL SERVER误解。比如: select * from table1 where name=’zhangsan’ and tID &gt; 10000 和执行: select * from table1 where tID &gt;...

    Sql Tunning.7z

    "Sql Tunning.7z"中的"Sql Tunning.pdf"很可能是详细讲解SQL调优的资料,让我们一起来探讨这个主题。 1. **理解执行计划** - SQL执行计划是数据库执行查询的方式,通过分析执行计划,我们可以找出可能的性能瓶颈。...

    PL_SQL基础.7z

    这个名为“PL_SQL基础.7z”的压缩包显然是一个学习PL/SQL基础知识的资源,包含了一份名为“PL_SQL基础.pdf”的文档。 PL/SQL的基础知识涵盖了以下几个关键领域: 1. **语法结构**:PL/SQL由声明部分、执行部分和...

    批量执行SQL脚本工具-PowerShell.7z

    SQL Server作为Microsoft提供的一个强大、可靠的数据库管理系统,其高效的操作和管理是保证数据安全与稳定运行的基础。本主题将聚焦于如何使用PowerShell来批量执行SQL脚本,这对于数据库的自动化维护和更新非常有用...

    sqlexplorer_plugin-3.5.1_sr4.7z

    要将SQL Explorer插件集成到Eclipse Helios中,首先需下载"sqlexplorer_plugin-3.5.1_sr4.7z"压缩包,解压后得到"sqlexplorer_plugin-3.5.1_sr4"文件夹。接下来,打开Eclipse,进入“Help”菜单,选择“Install New ...

    SQL解析类库 SQLJEP.7z

    SQLJEP的目标是帮助Java开发者更方便地与SQL语句交互,提供了一种抽象层,可以避免直接处理复杂的SQL语法解析问题。 SQLJEP的核心功能包括: 1. **SQL解析**:SQLJEP能够将SQL字符串分解成抽象语法树(AST,...

    SQL Assistant v6.5.278

    在bc_sqlassist-z-hicode这个压缩包文件中,包含了SQL Assistant的安装或执行文件,用户只需按照指示进行安装,即可开始体验这款强大的SQL编程工具。无论是日常的数据库管理和维护,还是复杂的查询优化,SQL ...

Global site tag (gtag.js) - Google Analytics