博客
关于我
SQL优化34条
阅读量:389 次
发布时间:2019-03-04

本文共 2880 字,大约阅读时间需要 9 分钟。

ORACLE SQL 优化技巧指南

在数据库管理中,ORACLE SQL的性能优化至关重要。以下是一些实用的技巧,帮助您提升查询效率并减少资源消耗。

  • 表名顺序优化

    ORACLE解析器从右到左处理FROM子句中的表名。在多个表连接查询时,应选择记录条数最少的表作为基础表。如果有超过三个表的连接查询,则需要选择交叉表作为基础表,交叉表是被其他表引用的表。

  • WHERE子句处理顺序

    ORACLE自下而上解析WHERE子句。WHERE子句中的条件应按从上到下的顺序排列,能够过滤最大数量记录的条件应放在子句末尾,以减少不必要的计算。

  • 避免使用“*”

    ORACLE会将“*”逐个转换为所有列名,导致更多时间用于数据字典查询。建议直接指定所需列名以提高效率。

  • 减少数据库访问次数

    ORACLE内部执行多项任务,如解析SQL、估算索引利用率、绑定变量等。定期使用COMMIT命令可以释放资源,减少锁和回滚段的负担。

  • 重新设置ARRAYSIZE参数

    在SQLPlus、SQLForms和Pro*C中,建议将ARRAYSIZE参数设置为200,这样可以一次检索更多数据,提高访问效率。

  • 使用DECODE函数

    DECODE函数可以避免重复扫描相同记录或重复连接表,减少处理时间。

  • 整合简单的数据库访问

    将多个简单查询整合为一个查询,即使它们之间没有关联,也能减少总体资源消耗。

  • 删除重复记录

    使用ROWID的方法删除重复记录,例如:

  • DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID) FROM EMP X WHERE X.EMP_NO = E.EMP_NO);
    1. 使用TRUNCATE替代DELETE

      TRUNCATE命令可以避免回滚段存放可恢复信息,适用于删除表中全部记录。

    2. 尽量多使用COMMIT

      在程序中使用尽可能多的COMMIT,可以释放资源并减少锁的竞争。

    3. 用WHERE替代HAVING

      HAVING子句在查询结果后进行过滤,而WHERE子句可以在结果计算前过滤记录,提高效率。

    4. 减少对表的查询

      在含有子查询的SQL中,减少对表的查询次数。例如:

    5. SELECT TAB_NAME FROM TABLES WHERE (TAB_NAME, DB_VERSION) = (SELECT TAB_NAME, DB_VERSION FROM TAB_COLUMNS WHERE VERSION = 604);
      1. 使用内部函数提高效率

        复杂的SQL查询往往牺牲了执行效率,但掌握运用函数解决问题的方法在实际工作中非常有意义。

      2. 使用表别名

        在连接多个表时,使用表别名并在列名前加上别名,减少解析时间并减少歧义。

      3. 用EXISTS替代IN

        EXISTS和NOT EXISTS比IN更高效,因为它们不需要对子查询中的表执行全表遍历。

      4. 识别低效执行的SQL语句

        虽然有许多工具可用于SQL优化,但手动编写工具并监控执行情况也是有效的方法。以下是一个示例查询,用于监控执行情况:

      5. SELECT EXECUTIONS, DISK_READS, BUFFER_GETS, ROUND((BUFFER_GETS - DISK_READS)/BUFFER_GETS, 2) Hit_ratio,ROUND(DISK_READS/EXECUTIONS, 2) Reads_per_run,SQL_TEXTFROM V$SQLAREAWHERE EXECUTIONS > 0 AND BUFFER_GETS > 0AND (BUFFER_GETS - DISK_READS)/BUFFER_GETS < 0.8ORDER BY 4 DESC;
        1. 使用索引提高效率
          索引可以显著提高查询效率,但也需要注意索引的维护和管理。ORACLE使用自平衡B-tree结构,通常比全表扫描快。
        2. ALTER INDEX 
          REBUILD
          ;
          1. 用EXISTS替代DISTINCT
            在部门和雇员表的查询中,使用EXISTS替代DISTINCT可以提高效率。例如:
            低效
          2. 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 E.DEPT_NO FROM EMP E WHERE E.DEPT_NO = D.DEPT_NO);
            1. 使用大写字符

              ORACLE解析SQL语句时会将小写字母转换为大写,因此建议在编写SQL时使用大写字母。

            2. 避免在索引列上使用NOT

              在索引列上使用NOT会导致ORACLE停止使用索引,改用全表扫描。

            3. 避免在索引列上使用计算

              WHERE子句中如果索引列是函数的一部分,优化器将不使用索引。

            4. 用>=替代>

              例如:
              低效

            5. SELECT * FROM EMP WHERE DEPTNO > 3;

              高效

              SELECT * FROM EMP WHERE DEPTNO >= 4;
              1. 用UNION-ALL替代UNION
                UNION-ALL可以减少排序操作,提高效率。例如:
                低效
              2. 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';
                1. 用WHERE替代ORDER BY
                  在满足WHERE子句条件时,索引效率更高。例如:
                  低效
                2. SELECT DEPT_CODE FROM DEPT ORDER BY DEPT_TYPE;

                  高效

                  SELECT DEPT_CODE FROM DEPT WHERE DEPT_TYPE > 0;
                  1. 避免改变索引列的类型

                    确保索引列的类型不会发生改变,避免类型转换影响索引使用。

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

                    索引列中不能有空值,否则索引无法有效使用。

                  3. 总是使用索引的第一列

                    如果索引是多列索引,优化器会优先使用索引的第一列。

                  4. 通过遵循以上优化技巧,您可以显著提升ORACLE SQL的执行效率,减少资源消耗并提高用户满意度。

    转载地址:http://upje.baihongyu.com/

    你可能感兴趣的文章
    2025版最新C++快速入门(适合小白)零基础入门到精通,收藏这篇就够了
    查看>>
    2025版最新一文彻底搞懂大模型 - Agent(非常详细)零基础入门到精通,收藏这篇就够了
    查看>>
    2025版最新关于HW护网行动的一些知识,零基础入门到精通,收藏这篇就够了
    查看>>
    2025版最新大模型开发流程(非常详细)零基础入门到精通,收藏这一篇就够了
    查看>>
    2025版最新大模型微调方法(非常详细)零基础入门到精通,收藏这篇就够了
    查看>>
    2025版最新大语言模型的指令微调,零基础入门到精通,收藏这篇就够了
    查看>>
    2025版最新小白学习大模型:什么是大模型?零基础入门到精通,收藏这篇就够了
    查看>>
    2025版最新常用黑客工具之【Nmap 教程基础】零基础入门到精通,收藏这篇就够了
    查看>>
    2025版最新渗透测试和黑客工具列表,零基础入门到精通,收藏这一篇就够了
    查看>>
    2025版最新网络安全等级保护测评指南,零基础入门到精通,收藏这篇就够了
    查看>>
    2025版最新运维怎么转行网络安全?零基础入门到精通,收藏这篇就够了
    查看>>
    2025版最新黑客学习网站(非常详细),零基础入门到精通,看这一篇就够了
    查看>>
    23张图告诉你组建一个网络需要用到哪些硬件设备?路由器、交换机、防火墙是不是就够了?
    查看>>
    #12 btrfs文件系统
    查看>>
    CentOS 6.9 yum 和源码安装htop,适用于centOS 7
    查看>>
    CentOS 7 安装 postgreSQL 9.4
    查看>>
    CentOS 7 巨大变动之 systemd 取代 SysV的Init
    查看>>
    flask框架高校竞赛信息管理系统(毕设源码+论文)
    查看>>
    Flatterer: 快速JSON转换工具使用指南
    查看>>
    Flex 与 spring mvc 整合 BlazeDB
    查看>>