如题,一段SQL中,用到了4张远程表,对其中2张做了DRIVING_SITE
从理论上讲,对性能会有帮助么。

解决方案 »

  1.   

    SELECT     /*+ DRIVING_SITE(CIM03) DRIVING_SITE(CIM25) */
    DISTINCT t1.itemcode as itemcode
    FROM      cim03 t1
    INNER JOIN cim25 t2 ON t1.itemcode = t2.itemcode
    WHERE  t1.itemkbn IN ( '01','02','08')
    AND   t1.itemcode  IN ('0011008300','0011009300','0011018100',
    '0011020000','0011046000','0011047000')
    AND t1.insertdate <= 20130828
    AND EXISTS(SELECT 1
    FROM ciy80 t3
    , ciy81 t4
    WHERE t1.itemcode = t4.itemcode) ORDER BY bcode asc , jcode asc , itemcode ascCIM03 CIM25 CIY80 CIY81 都是远程表
    其中80,81的数据偏大。
      

  2.   

    如果CIM03 CIM25 CIY80 CIY81 都是远程表,为什么不加4张表呢?SELECT     /*+ DRIVING_SITE(CIM03) DRIVING_SITE(CIM25) DRIVING_SITE(CIY80) DRIVING_SITE(CIY81) */
    DISTINCT t1.itemcode as itemcode
    FROM      cim03 t1
    INNER JOIN cim25 t2 ON t1.itemcode = t2.itemcode
    WHERE  t1.itemkbn IN ( '01','02','08')
    AND   t1.itemcode  IN ('0011008300','0011009300','0011018100',
    '0011020000','0011046000','0011047000')
    AND t1.insertdate <= 20130828
    AND EXISTS(SELECT 1
    FROM ciy80 t3
    , ciy81 t4
    WHERE t1.itemcode = t4.itemcode) ORDER BY bcode asc , jcode asc , itemcode asc
      

  3.   

    80,81两张表是后来加上去的,所以没加HINT,当时跑跑也没什么问题。
    后来客户那边数据太大,一跑CPU飚到100%
    跪了。
      

  4.   

    话说怎么确认这个表是在本地DB运行的还是在远程DB运行啊?
      

  5.   


    http://blog.sina.com.cn/s/blog_6cea217301019cpn.html
      

  6.   


    http://blog.sina.com.cn/s/blog_6cea217301019cpn.html
    就如同我上面的SQL一样,因为80,81表没有加HINT,所以会不会把这两张表的数据取到本地
    DB执行了。
    从执行计划中能判断出80,81的执行场所么?
      

  7.   

    在这里应该加和不加是一样的,另外
    SELECT 1
    FROM ciy80 t3, ciy81 t4 WHERE t1.itemcode = t4.itemcode,你的t3表没用到啊
      

  8.   


    http://blog.sina.com.cn/s/blog_6cea217301019cpn.html
    就如同我上面的SQL一样,因为80,81表没有加HINT,所以会不会把这两张表的数据取到本地
    DB执行了。
    从执行计划中能判断出80,81的执行场所么?driving_site的相关说明:
    对于那些存在远程的SQL,ORACLE可以有两种选择:
    1,在远端执行SQL
    2,在本地执行SQL
    至于如果选择SQL的执行地点呢,这完全是由SQL决定的,看在哪端执行的COST低就在哪端执行。但是ORACLE并不总是那么聪明,所以有的时候需要我们自己觉得SQL在哪端执行。我们可以driving_site这个HINT来决定SQL的执行。
    看下面的SQL:SELECT /*+driving_site(a)*/
    a.column_1,
    b.column_2
    FROM table_1@dl_remote a,
    table_2 b
    WHERE a.column_1 = b.column;由于table_1是远端的表,在/*+driving_site(a)*/提示的影响下,oracle会把表table_2发送到dl_remote所指的远端,
    然后在远端进行连接,最后把执行的结果在返回给本地。SELECT /*+driving_site(b)*/
    a.column_1,
    b.column_2
    FROM table_1@dl_remote a,
    table_2 b
    WHERE a.column_1 = b.column;由于table_2是本地的表,在/*+driving_site(b)*/提示的影响下,oracle会把表table_1的数据取到本地,
    然后在本地进行连接,最后把执行的结果在返回。如果表table_1和table_2的记录数相差很多的话,选择合适的执行端就显得极其重要了。你可以看执行计划,这个hits有没有用到
      

  9.   

    WHERE t3.eno = t4.eno
    这个条件漏掉了
      

  10.   


    你把执行计划打出来
    remote对应的表就是被放到远端执行的表你的这个查询中用到的表都是在远端,因此你加driving_site应该是没有效果的吧?
      

  11.   

    找到了一段老外的问答,和我的提问毫无违和感,借鉴一下。
    https://forums.oracle.com/thread/962996收工!