我的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会表现更好吗?
答案 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