当前位置: 代码迷 >> Oracle开发 >> SQL 执行计划,该怎么解决
  详细解决方案

SQL 执行计划,该怎么解决

热度:205   发布时间:2016-04-24 07:34:51.0
SQL 执行计划
SELECT a.customer_id,c.party_code
  FROM tp_no_apply_order a, TH_PARTY C
 WHERE a.customer_id = c.party_code
执行计划

SELECT STATEMENT, GOAL = CHOOSE 145 19397 775880
 NESTED LOOPS 145 19397 775880
  INDEX FAST FULL SCAN JTCRM TP_CUSTOMER_CODE 6 19397 387940
  INDEX UNIQUE SCAN JTCRM TH_PARTY_U01 1 1 20
--多加了一个字段,a.req_seri_no
SELECT a.customer_id,a.req_seri_no,c.party_code
  FROM tp_no_apply_order a,TH_PARTY C
  WHERE a.customer_id = c.party_code
执行计划
SELECT STATEMENT, GOAL = CHOOSE 214 19397 1028041
 HASH JOIN 214 19397 1028041
  TABLE ACCESS FULL JTCRM TP_NO_APPLY_ORDER 24 19397 640101
  INDEX FAST FULL SCAN JTCRM TH_PARTY_U01 70 124443 2488860
两段执行计划不一样了,后者,TABLE ACCESS FULL 全表扫。


------解决方案--------------------
同等回复。
------解决方案--------------------
因为索引TP_CUSTOMER_CODE 中没有a.req_seri_no字段,用索引还得再用ROWID查询表数据才能获取到字段a.req_seri_no,效率比全表扫描还差。
如果两个表中有一个比较小,可以做为驱动表进行嵌套循环。
------解决方案--------------------
探讨

因为索引TP_CUSTOMER_CODE 中没有a.req_seri_no字段,用索引还得再用ROWID查询表数据才能获取到字段a.req_seri_no,效率比全表扫描还差。
如果两个表中有一个比较小,可以做为驱动表进行嵌套循环。