【问题标题】:Difference between if exists (select 1 from) and (select 0 from)if exists (select 1 from) 和 (select 0 from) 之间的区别
【发布时间】:2015-01-22 01:03:31
【问题描述】:

select 1 from 和 select 0 from 或 select any integer from 有什么区别吗?

我知道 select * from 是一项昂贵的操作。

但是,select 1 from 不同于 select 0 from 和 or select 29 from?

在仅检查表/存储过程是否存在的上下文中,如果存在,则删除它并重新创建(在这些情况下)

【问题讨论】:

  • 不应该,因为结果会被忽略(我通常使用SELECT null),但您必须尝试两种方式并进行比较才能确定。
  • @DStanley:谢谢,我不知道如何找到性能差异,另外,我从没想过使用 null,好主意,我会使用 null 并检查:) :)
  • 运行两个不同的查询并比较它所花费的时间(手动或查看客户端统计信息是 SSMS)
  • 比较查询计划 (CTRL-L)。无论您在选择中输入什么,它们都是相同的。与仅比较所用时间相比,这消除了任何瞬时 I/O 或缓存影响。
  • @DStanley:谢谢,我使用了客户端统计信息,我可以看到使用 * 花费的时间更少,虽然使用 1 和 0 等只是相差 1。但是,使用 null 需要更高一点,但是差别不大:)

标签: sql sql-server sql-server-2008


【解决方案1】:

你的表现会是一样的。当您使用存在时,SQL Server 不会评估语句的 SELECT 部分中的任何内容。它只是解析为布尔值。这可以通过 1 除以 0 来证明。通常这会引发错误,但在 EXISTS 中,它运行时不会出错。

关于您的具体用途,EXISTS 检查的费用几乎为零。如果您遇到性能问题,这不是脚本的 EXISTS 部分。

例子:

IF EXISTS(SELECT 1/0 FROM <TABLE> WHERE 1=1) BEGIN SELECT 'In the exists' END

【讨论】:

  • Ghost,非常感谢,你能告诉我 1/0,我试图这样做,但是它给了我错误,也许我的语法是错误的。
  • 我真的很想知道为什么我的一些团队领导不了解并让我在不了解概念的情况下使用 SELECT 1 而不是 SELECT * 来谈论性能问题。
  • @Deevinee 就您的团队领导而言,从表中选择获取数据时选择 * 是一种不好的做法。如果您选择 * 到您的应用程序,则您通过网络带回的数据超出了所需的数据(这可能很昂贵)。有趣的是,如果您需要所有列,命名列并不会更昂贵(在我的测试中)。所以,有时我会填充一个临时表或表变量,然后简单地选择 *;如果需要全部列,为什么要写出所有列?
  • Ghost,首先非常感谢,我可以看到总执行时间没有区别,当我使用 1 或 0 或 1/0 时,但是,我发现使用 * 使用更少的时间,只是虽然相差 1。如果我需要所有列,恐怕我不明白使用列名和 * 之间的区别。但是,我会尝试从客户端统计信息中了解与总执行时间的区别。第三,我唯一的疑问是理解你最后陈述临时表或表变量的陈述
  • @Deevinee 在一些存储过程中,我创建了一个临时表或表变量。当规则开始变得非常复杂时,我使用它来存储我想要发回的数据。加载比需要更多的数据并开始在临时表或表变量中减少它比编写过于复杂的查询变得更加透明。如果临时表/变量包含我想要的所有字段,我通常不会费心指定列。
猜你喜欢
  • 1970-01-01
  • 2019-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-29
  • 2020-08-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多