我有一些 .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/