我有一个跨越两个表的查询
select count(*) from ingenium.empevt, ingenium.evt where empevt_evtfk = evt_pk
需要很长时间才能运行并试图找出我查看计划的原因
Operation Object Name Rows Bytes Cost Object Node In/Out PStart PStop
SELECT STATEMENT Optimizer Mode=CHOOSE 634 K 75981
HASH JOIN 634 K 180 M 75981
HASH JOIN 845 K 234 M 8930
HASH JOIN 465 K 53 M 3118
NESTED LOOPS 620 K 15 M 1618
NESTED LOOPS 1 20 2
TABLE ACCESS BY INDEX ROWID INGENIUM.USR 1 10 1
INDEX UNIQUE SCAN INGENIUM.XAK1USR 1
TABLE ACCESS BY INDEX ROWID INGENIUM.USR 1 10 1
INDEX UNIQUE SCAN INGENIUM.XAK1USR 1
INDEX RANGE SCAN INGENIUM.SECUSREMP_USREMP 89 M 600 M 1616
TABLE ACCESS FULL INGENIUM.TBLEMP 620 K 55 M 1150
TABLE ACCESS FULL INGENIUM.TBLEMPEVT 1 M 182 M 4000
TABLE ACCESS FULL INGENIUM.SECUSREMP 89 M 600 M 27013
我不喜欢的是INGENIUM.SECUSREMP_USREMP上的表访问已满,其中包含大量行。我不知道为什么它扫描该表,因为它不在查询中。 INGENIUM.SECUSREMP_USREMP有一个引用ingenium.emp.emp_pk的外键,但我不明白为什么这很重要。
是否有某种方法可以重写此查询,以便它不扫描看似无关的表?为什么它首先扫描该表?
答案 0 :(得分:1)
据推测,empevt和evt都是观点,而不是表格?您的查询计划(仅)显示正在访问的这些表:
这些观点的定义是什么?当然,除非你看错了计划!