我需要从表A中获取表B中不存在的数据。任何人都可以告诉我,在以下所有查询中,哪种方式在运行时方面会更有效。
select col1 from A
minus
select col1 from B
select col1 from A where not exists (select 1 from B where A.col1=B.col1)
select X from (select A.col1 as "X" ,B.col1 as "Y" from A left outer join B on A.col1=B.col1) where Y is null
对于任何形式的问题“什么是编写执行X的SQL语句的最有效方式”,答案始终是相同的-这取决于。
基于成本的优化器(CBO)考虑了有关所涉及表中数据的大量统计信息,以便决定使用哪种计划。根据您的数据,这三个查询完全有可能产生相同的查询计划(因此具有相同的性能)。您可能还会得到三个不同的计划。如果您获得不同的计划,则需要查看哪种计划对您的对象和硬件上的数据最有效。当然,随着数据的更改,CBO可以自由地为您的SQL语句提出不同的(希望更好)计划,因此“最佳”计划是一个不断发展的目标。今天可能效率最高的计划明天可能效率最高。
鉴于此,我的偏见始终是从最清楚地表达我要实现的逻辑的查询开始。编写尽可能可读的SQL,然后让优化器提出计划。如果某个特定查询成为瓶颈,并且您需要对其进行优化,那么一种选择是重写查询(如果优化器碰巧选择了一个效率较低的计划,而Oracle却选择了许多其他方式来影响查询计划,需要重写查询)。对我来说,MINUS
和EXISTS
都是编写SQL语句的相对清晰的方法,因此我也不会反对。这LEFT JOIN
另一方面,让我感到不清楚的是-您故意在内部查询中查询数据,然后在另一层过滤掉数据-因此,我建议您在没有强有力的证据证明它实际上更有效的情况下,不建议使用在您的环境中高效。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句