以下のクエリは、パフォーマンスを向上させる方法として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