【发布时间】:2012-06-16 01:33:40
【问题描述】:
我有一些 .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 的返回值。
大多数性能优势都可以忽略不计。但如果两者始终返回相同的结果,那么为什么不选择 slightly 更快的方法呢?
“SELECT TOP 1 1”是检查 .NET 中是否存在记录的最佳方式吗?
(我们使用 .NET 3.5,我试图避免使用 LINQ,因为它没有在应用程序的其他地方使用。我们还有一些我们正在迁移/重写的旧版 VB6 应用程序,因此他们可能也需要执行此操作.)
编辑: 只是设计的更多细节。该记录是一个“标题”。当找到此标头时,还有另一个包含子记录的表将被读取/解析。没有记录是好事:没有工作可做。
EDIT2:缺少满足条件的记录会更频繁地发生。它们是零星的。
【问题讨论】:
-
在没有符合条件的行时不起作用。试试
SELECT TOP 1 1 FROM BigTable where 1 = 0 -
这就是重点。我正在检查是否存在满足条件的行。
-
“编辑”之后:为什么要检查记录的存在而不是仅仅尝试获取符合条件的单个记录?如果 fetch (select) 没有返回任何记录,那么您就没有工作要做,而且它不会比只检查此类记录的存在贵多少。如果它确实返回记录,则您已加载标题数据并仅保存了一个数据库查询。
-
这是个好问题。因为我不使用标题数据。我根据标志/状态而不是 ID 获取所有子记录。这是我正在读取的第三方数据库。
-
感谢您的提问,我浏览了很多网站只是为了了解现有代码
select top 1 1,真的,可读性对于维护和阅读您代码的其他人非常重要......跨度>
标签: .net sql-server