首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“选择前11”与“如果存在”(选择1)

“选择前11”与“如果存在”(选择1)
EN

Stack Overflow用户
提问于 2012-06-13 06:00:29
回答 5查看 49.7K关注 0票数 49

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

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

代码语言:javascript
复制
IF EXISTS(SELECT 1
          FROM   BigTable
          WHERE  SomeColumn = 200)
  SELECT 1 AS FOUND
ELSE
  SELECT 0 AS FOUND

VS

代码语言:javascript
复制
SELECT TOP 1 1
FROM   BigTable
WHERE  SomeColumn = 200 

他们都制定了类似的执行计划。但是SELECT TOP 11似乎执行得更快:更少的查询要解析,当找不到记录时,它向管道下发送的更少。我还假设它在客户机上运行得更快,因为我只需要检查记录计数,而不是封送IF存在的返回值。

大多数的性能效益是微不足道的。但是,如果两者一致地返回相同的结果,那么为什么不选择稍微快一点的方法呢?

"SELECT TOP 11“是检查.NET中是否存在记录的最佳方式吗?

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

编辑:只是更多关于设计的细节。这个记录是一个“标题”。另一个表的子记录在找到此标头时将被读取/解析。缺乏记录是一件好事:没有工作可做。

EDIT2:缺少符合条件的记录会更频繁地发生。它们以零星的波浪出现。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-06-13 06:14:54

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

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

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

代码语言:javascript
复制
select 1 where exists(select * from BigTable where SomeColumn=200)

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

票数 40
EN

Stack Overflow用户

发布于 2012-06-13 06:12:21

这是您想要的,而不是IF语句。

代码语言:javascript
复制
  SELECT ISNULL(
     (SELECT TOP 1 1 FROM BigTable where SomeCol = 200), 0);
票数 17
EN

Stack Overflow用户

发布于 2019-02-06 20:21:53

根本没有区别,存在甚至不会评估您的语句的select部分。所以,用你喜欢的那个。

代码语言:javascript
复制
declare @test table (name varchar(20))

-- comment out inserts for testing.
insert into @test (name) values ('bob the builder')
insert into @test (name) values ('bob the builder')

-- for giggles, put 1/0 here. You'll find that divide by zero error.
select 1 from @test

-- notice that you don't receive a divide by zero error.
-- the bit in the select portion is never executed, ever.
if not exists (select 1/0 from @test) select 'Yay!'
if     exists (select 1/0 from @test) select 'Boo!'

实际上,您可以互换地使用这些:

代码语言:javascript
复制
... select * ... 
... select 1 ... 
... select top 1 * ... 
... select top 1 1 ... 
... select 'John Jacob Jingleheimer Schmidt' ... 
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11009022

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档