检查记录的最快方法(如果存在于SQL表中)

时间:2015-05-20 07:14:00

标签: 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'
    )

在上面的查询中,我获得了1年的记录,但是在此时间限制内没有记录。但它需要花费太多时间来回应。如果表中存在特定时间间隔内的数据,还有其他方法可以显示吗?

LINQ会表现更好吗?

2 个答案:

答案 0 :(得分:1)

首先,您应该使用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

答案 1 :(得分:1)

首先为表添加索引:

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