Sql server 检查SQL表中是否存在记录的最快方法
我的SQL表中有数十万条记录。如果在特定数据之间,如果没有记录,则需要花费大量时间通知我们。目前,我正在使用此查询检查记录是否存在Sql server 检查SQL表中是否存在记录的最快方法,sql-server,linq,Sql Server,Linq,我的SQL表中有数十万条记录。如果在特定数据之间,如果没有记录,则需要花费大量时间通知我们。目前,我正在使用此查询检查记录是否存在 select TOP 1 1 AS getRowCount from MYTable where ID IN ('3','5','2','4','1') AND ( datewithTime >= '2015-01-01 07:00:00' AND datewithTime < '2016-01-01 07:00:00'
select TOP 1 1 AS getRowCount
from MYTable
where ID IN ('3','5','2','4','1')
AND (
datewithTime >= '2015-01-01 07:00:00'
AND datewithTime < '2016-01-01 07:00:00'
)
在上面的查询中,我得到了1年的记录,但在这个时间限制内没有记录。但这需要太多的时间来回应。是否有其他方法可以显示此特定时间间隔的表中是否存在数据
LINQ的性能会更好吗?首先,您应该使用EXISTS语句,而不是选择top 1:
SET @getRowCount = EXISTS(select 1
from MYTable
where ID IN ('3','5','2','4','1')
AND datewithTime >= '2015-01-01 07:00:00'
AND datewithTime < '2016-01-01 07:00:00'
)
其次,您应该检查执行计划,看看是否可以通过添加索引或修改现有索引来提高性能
更新
对不起,我没有对我正在写的东西给予足够的关注。
Exists返回一个布尔值,但sql server没有布尔数据类型,这就是为什么会出现不正确的语法错误
以下是正确的语法:
DECLARE @getRowCount bit = 0
IF EXISTS(select 1
from MYTable
where ID IN ('3','5','2','4','1')
AND datewithTime >= '2015-01-01 07:00:00'
AND datewithTime < '2016-01-01 07:00:00'
) SET @getRowCount = 1
SELECT @getRowCount
首先,向表中添加索引:
ALTER TABLE TableName ADD CONSTRAINT [PK_TableName] PRIMARY KEY CLUSTERED
(
[ID] ASC
)
GO
CREATE NONCLUSTERED INDEX [IX_TableName_datewithTime ] ON TableName
(
datewithTime ASC
)
GO
然后将查询更改为:
if exists(select * from TableName
where ID in ('3','5','2','4','1') and
datewithTime >= '2015-01-01 07:00:00' and
datewithTime < '2016-01-01 07:00:00')
select 1 as DataExists
else
select 0 as DataExists
执行计划是什么,是否添加了索引等?LINQ的性能会更好吗不可以。如果您使用LINQtoSQL,那么无论如何都必须将其转换为SQL。如果您使用LINQ to对象,那么它必须首先检索表中的所有内容,然后开始查找匹配的数据。另外,我相信datewithTime列的数据类型是DateTime我在ID列上使用了创建主键和索引错误出现在关键字“EXISTS”附近的语法错误此解决方案比我以前的解决方案快得多。我的语法需要40秒来完成同样的工作,但这一次甚至不需要一秒钟。感谢这是因为当您选择top 1时,您强制sql server实际选择并可能对数据进行排序,而当您使用exists时,sql server所要做的就是计算where子句。感谢您的回复。我明白了。谢谢你的解决方案。我得到了答案。