请建议以下哪种查询对大型数据集更快。实际上我必须在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';
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);
提前致谢。
答案 0 :(得分:1)
如果您计划在列上创建INDEXES,则使用IN子句将与使用JOIN子句相同。但通常我更喜欢使用ANSI兼容的JOINS。
您也可以参考此article:
IN谓词是一个丑陋的小鸭子。由于它出现的事实 一般来说,缺乏经验的开发人员眼中效率低下 被认为是无效的,建议使用EXISTS或JOIN 代替。
但是,Oracle使用索引UNIQUE可以很好地优化IN 约束,NOT NULL修饰符和明智的其他额外信息。