SELECT ,
job_id
FROM (SELECT c.re ,
j.job_id job_id
FROM tt_job j,
tt_chem c
WHERE j.mat_id = c.mat_id
and c.mat_id='T234320') p
where f_is_available_job(p.job_id)=1现在我可以确定的是..内层查询P返回内容只有2行.
我觉得外层查询的这个函数应该只对这2行作过滤吧..
但是实际上ORACEL把外层的这个查询做了全表扫描...
我的记录是这个函数执行了大概2W多次.
很奇怪...为什么会这样子呢..能不能强迫外层查询的WHERE语句直接使用内层结果呢执行计划如下:
SELECT STATEMENT ALL_ROWSCost: 730 Bytes: 64 Cardinality: 1 12 HASH JOIN Cost: 730 Bytes: 64 Cardinality: 1 10 VIEW DATA01.
11 TABLE ACCESS FULL TABLE DATA01.TT_JOB Cost: 726 Bytes: 73,085 Cardinality: 1,555 为什么他把外层的函数与内层的连接合并到了一起..搞成了一个HASH JOIN..
能不能强迫他不这么干呢
job_id
FROM (SELECT c.re ,
j.job_id job_id
FROM tt_job j,
tt_chem c
WHERE j.mat_id = c.mat_id
and c.mat_id='T234320') p
where f_is_available_job(p.job_id)=1现在我可以确定的是..内层查询P返回内容只有2行.
我觉得外层查询的这个函数应该只对这2行作过滤吧..
但是实际上ORACEL把外层的这个查询做了全表扫描...
我的记录是这个函数执行了大概2W多次.
很奇怪...为什么会这样子呢..能不能强迫外层查询的WHERE语句直接使用内层结果呢执行计划如下:
SELECT STATEMENT ALL_ROWSCost: 730 Bytes: 64 Cardinality: 1 12 HASH JOIN Cost: 730 Bytes: 64 Cardinality: 1 10 VIEW DATA01.
11 TABLE ACCESS FULL TABLE DATA01.TT_JOB Cost: 726 Bytes: 73,085 Cardinality: 1,555 为什么他把外层的函数与内层的连接合并到了一起..搞成了一个HASH JOIN..
能不能强迫他不这么干呢
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货