解决方案 »

  1.   

    语句是什么样的?能否给出语句,并对涉及的表和字段的分布情况进行说明,还有不加hint时候的执行计划
      

  2.   

     SELECT /*+ USE_HASH(CP,T,C,SO,EB,QB,P)   */
                HIBERNATE_SEQUENCE.NEXTVAL,T.C_ID,CP.STRPRODCODE,CP.STRPRODNAME,CP.INTQTY,CP.STRMEASUNIT,NULL,
                CP.INTPRICE,CP.INTAMOUNT,CP.INTFREE,CP.INTOTHER,C.C_ID,1,CP.INTAMOUNT,
                CP.DASTARTCONTIME,CP.DAENDCONTIME,CP.STRCONADDR,CP.STRRECEIVE,CP.STRMARK,SO.ORDERID,
                EB.C_ID,P.PROJECTID,QB.C_ID,P.STOCKAFFIRMID,NULL,CP.STRKONNR,CP.INTECONAMOUNT,
                CP.STRERPPOITEM,CP.INTPRICE*(1-C.C_DETAILCODE/100),NULL,SO.C_MATERIALADJUST,
                NULL,NULL,P.C_FEEDBACK,NULL,NULL
          FROM TEMP_CONTENTPART_REMOTE CP
          INNER JOIN T_CONTRACT T ON T.C_STRCONTCODE = CP.STRCONTCODE
          LEFT JOIN T_CODE C ON C.C_TYPECODE ='100' AND C.C_DETAILNAME = CP.STRTAX
          INNER JOIN (
                SELECT     DISTINCT MP.C_MATERIALADJUST C_MATERIALADJUST,SO1.C_ID ORDERID,SO1.C_ORDERCODE FROM T_STOCKORDER SO1
                LEFT JOIN T_MATERIALADJUSTPART MP ON MP.C_STOCKORDER = SO1.C_ID
          )SO ON SO.C_ORDERCODE = CP.STRORDERCODE
          LEFT JOIN T_ENQUIREBILL EB ON EB.C_ENQUCODE = CP.STRENQUCODE
          LEFT JOIN T_QUOTEBILL QB ON QB.C_QUOTECODE = CP.STRQUOTECODE
          LEFT JOIN (
               SELECT  DISTINCT S.C_ID STOCKAFFIRMID,FP.C_FEEDBACK C_FEEDBACK,P1.C_ID PROJECTID,P1.C_PROJCODE  FROM T_PROJECT P1  
               LEFT JOIN T_STOCKAFFIRM S ON S.C_PROJECT = P1.C_ID
               LEFT JOIN T_FEEDBACKPART FP ON FP.C_STOCKAFFIRM = S.C_ID
          )P ON P.C_PROJCODE = CP.STRPROJCODE
    sql是这样的   , 我主要是想问use_hash这样用对不对 , 如果对应用在什么样的场景
      

  3.   

    SELECT STATEMENT, GOAL = ALL_ROWS 783 1 361
     SEQUENCE EDARONG5 HIBERNATE_SEQUENCE
      NESTED LOOPS OUTER 783 1 361
       NESTED LOOPS 773 1 320
        NESTED LOOPS OUTER 764 1 292
         NESTED LOOPS OUTER 761 1 264
          NESTED LOOPS OUTER 758 1 240
           NESTED LOOPS 755 1 225
            TABLE ACCESS FULL EDARONG5 T_CONTRACT 753 1 35
            TABLE ACCESS BY INDEX ROWID EDARONG5 TEMP_CONTENTPART_REMOTE 2 1 190
             INDEX RANGE SCAN EDARONG5 I_CP_CONTENTCODE 2 5
           TABLE ACCESS BY INDEX ROWID EDARONG5 T_QUOTEBILL 3 1 15
            INDEX RANGE SCAN EDARONG5 I_QUOTEBILL_QUOTECODE 2 1
          TABLE ACCESS BY INDEX ROWID EDARONG5 T_ENQUIREBILL 3 1 24
           INDEX RANGE SCAN EDARONG5 I_ENQUIREBILL_ENQUCODE 2 1
         TABLE ACCESS BY INDEX ROWID EDARONG5 T_CODE 3 1 28
          INDEX RANGE SCAN EDARONG5 IDX_CODE_TYPECODE 1 9
        VIEW PUSHED PREDICATE EDARONG5 10 1 28
         SORT UNIQUE 10 1 42
          HASH JOIN OUTER 9 1 42
           TABLE ACCESS BY INDEX ROWID EDARONG5 T_STOCKORDER 5 1 28
            INDEX RANGE SCAN EDARONG5 I_STOCKORDER_ORDERCODE 4 1
           TABLE ACCESS FULL EDARONG5 T_MATERIALADJUSTPART 3 141 1974
       VIEW PUSHED PREDICATE EDARONG5 10 1 41
        SORT UNIQUE 10 1 56
         NESTED LOOPS OUTER 9 1 56
          NESTED LOOPS OUTER 7 1 42
           TABLE ACCESS BY INDEX ROWID EDARONG5 T_PROJECT 4 1 28
            INDEX RANGE SCAN EDARONG5 I_PROJECT_PROJCODE 3 1
           TABLE ACCESS BY INDEX ROWID EDARONG5 T_STOCKAFFIRM 3 1 14
            INDEX RANGE SCAN EDARONG5 I_STOCKAFFIRM_PROJECT 2 1
          TABLE ACCESS BY INDEX ROWID EDARONG5 T_FEEDBACKPART 2 1 14
           INDEX RANGE SCAN EDARONG5 I_FEEDBACKPART_STOCKAFFIRM 2 547
    这是不加hint的执行计划 比较乱, 不会整理...
      

  4.   

    use_hash就和字面上的意思一样,让括号后面的表之间做Hash连接。
    hash连接的官方介绍是
    hash joinA join in which the database uses the smaller of two tables or data sources to build a hash table in memory. The database scans the larger table, probing the hash table for the addresses of the matching rows in the smaller table.在下面的情况中hash连接比nest loop更有效率
    NL is inefficient if the driving table contains lots of rows (i.e. high cardinality) and the inner table is expensive to visit , thus forcing multiple probes of the expensive inner table即,驱动表(例如上面的T_CONTRACT)经过条件过滤后的结果集较大时,hash连接将更有效率
    而不加hint的时候,cbo根据统计信息来估算成本,进而根据成本最低的执行计划来选择连接方式。因此,如果你hint会更快,说明要么统计信息不正确(可以重新进行采集),要么成本估算不正确。建议在非必要情况下,不要用hint,否则当数据量的分布发生改变时,执行计划被固定可能导致性能的恶化pl/sql dev中第一种方式查出需要30秒不能算数,因为那只是查询出前几条记录的时间
      

  5.   

    谢谢版主给的意见, use_hash(a,b,c,d)是可以这样用的? 
      

  6.   

    还有想请教下  多少数据算是数据量比较大 可以考虑使用hint这种方式
      

  7.   

    除非系统本身走的执行计划偏差较大,才建议用hint,同时要考虑未来数据的变化
    这个量实际上没有个固定值,和实际环境有很大关系。一般在万级以上