这将更好地执行JOIN或IN子句

时间:2016-04-15 11:51:44

标签: sql oracle11g common-table-expression

请建议以下哪种查询对大型数据集更快。实际上我必须在temp和COSTING_TABLE之间找到不匹配的记录,数据集是数百万。我们还没有实现索引,但我正在寻找一些有效的方法来做同样的事情。

SELECT tmp.PRINT, tmp.NAME, tmp.COST , tmp.CURRENCY, tmp.validity
                                    FROM TEMPTABLE tmp 
                                    WHERE NOT EXISTS (SELECT 1
                                                        FROM COSTING_TABLE  ct
                                                        WHERE (ct.print = tmp.print 
                                                        AND ct.name IN (SELECT name FROM CostMapping WHERE PRICE 'ABC')
                                                        AND ct.COST <> tmp.COST 
                                                        AND to_date(tmp.validity,'DD-MON-YY') > SYSDATE)
                                                      ) 
                                     AND tmp.name = 'ABC';

enter image description here

WITH JOIN

SELECT tmp.PRINT, tmp.NAME, tmp.COST , tmp.CURRENCY, tmp.validity 
FROM TEMPTABLE tmp 
LEFT OUTER JOIN  
COSTING_TABLE ct
ON ct.print = tmp.print AND
 ct.name IN (SELECT name FROM CostMapping WHERE PRICE = 'ABC')
    AND ct.COST <> tmp.COST 
    AND to_date(tmp.valid_before,'DD-MON-YY') > SYSDATE
WHERE tmp.name = 'ABC' AND 
(ct.PRINT IS NULL OR ct.NAME IS NULL OR ct.COST IS NULL OR ct.validity IS NULL);

enter image description here

提前致谢。

1 个答案:

答案 0 :(得分:1)

如果您计划在列上创建INDEXES,则使用IN子句将与使用JOIN子句相同。但通常我更喜欢使用ANSI兼容的JOINS。

您也可以参考此article

  

IN谓词是一个丑陋的小鸭子。由于它出现的事实   一般来说,缺乏经验的开发人员眼中效率低下   被认为是无效的,建议使用EXISTS或JOIN   代替。

     

但是,Oracle使用索引UNIQUE可以很好地优化IN   约束,NOT NULL修饰符和明智的其他额外信息。