*EXISTS 子句性能:SELECT 1 与 SELECT 的比较**
在 SQL 中,EXISTS 子句用于检查子查询中是否存在匹配指定条件的行。长期以来,开发人员在 EXISTS 查询中同时使用 SELECT 1 和 SELECT *,这引发了一个问题:哪种方法更高效?
SQL Server 优化
根据微软的说法,SQL Server 足够智能,能够识别 EXISTS 的使用,而不管子查询的 SELECT 列表是什么。它不会向系统返回任何数据,因此 SELECT * 和 SELECT 1 子句在性能方面是等效的。
根据微软的文档:
"由 EXISTS 引入的子查询的 select 列表几乎总是包含星号 ()。没有理由列出列名,因为您只是在测试是否存在满足子查询中指定条件的行。*"
自我验证
为了证实这种行为,您可以运行以下查询:
<code class="language-sql">SELECT whatever FROM yourtable WHERE EXISTS(SELECT 1/0 FROM someothertable WHERE a_valid_clause)</code>
如果 SELECT 列表确实参与其中,则此查询将触发除零错误。但是,由于 SQL Server 理解 EXISTS 子句的上下文,因此它不会对 SELECT 列表执行任何计算。
SQL 标准
ANSI SQL 1992 标准进一步阐明了这种行为,指出在 EXISTS 谓词的上下文中,select 列表 "*" 等效于任意字面值。
结论
在 SQL Server 中,在 EXISTS 子句中选择 SELECT 1 和 SELECT * 不会影响性能。这两种方法都会产生相同的结果,因为优化器会识别它们的用途并且不会向系统返回任何数据。
以上是EXISTS 子句优化:SELECT 1 与 SELECT * — 这重要吗?的详细内容。更多信息请关注PHP中文网其他相关文章!