我想编写一个简单返回1或0的查询,具体取决于是否有结果.
我想用这个
IF EXISTS(
select * from myTable
where id=7 and rowInsertDate BETWEEN '01/01/2009' AND GETDATE()
)
SELECT 1
ELSE
SELECT 0
Run Code Online (Sandbox Code Playgroud)
这是一般的前提.
最终的结果实际上是一个更复杂的查询,采用一对多的参数,并使用sp_executesql构建和执行字符串
我的问题是让'计数'返回376986并计算需要4秒.使用IF EXISTS会在找到满足条件的1行时立即停止.
我决定使用IF EXISTS或只查询@@ ROWCOUNT并查看它是否大于零.
我确实尝试了一些测试,并且几乎都以相同的速度运行,但是在2年的时间里,有很多数据可能使用IF EXISTS是否会提高性能?
谢谢
Nat*_*ger 11
你有id和日期的索引吗?
也许你只想要:
select top 1 1 from myTable where id=7 and rowInsertDate > '01/01/2009'
Run Code Online (Sandbox Code Playgroud)
注意:如果数据存在,则返回1,否则返回1.
另一个编辑.如果没有数据,则不会返回值为null的行,而是不返回任何行.在更具象征意义上更像是无效.
Ale*_*ini 10
这是我在项目中可以获得的最快速度:
SELECT CASE WHEN EXISTS (
select top 1 1
from myTable
where id=7
and rowInsertDate BETWEEN '01/01/2009' AND GETDATE()
) THEN 1 ELSE 0 END AS AnyData
Run Code Online (Sandbox Code Playgroud)
IF EXISTS应该更有效率,因为它被优化为在找到第一行时立即停止.这就是我总是会做这种检查,而不是使用COUNT().
为了进行性能比较,只需确保通过在每次测试之前清除数据和执行计划缓存(仅限非生产数据库服务器)来公平地进行测试:
DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS
Run Code Online (Sandbox Code Playgroud)