SQL Server:选择字面值比选择字段更快吗?

TSo*_*Kes 1 sql sql-server

我已经看到有些人使用EXISTS (SELECT 1 FROM ...)而不是EXISTS (SELECT id FROM ...)优化 - 而不是查找并返回值,SQL Server可以简单地返回它给出的文字.

SELECT(1)总是快?从表中选择一个值是否需要选择文字会避免的工作?

jal*_*ert 8

在SQL Server中,无论是使用SELECT 1还是SELECT *内部,它都没有区别EXISTS.您实际上并没有返回行的内容,而是由WHERE子句确定的集合不是空的.尝试并排运行查询SET STATISTICS IO ON,您可以证明方法是等效的.我个人更喜欢SELECT *EXISTS.


Mat*_*ish 6

为了谷歌的缘故,我将使用与此相同的答案更新此问题(子查询使用存在1或存在*),因为(当前)不正确的答案被标记为已接受.注意,SQL标准实际上说通过*的EXISTS与常量相同.

不,这已经被覆盖了无数次.SQL Server是智能的,并且知道它正用于EXISTS,并将NO DATA返回给系统.

Quoth Microsoft:http://technet.microsoft.com/en-us/library/ms189259.aspx?ppud = 4

EXISTS引入的子查询的选择列表几乎总是由星号(*)组成.没有理由列出列名,因为您只是测试是否存在满足子查询中指定的条件的行.

还有,不相信我?尝试运行以下内容:

SELECT whatever
  FROM yourtable
 WHERE EXISTS( SELECT 1/0
                 FROM someothertable 
                WHERE a_valid_clause )
Run Code Online (Sandbox Code Playgroud)

如果它实际上正在使用SELECT列表执行某些操作,则会抛出一个div为零的错误.它没有.

编辑:注意,SQL标准实际上谈到了这一点.

ANSI SQL 1992标准,第191页http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt

     3) Case:

        a) If the <select list> "*" is simply contained in a <subquery> that is immediately contained in an <exists predicate>, then the <select list> is equivalent to a <value expression> that is an arbitrary <literal>.
Run Code Online (Sandbox Code Playgroud)