2014-03-31 64 views
0

如果要执行代码,只有当某行存在时,检查存在的正确方法是什么?以前,我使用了不同的方法,对整体性能没有多少关注......并想知道其他方法之间是否存在显着差异?SQL“是否存在记录”

IF EXISTS (SELECT * FROM MYTABLE WHERE...) 

IF (SELECT COUNT(*) FROM MYTABLE WHERE...) > 0 

有没有比上述更好的方法?

也许有人可以提供推荐的方法,为什么这种方法比其他方式更好?

+1

如果您只想知道是否存在行,您为什么要计算行数?所以即使执行计划是相同的,第一种方法更具可读性。 –

回答

5

dbms很聪明,知道他不需要从EXISTS子句中检索任何东西。

一个也许老了,但通常的方式是明确的用户(但不改变执行计划的任何东西)是使用

if exists (select null from) --or select 1 from 

if exists (select * from) 

不相同。

一个EXISTS子句比你的第二个版本更好地告诉你想要达到什么。

+1

但这个答案使用'EXISTS'和'COUNT'比较了两种方法吗? –

+0

@TimSchmelter现在有点;)但是,我错过了第一件事。 –

2

exists方法在性能方面更好。当遇到匹配的第一条记录时,它可以停止处理基础表/查询。

count(*)方法必须实际产生记录数,因此它需要完成基础表扫描/查询。然后,它也必须进行聚合。

是的,它们之间可能存在显着的性能差异。假设你有一张有1亿行的桌子,你需要:

if exists (select 1 from table t) 

这将几乎立即返回。

if (select count(*) from table t) 

必须做一个全表扫描,所以出去喝一杯咖啡。使用exists