.net - "SELECT TOP 1 1"VS "IF EXISTS(SELECT 1"

标签 .net sql-server

我有一些 .NET 代码,可以以中等高的时间间隔检查 SQL 记录是否存在。我希望这张支票尽可能“便宜”。

我想知道两个查询的特征:

IF EXISTS(SELECT 1
          FROM   BigTable
          WHERE  SomeColumn = 200)
  SELECT 1 AS FOUND
ELSE
  SELECT 0 AS FOUND

VS

SELECT TOP 1 1
FROM   BigTable
WHERE  SomeColumn = 200 

它们都产生相似的执行计划。但 SELECT TOP 1 1 似乎执行得更快:需要解析的查询更少,并且当未找到记录时,它会向管道发送更少的查询。我还假设它在客户端运行得更快,因为我只需要检查记录计数,而不是整理 IF EXISTS 的返回值。

大多数性能优势可以忽略不计。但如果两者始终返回相同的结果,那么为什么不选择稍微更快的方法呢?

“SELECT TOP 1 1”是检查 .NET 中记录是否存在的最佳方法吗?

(我们使用 .NET 3.5,我试图避免使用 LINQ,因为它在应用程序的其他地方没有使用。我们还有一些正在迁移/重写的遗留 VB6 应用程序,因此它们可能也需要执行它.)

编辑: 只是设计上有更多细节。该记录是一个“标题”。还有另一个表具有子记录,当找到此 header 时将读取/解析这些子记录。没有记录是一件好事:没有工作可做。

EDIT2:缺少满足条件的记录的情况会更频繁地发生。他们零星地涌来。

最佳答案

我建议使用IF EXISTS(SELECT * ...),除非这实际上会导致性能问题。它以比替代方案更好理解的方式表达了查询的意图

我会避免使用 COUNT(*) (如当前答案中所示),除非您实际上需要表中的行数。

如果您想要从结果中检查行数的“效率”,我可能会选择:

select 1 where exists(select * from BigTable where SomeColumn=200)

这会产生与第二个查询相同的结果集(0 或 1 行)

关于.net - "SELECT TOP 1 1"VS "IF EXISTS(SELECT 1",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11009022/

相关文章:

.net - 当我使用实时应用保存对 web.config 的更改时会发生什么?

c# - 具有 IsBackground 的 Lambda 线程

c# - 以标准方式访问没有值(value)的短信 Web 服务中的子 XML 值

.net - 如何为当前用户注册一个类型库?

sql-server - 从 IIS 到 SQL 服务器的 Kerberos 双跳委派(使用 django)

sql-server - 如何 LTRIM/RTRIM 特定字符?

SQL Server : query to get the data between two values from same columns and calculate time difference

.net - 对具有区域的ASP.NET MVC 2路由进行单元测试在AreaRegistration.RegisterAllAreas()上解决

sql-server - SQL - SUM-CASE-除以零错误

java - 我在连接 sql server 时遇到异常