SQL Server:选择文字值是否比选择字段更快?

时间:2020-03-06 14:24:03  来源:igfitidea点击:

我已经看到有人使用EXISTS(SELECT 1 FROM ...)而不是EXISTS(SELECT id FROM ...)作为优化-SQL Server可以直接返回它的字面意思。

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

解决方案

是的,因为当我们选择文字时,它不需要从磁盘(甚至从缓存)中读取。

在existant子句中选择什么都没有关系。大多数人会选择*,然后sql server会自动选择最佳索引

当我们使用SELECT 1时,我们会清楚地显示(向以后阅读代码的人)我们正在测试记录是否存在。即使没有性能提升(这将在后面讨论),代码可读性和可维护性也会有所提高。

选择1应该更好地在示例中使用。 Select *获取运行时之前与对象相关联的所有元数据,这会在查询完成时增加开销。虽然在执行计划中运行两种类型的查询时可能看不到差异。

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

正如有人指出,sql server忽略EXISTS中的列选择列表,所以没关系。我个人倾向于使用"SELECT null ..."来表示完全不使用该值。

为了Google的缘故,我将使用与该问题相同的答案(使用Exists 1或者Exists 的子查询)来更新此问题,因为(当前)错误答案被标记为已接受。注意,SQL标准实际上说通过的EXISTS与常量相同。

否。这已经涵盖了数十亿次。 SQL Server很聪明,并且知道它已用于EXISTS,并且不向系统返回任何数据。

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

The select list of a subquery
  introduced by EXISTS almost always
  consists of an asterisk (*). There is
  no reason to list column names because
  you are just testing whether rows that
  meet the conditions specified in the
  subquery exist.

还有,不相信我吗?尝试运行以下命令:

SELECT whatever
  FROM yourtable
 WHERE EXISTS( SELECT 1/0
                 FROM someothertable 
                WHERE a_valid_clause )

如果它实际上在用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>.

如果我们看一下执行计划

select COUNT(1) from master..spt_values

并查看流聚合,我们将看到它计算

Scalar Operator(Count(*))

因此,实际上将" 1"转换为" *"

但是,我在" Inside SQL Server"系列丛书中的某处读到,*可能会导致检查列权限的开销非常小。不幸的是,我记得这本书没有比这更详细。