ORACLE多表查询优化

2023-05-16

 转自某地,对作者很愧疚- -!不晓得地址了..

 

ORACLE 多表查询优化

这里提供的是执行性能的优化,而不是后台数据库优化器资料:

参考数据库开发性能方面的各种问题,收集了一些优化方案统计如下(当然,象索引等优化方案太过简单就不列入了,嘿嘿):

执行路径:ORACLE的这个功能大大地提高了SQL的执行性能并节省了内存的使用:我们发现,单表数据的统计比多表统计的速度完是两个概念.单表统计可能只要0.02秒,但是2张表联合统计就可能要几十表了.这是因为ORACLE只对简单的表提供高速缓冲(cache buffering) ,这个功能并不适用于多表连接查询..数据库管理员必须在init.ora中为这个区域设置合适的参数,当这个内存区域越大,就可以保留更多的语句,当然被共享的可能性也就越大了.

当你向ORACLE提交一个SQL语句,ORACLE会首先在这块内存中查找相同的语句.
这里需要注明的是,ORACLE对两者采取的是一种严格匹配,要达成共享,SQL语句必须
相同(包括空格,换行等).
      共享的语句必须满足三个条件:
A.       字符级的比较:
当前被执行的语句和共享池中的语句必须完相同.
       例如:
           SELECT * FROM EMP;
       和下列每一个都不同
           SELECT * from EMP;
           Select * From Emp;
           SELECT       *      FROM EMP;

B.       两个语句所指的对象必须完相同:

   用户对象名                       如何访问
Jack   sal_limit                      private synonym
Work_city                           public synonym
Plant_detail                         public synonym
Jill sal_limit                         private synonym
Work_city                           public synonym
Plant_detail                        table owner
      考虑一下下列SQL语句能否在这两个用户之间共享.
SQL 能否共享 原因
select max(sal_cap) from sal_limit; 不能 每个用户都有一个private synonym - sal_limit , 它们是不同的对象
select count(*) from work_city where sdesc like 'NEW%'; 能 两个用户访问相同的对象public synonym - work_city
select a.sdesc,b.location from work_city a , plant_detail b where a.city_id = b.city_id 不能 用户jack 通过private synonym访问plant_detail 而jill 是表的所有者,对象不同.

C.       两个SQL语句中必须使用相同的名字的绑定变量(bind variables)
例如:第一组的两个SQL语句是相同的(可以共享),而第二组中的两个语句是不同的(即使在运行时,赋于不同的绑定变量相同的值)
a.
select pin , name from people where pin = :blk1.pin;
select pin , name from people where pin = :blk1.pin;
b.
select pin , name from people where pin = :blk1.ot_ind;
select pin , name from people where pin = :blk1.ov_ind;
重点关注1:选择最有效率的表名顺序(只在基于规则的优化器中有效)重点关注
ORACLE
的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table)将被最先处理. 在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.当ORACLE处理多个表时, 会运用排序及合并的方式连接它们.首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行派序,然后扫描第二个表(FROM子句中最后第二个表),最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并.
例如:       表 TAB1 16,384 条记录
          表 TAB2 1       条记录
      选择TAB2作为基础表 (最好的方法)
      select count(*) from tab1,tab2    执行时间0.96秒
      选择TAB2作为基础表 (不佳的方法)
select count(*) from tab2,tab1    执行时间26.09秒
如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表.
例如:    EMP表描述了LOCATION表和CATEGORY表的交集.
SELECT *
FROM LOCATION L ,
       CATEGORY C,
       EMP E
WHERE E.EMP_NO BETWEEN 1000 AND 2000
AND E.CAT_NO = C.CAT_NO
AND E.LOCN = L.LOCN
将比下列SQL更有效率
SELECT *
FROM EMP E ,
LOCATION L ,
       CATEGORY C
WHERE   E.CAT_NO = C.CAT_NO
AND E.LOCN = L.LOCN
AND E.EMP_NO BETWEEN 1000 AND 2000
重点关注2: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’;

重点关注3:SELECT子句中避免使用 ‘ * ‘ .重点关注

当你想在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用 ‘*’ 是一个方便的方法.不幸的是,这是一个非常低效的方法. 实际上,ORACLE在解析的过程中, 会将’*’ 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间.
7.      减少访问数据库的次数
当执行每条SQL语句时, ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等等. 由此可见, 减少访问数据库的次数 , 就能实际上减少ORACLE的工作量.
例如,
     以下有三种方法可以检索出雇员号等于0342或0291的职员.
方法1 (最低效)
     SELECT EMP_NAME , SALARY , GRADE
     FROM EMP
     WHERE EMP_NO = 342;
      SELECT EMP_NAME , SALARY , GRADE
     FROM EMP
     WHERE EMP_NO = 291;
方法2 (次低效)
        DECLARE
         CURSOR C1 (E_NO NUMBER) IS
         SELECT EMP_NAME,SALARY,GRADE
FROM EMP
         WHERE EMP_NO = E_NO;
     BEGIN
         OPEN C1(342);
         FETCH C1 INTO …,..,.. ;
                 OPEN C1(291);
        FETCH C1 INTO …,..,.. ;
          CLOSE C1;
       END;
方法3 (高效)
     SELECT A.EMP_NAME , A.SALARY , A.GRADE,
             B.EMP_NAME , B.SALARY , B.GRADE
     FROM EMP A,EMP B
     WHERE A.EMP_NO = 342
     AND    B.EMP_NO = 291;
注意:
在SQL*Plus , SQL*Forms和Pro*C中重新设置ARRAYSIZE参数, 可以增加每次数据库访问的检索数据量 ,建议值为200.

重点关注4:使用DECODE函数来减少处理时间.重点关注
使用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: 删除重复记录.重点关注

最高效的删除重复记录方法 ( 因为使用了ROWID)
DELETE FROM EMP E
WHERE E.ROWID >; (SELECT MIN(X.ROWID)
                    FROM EMP X
                    WHERE X.EMP_NO = E.EMP_NO);

重点关注6: 用TRUNCATE替代DELETE.重点关注

当删除表中的记录时,在通常情况下, 回滚段(rollback segments ) 用来存放可以被恢复的信息. 如果你没有COMMIT事务,ORACLE会将数据恢复到删除之前的状态(准确地说是恢复到执行删除命令之前的状况)
而当运用TRUNCATE时, 回滚段不再存放任何可被恢复的信息.当命令运行后,数据不能被恢复.因此很少的资源被调用,执行时间也会很短.
(译者按: TRUNCATE只在删除表适用,TRUNCATE是DDL不是DML)

重点关注7: 尽量多使用COMMIT.重点关注

只要有可能,在程序中尽量多使用COMMIT, 这样程序的性能得到提高,需求也会因为COMMIT所释放的资源而减少:
COMMIT所释放的资源:
a.        回滚段上用于恢复数据的信息.
b.        被程序语句获得的锁
c.        redo log buffer 中的空间
d.       ORACLE为管理上述3种资源中的内部花费
(译者按: 在使用COMMIT时必须要注意到事务的完整性,现实中效率和事务完整性往往是鱼和熊掌不可得兼)
重点关注8:减少对表的查询.重点关注

在含有子查询的SQL语句中,要特别注意减少对表的查询.

例如:
      低效
           SELECT TAB_NAME
           FROM TABLES
           WHERE TAB_NAME = ( SELECT TAB_NAME
                                 FROM TAB_COLUMNS
                                 WHERE VERSION = 604)
           AND DB_VER= ( SELECT DB_VER
                            FROM TAB_COLUMNS
                            WHERE VERSION = 604)
      高效
           SELECT TAB_NAME
           FROM TABLES
           WHERE   (TAB_NAME,DB_VER)
= ( SELECT TAB_NAME,DB_VER)
                    FROM TAB_COLUMNS
                    WHERE VERSION = 604)
      Update 多个Column 例子:
      低效:
            UPDATE EMP
            SET EMP_CAT = (SELECT MAX(CATEGORY) FROM EMP_CATEGORIES),
               SAL_RANGE = (SELECT MAX(SAL_RANGE) FROM EMP_CATEGORIES)
            WHERE EMP_DEPT = 0020;
      高效:
            UPDATE EMP
            SET (EMP_CAT, SAL_RANGE)
= (SELECT MAX(CATEGORY) , MAX(SAL_RANGE)
FROM EMP_CATEGORIES)
            WHERE EMP_DEPT = 0020;

重点关注9:用EXISTS替代IN.重点关注

在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率.
低效:
SELECT *
FROM EMP (基础表)
WHERE EMPNO >; 0
AND DEPTNO IN (SELECT DEPTNO
FROM DEPT
WHERE LOC = ‘MELB’)
     高效:
SELECT *
FROM EMP (基础表)
WHERE EMPNO >; 0
AND EXISTS (SELECT ‘X’
FROM DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
AND LOC = ‘MELB’)
(译者按: 相对来说,用NOT EXISTS替换NOT IN 将更显著地提高效率,下一节中将指出)

重点关注10:用NOT EXISTS替代NOT IN .重点关注

在子查询中,NOT IN子句将执行一个内部的排序和合并. 无论在哪种情况下,NOT IN都是最低效的 (因为它对子查询中的表执行了一个表遍历).   为了避免使用NOT IN ,我们可以把它改写成外连接(Outer Joins)或NOT EXISTS.
例如:
SELECT …
FROM EMP
WHERE DEPT_NO NOT IN (SELECT DEPT_NO
                          FROM DEPT
                          WHERE DEPT_CAT=’A’);
为了提高效率.改写为:
(方法一: 高效)
SELECT ….
FROM EMP A,DEPT B
WHERE A.DEPT_NO = B.DEPT(+)
AND B.DEPT_NO IS NULL
AND B.DEPT_CAT(+) = ‘A’
(方法二: 最高效)
SELECT ….
FROM EMP E
WHERE NOT EXISTS (SELECT ‘X’
                     FROM DEPT D
                     WHERE D.DEPT_NO = E.DEPT_NO
                     AND DEPT_CAT = ‘A’);

当然,最高效率的方法是有表关联.直接两表关系对联的速度是最快的!
重点关注11:识别’低效执行’的SQL语句.重点关注

用下列SQL工具找出低效SQL:
SELECT EXECUTIONS , DISK_READS, BUFFER_GETS,
         ROUND((BUFFER_GETS-DISK_READS)/BUFFER_GETS,2) Hit_radio,
         ROUND(DISK_READS/EXECUTIONS,2) Reads_per_run,
         SQL_TEXT
FROM    V$SQLAREA
WHERE   EXECUTIONS>;0
AND      BUFFER_GETS >; 0
AND (BUFFER_GETS-DISK_READS)/BUFFER_GETS < 0.8
ORDER BY 4 DESC;
      (译者按: 虽然目前各种关于SQL优化的图形化工具层出不穷,但是写出自己的SQL工具来解决问题始终是一个最好的方法)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ORACLE多表查询优化 的相关文章

  • Web服务器CGI的配置

    Web服务器CGI的配置 CGI程序运行在Web服务器端 xff0c Web服务器可以是Apache Nginx等 GGI程序可以是Python Ruby Perl Shell C C 43 43 等 配置 apache默认加载cgi模块
  • 解决mac安装homebrew后报错-bash: brew: command not found

    参照官网上很简单的一句安装命令 xff0c usr bin ruby e 34 curl fsSL https raw githubusercontent com Homebrew install master install 34 安装完
  • 转行的辛苦

    我是2004年毕业的 xff0c 学的专业是市场营销 xff0c 毕业后来到深圳 xff0c 换了很多工作 xff0c 一直都无法找到令自己满意的工作 因为我非常喜欢计算机 xff0c 从中学到大学 xff0c 一直是班级里公认的计算机高手
  • 物联网之轻量级TCP/IP协议栈——Lwip

    简介 Lwip为轻量级的Tcp IP协议栈 xff0c 对于嵌入式设备资源比较友好 xff0c 占用RAM低 xff0c 基本上物联网wifi芯片都会集成此协议栈到SDK中 xff0c 其位于OSI的网路层往上 熟悉socket编程的能够很
  • github下载慢或报错“The-remote-end-hung-up-unexpectedly”解决办法

    github下载慢或报错 The remote end hung up unexpectedly 解决办法 xff1a 该问题往往因为内部网络限制等因素导致 因细节更新 xff0c 欢迎访问本文源站链接 xff1a https turboc
  • git 如何把单个文件回退到某一版本

    git 如何把单个文件回退到某一版本 概要四条命令git restoregit resetgit checkoutgit cherry pick 概要 应用场景 xff1a 在进行一次完整的提交后 xff0c 你可能有有这样的需求 xff1
  • Docker

    学习笔记 一 Docker概述 1 基本介绍 Docker是一个开源的应用容器引擎 xff0c 基于Go语言 xff0c 并遵从apache2 0协议开源 docker可以让开发者打包他们的应用以及依赖包到一个轻量级 可移植的容器中 xff
  • roslaunch 时出现resource 找不到的问题

    Resource not found roslaunch ROS path 0 61 opt ros noetic share ros ROS path 1 61 opt ros noetic share The traceback for
  • Linux多线程编程

    在传统的 UNIX 模型中 xff0c 当一个进程需要另一个实体来完成某事 xff0c 它就 fork 一个子进程并让子进程去处理 但是 fork 的调用有如下缺点 xff1a xff08 1 xff09 fork 的 代价是 昂贵的 fo
  • 控制工程实践(13)——滤波器的实现(之二)

    2 中值滤波算法 中值滤波算法 xff0c 通俗讲 xff0c 就是取一组数据的中间大小的值 运算过程 xff1a 对某一参数连续采样N次 xff0c 为方便选取 xff0c N设为奇数 xff1b 把N个采样值从小到大排序 xff1b 取
  • 控制工程实践(14)——滤波器的实现(之三)

    4 加权平均滤波算法 算术平均滤波算法 有平滑度和灵敏度的取舍矛盾 xff1a 取样信号个数小时 xff0c 灵敏度高 xff0c 但平滑度低 xff1b 取样信号个数大时 xff0c 平滑度高 xff0c 但灵敏度低 为了协调二者矛盾 x
  • 信号与系统 基础知识点整理 03(文末可下载PDF格式)

    接着前面的继续 xff1a 信号与系统 passage three Written 8 March 2022 Edited by Wang Ximing 一 xff08 信号的分解 xff09 xff08 1 xff09 直流分量与交流分量
  • mac系统如何生成SSH key与GitHub通信

    一 检查 SSH key 是否存在 在终端输入 xff1a ls al ssh 如果没有 xff0c 终端显示如下 xff1a No such file or directory 如果已经存在 xff0c 则会显示 id rsa 和 id
  • ROS-Industrial 硬件支持

    ROS Industrial硬件支持 ROS Industrial程序的目标是为许多不同种类的工业设备提供ROS接口 xff0c 包括PLC xff0c 机器人控制器 xff0c Servos xff0c 人机界面 工业机器人 下表总结了各
  • ROS依赖包查找安装

    当下载某个功能包到自己的空间 xff0c 在编译时 xff0c 出现依赖项有问题 xff0c 解决如下 xff1a roscd package name rosdep update rosdep package name rosdep即可安
  • 在Windows上使用ROS软件包

    1 二进制安装 如果有ROS软件包的二进制发行版 xff0c 可以使用Chocolatey安装 choco install ros melodic lt package name gt ROS软件包查询 https index ros or
  • EKF扩展卡尔曼滤波器 - CTRV运动模型 及其代码实现

    本文参考了Adam大佬的帖子 https blog csdn net AdamShan article details 78265754 原贴的公式有一点点错误 xff0c 这里已经修正了 xff0c 并给出了代码实现 CTRV模型 我们通
  • 安卓SDK和API是什么意思?

    安卓SDK和API是什么意思 xff1f 一 SDK SDK就是kit xff0c 通俗讲就是工具箱 一系列的工具组合在一起 xff0c 能实现补全代码 自动错误检查之类的功能 xff0c 比如点一下run xff0c 会调用编译器来自动编
  • 3D视觉(五):对极几何和三角测量

    3D视觉 五 xff1a 对极几何和三角测量 对极几何 xff08 Epipolar Geometry xff09 描述的是两幅视图之间的内在射影关系 xff0c 与外部场景无关 xff0c 只依赖于摄像机内参数和这两幅试图之间的的相对姿态
  • 关于产品的一些思考——写在前面的话

    自己是一个十足的Geek xff0c 喜欢使用各种新奇的东西 xff0c 包括软件 硬件 技术 xff0c 又因为自己一点点轻微的强迫症和完美主义 xff0c 在这个过程中总会有自己的一些思考 xff0c 又因为技术出身 xff0c 总会考

随机推荐

  • mybatis映射文件mapper.xml的写法。

    在学习mybatis的时候我们通常会在映射文件这样写 xff1a lt xml version 61 34 1 0 34 encoding 61 34 UTF 8 34 gt lt DOCTYPE mapper PUBLIC 34 myba
  • layer的弹出层的简单的例子

    如果不了级的基本的清楚官网查看api网址为 http layer layui com 我用的是iframe 如果是iframe层 layer open type 2 content 39 http sentsin com 39 这里cont
  • 左链接Column 'id' in field list is ambiguous

    如题错误如左链接Column 39 id 39 in field list is ambiguous 今天在写sm的时候 xff0c 用到两个表的联合查询出现的如下的错误 xff0c 仔细查找才发现原来两个表的id重复了 xff0c use
  • 我所理解的人工智能

    很多人容易把人工智能理解为机器人 机器人是人工智能的一个实际体现 人工智能应用很广泛 下面我来谈谈我的理解 人工智能可分开理解为 人工 和 智能 xff0c 即人类创造出来的智能 xff0c 从广义上来讲只要人类创造出来 xff0c 能为人
  • maven出现:Failed to execute goal on project ...: Could not resolve dependencies for project ...

    1 我的项目结构是一个父项目 xff0c 多个子项目目录如下 xff1a 2 我这里就举个例子 xff0c 所以应用的也就是core和domain这两个项目 3 两个项目都继承父项目 4 在模块中domain依赖于core xff0c 在c
  • 有关Shiro中Principal的使用

    1 定义 principal代表什么那 xff1f 如果阅读官方文档或者源码你会得到如下的定义 xff1a 解释 xff1a 1 xff09 可以是uuid 2 xff09 数据库中的主键 3 xff09 LDAP UUID或静态DN 4
  • 关于shiro的 subject.getPrincipal()方法

    1 说明 上一篇文章说明了 principal xff0c 而subject getPrincipal 是用来干嘛的 xff0c 他就是来获取你存储的principal xff0c 内部是怎么获取的那 xff0c 多个principal怎么
  • CentOS7 64位安装solr7.2.0

    声明 xff1a 本人为学习solr的新手 xff0c 如编写过程中有部队的地方还请各位大佬指正 本文为原创 xff0c 如要转载请注明出处 你能学到 xff1a 1 linux上solr的安装部署 xff0c 官方给出的运行方式 2 添加
  • 阿里巴巴20121009 研发/算法工程师 笔试试题【修正】

    第19题 a i 在排序后的位置是 i k i 43 k xff0c a i 43 2k 在排序后的位置是 i 43 k i 43 3k xff0c 必然有a i lt 61 a i 43 2k 所以数组a里实际上有2k个各自有序的 交错的
  • printf() % lf出错

    printf 函数中不存在 lf xff0c 输入 double 用 lf 输出用 f
  • 奔腾系列的CPU 和酷睿系列的CPU

    以后奔腾要沦为中下层产品 奔腾D是接替奔腾4的型号 也是INTEL的第一代双核处理器 技术还比较粗糙 发热量控制的也不够好 至于酷睿系列 这可是INTEL的最新力作 性能上有绝对的优势 技术上也对老对手AMD保持了领先 而且功耗控制的也非常
  • 为什么神经网络被称为黑匣子

    数学层面 xff1a 由于网络参数与近似的数学函数之间缺乏明确的连接 xff0c 人工神经网络通常被称为 黑匣子
  • 第八弹 ROS发布者Publisher的编程实现

    1 话题模型 xff08 发布与订阅 xff09 2 创建功能包 catkin create pkg learning topic roscpp rospy std msgs geometry msgs turtlesim 建立一个名为le
  • TRIZ创新思维方法_简要复习

    一 TRIZ介绍 TRIZ理论成功地揭示了创造发明的内在规律和原理 xff0c 着力于澄清和强调系统中存在的矛盾 xff0c 其目标是完全解决矛盾 xff0c 获得最终的理想解 它不是采取折中或者妥协的做法 xff0c 而且它是基于技术的发
  • Generalized Focal Loss: Learning Qualified and Distributed BBoxes for Dense Object Detection论文翻译阅读

    Generalized Focal Loss Learning Qualified and Distributed Bounding Boxes for Dense Object Detection论文翻译阅读 论文下载地址 xff1a 点
  • ubuntu16.04对SD卡进行分区

    赶在2020年上半年的最后一天 xff0c 匆忙地写上一个博客 这篇博客是对自己的一个反思 xff0c 我的博客属于自己完全开辟的内容几很少 xff0c 有些博客大家随便在网上一搜就能找到 说实话 xff0c 有时候我会怀疑自己的智商有问题
  • RT-thread移植指南-RISC-V

    目录 RT thread移植指南 RISC V 1 概述 1 1 移植资料参考 1 2 移植开发环境准备 2 移植步骤 2 1 全局中断开关函数 2 2 线程上下文切换函数 2 3 线程栈的初始化 2 4 时钟节拍的配置 2 5 中断函数
  • 寒假学习心得--从0开始学破解

    寒假学习心得 从0开始学破解 写给和我一样将要接触或者才接触破解 的朋友们 前提 你必须得真正喜欢 她 一 工欲善其事 必先利其器 1 找一个中文版的OD PEID 记得就OD就有咱PYG版的某牛人强化版的等等等等 找一个合适的工具 干起事
  • 常用的“密码重置”代码

    61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
  • ORACLE多表查询优化

    转自某地 对作者很愧疚 不晓得地址了 ORACLE 多表查询优化 这里提供的是执行性能的优化 而不是后台数据库优化器资料 参考数据库开发性能方面的各种问题 收集了一些优化方案统计如下 当然 象索引等优化方案太过简单就不列入了 嘿嘿 执行路径