Tag Archives: 执行计划

勿混用过滤条件(where)和连接条件(on)

SQL中,where子句是过滤条件,on子句是连接条件,两者不能混用。如果混用,可能会导致DB2产生错误的执行计划,从而引发严重的性能问题。很多新手比较容易犯此类错误,在没有发生严重的的性能问题时,往往因为没有引起注意而不会得到重视。下面是我在监控DB2性能问题时发现的一个问题SQL:

select t.* , case when u.user_id is not null then 1 else 0 end as flag
from shenll_gprs_flow_200908 t left join dw_user_m_200908 u
on t.user_id=u.user_id and u.is_bill=1 and u.user_type not in(2,3,4) and t.area_id='570'

该SQL语句将过滤条件写到关联条件中,导致DB2生成了错误的执行计划,使用了内连接NLJoin对两张大表进行了关联,引起了严重的性能问题。以下是上述语句的执行计划:

错误的执行计划

对该语句进行修改,使用正确的on语句和where语句:

select t.* , case when u.user_id is not null then 1 else 0 end as flag
from shenll_gprs_flow_200908 t left join dw_user_m_200908 u
on t.user_id=u.user_id
where u.is_bill=1 and u.user_type not in(2,3,4) and t.area_id='570'

上述SQL的执行计划如下:

正确的执行计划

从上面的执行计划中可以看到,DB2使用了哈希连接,整个SQL的执行成本从5亿降低到6万,执行效率得到了数据级的提升。


Data Warehouse For Ever原创文章,转载请注明出处