sql 服务器中存在的执行
Execution of Exists in sql server
众所周知,EXISTS
优于 IN
子句。我有问题,但每次都没有回答。
当我们使用Exists
时,是在获取第一条记录时完成内部查询还是继续执行所有记录??
[NOT] EXISTS 运算符在子查询(即驱动查询)包含大量数据时提供最佳性能。原因是它在查询中遵循“至少找到”的原则。如果在与主驾驶查询相关的子查询中至少找到一条记录,则设置为 TRUE,并停止进一步扫描 table。与 [NOT] IN、LIKE 等其他比较运算符不同,returns 数据用于比较,[NOT] EXISTS return BOOLEAN 输出。
您可以在 link 中找到更详细的插图:
http://www.dbanotes.com/database-development/using-exists-in-oracle-sql-queries/
exists
和in
都是一样的。任何理智的查询计划优化器都会为它们生成相同的计划。
-- http://sqlfiddle.com/#!6/97c87/1
select *
from t1
where name in (select name from t2)
此查询将生成计划:
-- http://sqlfiddle.com/#!6/97c87/2
select *
from t1
where exists (select name from t2 where t2.name=t1.name)
第二个查询将生成计划:
如您所见,两者完全相同。
众所周知,EXISTS
优于 IN
子句。我有问题,但每次都没有回答。
当我们使用Exists
时,是在获取第一条记录时完成内部查询还是继续执行所有记录??
[NOT] EXISTS 运算符在子查询(即驱动查询)包含大量数据时提供最佳性能。原因是它在查询中遵循“至少找到”的原则。如果在与主驾驶查询相关的子查询中至少找到一条记录,则设置为 TRUE,并停止进一步扫描 table。与 [NOT] IN、LIKE 等其他比较运算符不同,returns 数据用于比较,[NOT] EXISTS return BOOLEAN 输出。
您可以在 link 中找到更详细的插图:
http://www.dbanotes.com/database-development/using-exists-in-oracle-sql-queries/
exists
和in
都是一样的。任何理智的查询计划优化器都会为它们生成相同的计划。
-- http://sqlfiddle.com/#!6/97c87/1
select *
from t1
where name in (select name from t2)
此查询将生成计划:
-- http://sqlfiddle.com/#!6/97c87/2
select *
from t1
where exists (select name from t2 where t2.name=t1.name)
第二个查询将生成计划:
如您所见,两者完全相同。