有人告诉我,当检查表中是否存在行时,这将起作用:
EXISTS(SELECT 1 FROM....)
但就查询速度性能而言,“更好”的方法是使用以下方法:
EXISTS(SELECT TOP(1) NULL FROM......)
我在网上搜索了任何引用此比较的内容,我能找到的唯一信息表明这是个人偏好,实际上其中一个比另一个没有性能提升。像这样的问题总是存在“具体情况”的方面,但总的来说,使用第二个实现EXISTS()
比第一个实现是否有任何性能增益?
有人告诉我,当检查表中是否存在行时,这将起作用:
EXISTS(SELECT 1 FROM....)
但就查询速度性能而言,“更好”的方法是使用以下方法:
EXISTS(SELECT TOP(1) NULL FROM......)
我在网上搜索了任何引用此比较的内容,我能找到的唯一信息表明这是个人偏好,实际上其中一个比另一个没有性能提升。像这样的问题总是存在“具体情况”的方面,但总的来说,使用第二个实现EXISTS()
比第一个实现是否有任何性能增益?
当然,您必须检查执行计划。
但几乎可以肯定的是,考虑到优化是多么微不足道,编译器将始终丢弃 an 顶层的以下内容
EXISTS
,因为它们不会影响语义:SELECT
栏目DISTINCT
TOP
ORDER BY
您所做的就是查看是否有任何行,并且这些构造都不能将其减少到零。
请注意,这并不总是正确的:有些结构会由于其语义而相互作用并保留其中一些功能。例如:
OFFSET FETCH
INTERSECT/EXCEPT
(但不是UNION
)SELECT NULL
.常见的做法是使用
SELECT 1
或SELECT NULL
。为了清楚起见,我总是在同一行写一个 ,在下一行写一个
EXISTS
,表明这实际上只是语法,如下所示:SELECT
FROM
SELECT
在某些 DBMS 中,您甚至可以完全省略列