我需要从表B中没有的表A获取数据。有人能告诉我,在以下所有查询中,哪种方式在运行时方面更有效?
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发布于 2014-07-16 14:32:18
对于表单“编写执行X的SQL语句的最有效方法”,答案总是一样的--这取决于。
基于成本的优化器(CBO)考虑了大量有关表中数据的统计信息,以决定使用什么计划。根据您的数据,这三个查询完全有可能产生相同的查询计划(从而具有相同的性能)。你也有可能得到三个不同的计划。如果您有不同的计划,您将需要查看哪个计划对您的对象和硬件上的数据最有效。当然,随着数据的变化,CBO可以为SQL语句提供不同(希望更好)的计划,因此“最佳”计划是一个移动目标。今天最有效的计划可能不是明天最有效的计划。
考虑到这一点,我的偏见总是从最清楚地表达我试图实现的逻辑的查询开始。编写最易读的SQL,让优化器提出计划。如果某个特定的查询最终成为瓶颈,并且需要对其进行优化,那么其中一个选项就是重写查询(如果优化器碰巧选择了不需要重写查询的低效率计划,那么Oracle还有许多其他方法影响查询计划)。对我来说,MINUS和EXISTS都是写SQL语句的相对清晰的方式,所以我不会反对它们。另一方面,LEFT JOIN给我的印象更不清楚--你是有意在内部查询中请求数据,然后在另一层过滤它--所以我不建议使用这种方法,除非有强有力的证据表明它在您的环境中确实更有效。
https://stackoverflow.com/questions/24779532
复制相似问题