ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Optimizer 怎么才能返回正确的结果

Optimizer 怎么才能返回正确的结果

原创 Linux操作系统 作者:fengjin821 时间:2009-06-05 14:34:49 0 删除 编辑

SELECT  DISTINCT C_FUNDACCO
                  FROM TACCOINFO
                 WHERE C_CUSTNO =
                       (SELECT DISTINCT C_CUSTNO
                          FROM TACCOINFO
                         WHERE C_FUNDACCO = '101001254712')

-------执行计划如下:--
SELECT STATEMENT, GOAL = CHOOSE                        122004        9111806        309801404
HASH UNIQUE                        122004        9111806        309801404
  VIEW        CUSTOMER        TACCOINFO        38733        9111806        309801404
   UNION-ALL                                       
    HASH JOIN                        26072        4555903        141232993
     INDEX FAST FULL SCAN        FGCRM        PK1_1        2004        3960936        23765616
     PARTITION RANGE ALL                        12625        4555903        113897575
      TABLE ACCESS FULL        FGCRM        CRM_ACCOINFO        12625        4555903        113897575
    HASH JOIN                        12661        4555903        136677090
     INDEX FAST FULL SCAN        FGCRM        PK1_2        6        9368        46840
     PARTITION RANGE ALL                        12625        4555903        113897575
      TABLE ACCESS FULL        FGCRM        CRM_ACCOINFO        12625        4555903        113897575
   HASH UNIQUE                        10        2        68
    VIEW        CUSTOMER        TACCOINFO        9        2        68
     UNION-ALL                                       
      NESTED LOOPS                        5        1        31
       TABLE ACCESS BY GLOBAL INDEX ROWID        FGCRM        CRM_ACCOINFO        3        1        25
        INDEX UNIQUE SCAN        FGCRM        ACCOINFO_FUNDACCO_PARTITION        2        1       
       INDEX RANGE SCAN        FGCRM        FGCRM_PERSONAL_CUST_TOCHAR        2        1        6
      NESTED LOOPS                        4        1        30
       TABLE ACCESS BY GLOBAL INDEX ROWID        FGCRM        CRM_ACCOINFO        3        1        25
        INDEX UNIQUE SCAN        FGCRM        ACCOINFO_FUNDACCO_PARTITION        2        1       
       INDEX RANGE SCAN        FGCRM        FGCRM_ORG_CUST_TOCHAR        1        1        5


但是, 通过

SELECT DISTINCT C_CUSTNO
                          FROM TACCOINFO
                         WHERE C_FUNDACCO = '101001254712'        查出 C_CUSTNO 为,再通过


SELECT  DISTINCT C_FUNDACCO
                  FROM TACCOINFO
                 WHERE C_CUSTNO ='777482'

--执行计划如下

SELECT STATEMENT, GOAL = CHOOSE                        57        2        68
HASH UNIQUE                        57        2        68
  VIEW        CUSTOMER        TACCOINFO        56        2        68
   UNION-ALL                                       
    NESTED LOOPS                        29        1        31
     INDEX RANGE SCAN        FGCRM        FGCRM_PERSONAL_CUST_TOCHAR        3        1        6
     PARTITION RANGE ALL                        26        1        25
      TABLE ACCESS BY LOCAL INDEX ROWID        FGCRM        CRM_ACCOINFO        26        1        25
       INDEX RANGE SCAN        FGCRM        ACCOINFO_CHAR_CUSTID_PARTITION        12        27       
    NESTED LOOPS                        27        1        30
     INDEX RANGE SCAN        FGCRM        FGCRM_ORG_CUST_TOCHAR        1        1        5
     PARTITION RANGE ALL                        26        1        25
      TABLE ACCESS BY LOCAL INDEX ROWID        FGCRM        CRM_ACCOINFO        26        1        25
       INDEX RANGE SCAN        FGCRM        ACCOINFO_CHAR_CUSTID_PARTITION        12        28       

执行结果不一样

需求有点像 scott 中,已知一员工姓名,查该员工所在部门的所有员工

使用PRECOMPUTE_SUBQUERY hint :

SELECT  DISTINCT C_FUNDACCO
                  FROM TACCOINFO
                 WHERE C_CUSTNO =
                       (SELECT  /*+ PRECOMPUTE_SUBQUERY */ DISTINCT C_CUSTNO
                          FROM TACCOINFO
                         WHERE C_FUNDACCO = '101001254712')

try:

SELECT  DISTINCT C_FUNDACCO
                  FROM TACCOINFO a
                 WHERE  exists     (SELECT  1
                          FROM TACCOINFO b
                         WHERE a.C_CUSTNO=b.C_CUSTNO and b.C_FUNDACCO = '101001254712')


 

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/13165828/viewspace-605249/,如需转载,请注明出处,否则将追究法律责任。

下一篇: 给Oracle打补丁
请登录后发表评论 登录
全部评论

注册时间:2009-04-29

  • 博文量
    191
  • 访问量
    507665