0

以下のクエリは、パフォーマンスを向上させる方法として1分以上かかります。両方のテーブルでフルスキャンが実行されています。回避する方法は?

クエリプラン:

SELECT STATEMENT  ALL_ROWSCost: 62  Bytes: 14,355  Cardinality: 45          
    3 HASH JOIN  Cost: 62  Bytes: 14,355  Cardinality: 45   
        1 TABLE ACCESS FULL TABLE SYSADM.POSITIONS Cost: 9  Bytes: 520  Cardinality: 4  
        2 TABLE ACCESS FULL TABLE SYSADM.PORTCONSUMPTION Cost: 52  Bytes: 797,202  Cardinality: 4,218  



SELECT     
     a.Consumption    AS Consumption     ,
     a.Cost      AS Cost      ,
     a.CreatedBy     AS CreatedBy     ,
     a.CreatedDate    AS CreatedDate     ,
     a.UpdatedBy     AS UpdatedBy     ,
     a.UpdatedDate    AS UpdatedDate   

   FROM PortConsumption a   

   JOIN Positions b
   ON  a.PortRotationId = b.Id

   WHERE  b.VoyageId ='82A042031E1B4C38A9832A6678A695A4';

ポジション(* 115970レコード) *

Id - Primary key (indexed)
VoyageId - indexed

PortConsumption(* 1291000レコード) *

Id - Primary key (indexed)
PortRotationId - indexed

実行後

dbms_stats.gather_table_stats('SYSADM'、'POSITIONS');
dbms_stats.gather_table_stats('SYSADM'、'PORTCONSUMPTION');

フルスキャンは実行されていませんが、パフォーマンスは同じで、50秒かかります。

プラン

SELECT STATEMENT  ALL_ROWSCost: 20  Bytes: 16,536  Cardinality: 52                  
    6 NESTED LOOPS              
        4 NESTED LOOPS  Cost: 20  Bytes: 16,536  Cardinality: 52        
            2 TABLE ACCESS BY INDEX ROWID TABLE SYSADM.POSITIONS Cost: 5  Bytes: 520  Cardinality: 4    
                1 INDEX RANGE SCAN INDEX SYSADM.INX_POSITIONS_VOYAGEID Cost: 3  Cardinality: 4  
            3 INDEX RANGE SCAN INDEX SYSADM.INX_PORTCONS_PORTROTID Cost: 2  Cardinality: 12     
        5 TABLE ACCESS BY INDEX ROWID TABLE SYSADM.PORTCONSUMPTION Cost: 4  Bytes: 2,256  Cardinality: 12   
4

1 に答える 1

1

Oracleは現在、POSITIONSには115970ではなく4行があり、PORTCONSUMPTIONには120万ではなく4218行があると考えているため、テーブルの統計を収集する必要があります。したがって、両方のフルスキャンがクエリに答える最良の方法です。

このコードは、デフォルト設定を使用して2つのテーブルの統計を収集します。

begin
    dbms_stats.gather_table_stats ('SYSADM', POSITIONS');
    dbms_stats.gather_table_stats ('SYSADM', PORTCONSUMPTION ');
end;

統計を収集する方法の詳細については、DBMS_STATSのドキュメントを参照してください。

于 2012-08-29T11:14:00.173 に答える