如果要执行代码,只有当某行存在时,检查存在的正确方法是什么?以前,我使用了不同的方法,对整体性能没有多少关注......并想知道其他方法之间是否存在显着差异?SQL“是否存在记录”
IF EXISTS (SELECT * FROM MYTABLE WHERE...)
IF (SELECT COUNT(*) FROM MYTABLE WHERE...) > 0
有没有比上述更好的方法?
也许有人可以提供推荐的方法,为什么这种方法比其他方式更好?
如果要执行代码,只有当某行存在时,检查存在的正确方法是什么?以前,我使用了不同的方法,对整体性能没有多少关注......并想知道其他方法之间是否存在显着差异?SQL“是否存在记录”
IF EXISTS (SELECT * FROM MYTABLE WHERE...)
IF (SELECT COUNT(*) FROM MYTABLE WHERE...) > 0
有没有比上述更好的方法?
也许有人可以提供推荐的方法,为什么这种方法比其他方式更好?
dbms很聪明,知道他不需要从EXISTS子句中检索任何东西。
一个也许老了,但通常的方式是明确的用户(但不改变执行计划的任何东西)是使用
if exists (select null from) --or select 1 from
但
if exists (select * from)
不相同。
一个EXISTS
子句比你的第二个版本更好地告诉你想要达到什么。
但这个答案使用'EXISTS'和'COUNT'比较了两种方法吗? –
@TimSchmelter现在有点;)但是,我错过了第一件事。 –
exists
方法在性能方面更好。当遇到匹配的第一条记录时,它可以停止处理基础表/查询。
count(*)
方法必须实际产生记录数,因此它需要完成基础表扫描/查询。然后,它也必须进行聚合。
是的,它们之间可能存在显着的性能差异。假设你有一张有1亿行的桌子,你需要:
if exists (select 1 from table t)
这将几乎立即返回。
if (select count(*) from table t)
必须做一个全表扫描,所以出去喝一杯咖啡。使用exists
。
如果您只想知道是否存在行,您为什么要计算行数?所以即使执行计划是相同的,第一种方法更具可读性。 –