SELECT distinct * from MARKET A LEFT join (select distinct bond_code, big_par,BOND_UNI_CODE,bond_id,Sec_Mar_Par from CONT )B on A.code = B.bond_code left join (select distinct CCX_INTE_METH_PAR,BOND_UNI_CODE from basic_info) C on C.BOND_UNI_CODE = B.BOND_UNI_CODE left join (select distinct cred_level,BOND_SHORT_LEVEL,BOND_LONG_LEVEL,bond_id from bond_cred_rate) D on B.bond_id = D.bond_id where 1 = 1 and b.big_par is not null SQL是这样的
and b.big_par is not null -- 上面这个条件放到子查询里面去! -- SQL语句的起码规则:先析取,再联结!
为空是因为left join 才产生的 所以不能在子查询中加入 这个
-- 你这个语句还是很有问题!-- 优化方法:-- 验证所有子查询的 distinct 是否是多余的,如果是多余的,将distinct关键字去掉:-- 如: select distinct bond_code, big_par,BOND_UNI_CODE,bond_id,Sec_Mar_Par from CONT where big_par is not null;select bond_code, big_par,BOND_UNI_CODE,bond_id,Sec_Mar_Par from CONT where big_par is not null;-- 如果上面两个查询返回的记录行是一样的,则将原子查询中的distinct 关键字去掉(即:选择下面的语句作为子查询语句!-- 其他两个子查询同理!
仔细分析一下自己的SQL中的B部分,如果不需要这么折腾,在独处来的时候,就给足了条件不过你可能也是五百吧。这种情况不可避免。not is null的的确确是影响性能的一个关键。楼主同学,你好好研究下你的SQl吧,你的SQL、可以继续做优化的说。回一下9楼:left join 的时候,右边没有能够匹配上左面的数据,那么,情况咋样呢?当然匹配出来的是空值了。
-- 当有where 条件时,先析取(先where条件排除不需要联结的数据行),再联结!
LEFT join
(select distinct bond_code, big_par,BOND_UNI_CODE,bond_id,Sec_Mar_Par from CONT )B
on A.code = B.bond_code
left join
(select distinct CCX_INTE_METH_PAR,BOND_UNI_CODE from basic_info) C
on C.BOND_UNI_CODE = B.BOND_UNI_CODE
left join
(select distinct cred_level,BOND_SHORT_LEVEL,BOND_LONG_LEVEL,bond_id from bond_cred_rate) D
on B.bond_id = D.bond_id where 1 = 1 and b.big_par is not null
SQL是这样的
-- SQL语句的起码规则:先析取,再联结!
select distinct bond_code, big_par,BOND_UNI_CODE,bond_id,Sec_Mar_Par from CONT
where big_par is not null;select bond_code, big_par,BOND_UNI_CODE,bond_id,Sec_Mar_Par from CONT
where big_par is not null;-- 如果上面两个查询返回的记录行是一样的,则将原子查询中的distinct 关键字去掉(即:选择下面的语句作为子查询语句!-- 其他两个子查询同理!
HashJoin外部表用大的
NestedJoin外部表用小的
等值字段是否有索引
表的统计信息是否正确 等等...