SQL 执行计划

yjwcwrkks 2012-03-13 10:25:18
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 全表扫。
...全文
79 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
lnuwhy 2012-03-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 cowboyhn 的回复:]

因为索引TP_CUSTOMER_CODE 中没有a.req_seri_no字段,用索引还得再用ROWID查询表数据才能获取到字段a.req_seri_no,效率比全表扫描还差。
如果两个表中有一个比较小,可以做为驱动表进行嵌套循环。
[/Quote]
楼上说的很对,oracle分析出如果用rowid查询表数据没有全表扫描效率高,自然就选后者了。索引列和表数据是分开的。
cowboyhn 2012-03-13
  • 打赏
  • 举报
回复
因为索引TP_CUSTOMER_CODE 中没有a.req_seri_no字段,用索引还得再用ROWID查询表数据才能获取到字段a.req_seri_no,效率比全表扫描还差。
如果两个表中有一个比较小,可以做为驱动表进行嵌套循环。
andyguan01_2 2012-03-13
  • 打赏
  • 举报
回复
同等回复。

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧