Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 检查SQL表中是否存在记录的最快方法_Sql Server_Linq - Fatal编程技术网

Sql server 检查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'

我的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'
    )
在上面的查询中,我得到了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子句。感谢您的回复。我明白了。谢谢你的解决方案。我得到了答案。