同标题:在进行多个表连接时,FROM中的表的顺序要按照记录数由多到少的顺序来排列,这么做的原因是什么呢?

解决方案 »

  1.   

    ORACLE一般的解析顺序是从右到左,从下到上
    所以当解析表的时候,遇到右边第一张表,就会把它做为基础表,然后其它表来和它比较
    所以右边的表的数据越大,基础表也越大,成本就高所以一般写SQL时把表数据小的写在右边,或者是把交叉表写在右边不过也不全然,当你用HINT 时,可以指定基础表的
      

  2.   

    ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,
    因此FROM子句中写在最后的表将被最先处理。 
    在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。当ORACLE处理多个表时, 会运用排序及合并的方式连接它们。
    首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行派序,然后扫描第二个表(FROM子句中最后第二个表),
    最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并。
      

  3.   

    再问二楼,Oracle是怎么来进行比较的?为什么基础表也越大,成本就高?
    如果两表都进行全表扫描的话,谁作为基础表不都一样吗?(这么理解对不?)
    另外,所说的数据小的作为基础表,不是指原始数据量吧?是经过选择之后的数据量吧?
    例如:A表中有1000条数据,B表中有10000条数据,A表中A2字段为'AA'的有200条数据,
    B表中B2字段为'BB'的数据有100条,那么以下的SQL应该采用方案1还是方案2呢?或者是别的方案?
    方案1:
    SELECT A.A1,A.A3
    FROM B,A
    WHERE A.A1=B.A1 AND B.B2='BB' AND A.A2='AA'方案2:
    SELECT A.A1,A.A3
    FROM A,B
    WHERE A.A1=B.A1 AND A.A2='AA' AND B.B2='BB' 谢谢回答,关于这方面的效率处理不知道应该从哪几方面考虑,理由都是什么,一般只实现功能就算完成了。
      

  4.   

    问一下3楼,我可以这么理解不?
    如果我写的SQL中没有Where及其他条件(当然这样的多表连接查询是没有意义的),
    是否就不存在我第一回问的问题了?(也就是说哪个表放在前面后面都一样),
    因为最终结果是全笛卡尔积,究竟第一个表是否排序、合并了,效率不会有影响。
      

  5.   

    RBO情况下适用, 不过现在都改CBO了
      

  6.   


    select * from A, B也存在同样的问题(只要是联合查询就必然有这样的问题)
    查询的时候发生笛卡尔积的时候还是需要排序结合的
      

  7.   

    回答 4,5楼你可以这样想
    a 为基础表  多数据b 为参照表 小数据方案一 先读取a,排序a,在连接b方案二  先读取b,排序b,再连接a
     肯定是二比较好二中只需要读取全部的b和部分的a。