我有一些.NET代码,它以适度高的间隔检查是否存在SQL记录.我希望这个检查尽可能"便宜".
我想知道两个查询的特征:
IF EXISTS(SELECT 1
FROM BigTable
WHERE SomeColumn = 200)
SELECT 1 AS FOUND
ELSE
SELECT 0 AS FOUND
Run Code Online (Sandbox Code Playgroud)
VS
SELECT TOP 1 1
FROM BigTable
WHERE SomeColumn = 200
Run Code Online (Sandbox Code Playgroud)
他们都制定了类似的执行计划.但是SELECT TOP 1 1似乎执行得更快:解析查询次数越少,找不到记录时,它就会减少管道传输量.我也假设它在客户端运行得更快,因为我只需要检查记录计数,而不是整理IF EXISTS的返回值.
大多数性能优势可以忽略不计.但如果两者始终返回相同的结果,那么为什么不选择稍快的方法?
"SELECT TOP 1 1"是检查.NET中是否存在记录的最佳方法吗?
(我们使用.NET 3.5,我试图避免LINQ,因为它没有在应用程序的其他地方使用.我们还有一些我们正在迁移/重写的遗留VB6应用程序,所以他们可能也需要执行它.)
编辑:更多关于设计的细节.此记录是"标题".还有另一个表具有子记录,当找到此标头时将对其进行读取/解析.缺乏记录是件好事:没有工作要做.
编辑2:缺乏满足条件的记录将更频繁地发生.它们来自零星的波浪.
Dam*_*ver 36
我建议IF EXISTS(SELECT * ...),除非这实际上导致性能问题.它以比备选更好理解的方式表达查询的意图.
COUNT(*)除非你真的需要表中的行数,否则我会避免(如当前的答案).
如果你想从结果中检查rowcount的"效率",我可能会去:
select 1 where exists(select * from BigTable where SomeColumn=200)
Run Code Online (Sandbox Code Playgroud)
它产生与第二个查询相同的结果集(0或1行)
Pre*_*gha 13
这是你想要的而不是IF语句
SELECT ISNULL(
(SELECT TOP 1 1 FROM BigTable where SomeCol = 200), 0);
Run Code Online (Sandbox Code Playgroud)
根本没有区别,exists 甚至不会评估语句的 select 部分。所以,使用你喜欢的那个。
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!'
Run Code Online (Sandbox Code Playgroud)
事实上,您可以互换使用这些:
... select * ...
... select 1 ...
... select top 1 * ...
... select top 1 1 ...
... select 'John Jacob Jingleheimer Schmidt' ...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
31771 次 |
| 最近记录: |