在SQL Server 2008中将日期作为变量给出时,SELECT Query超时

时间:2014-04-09 15:02:26

标签: sql sql-server date between

我使用的是SQL Server 2008数据库。我在连接到6个不同表的链接服务器上运行view。如果日期是硬编码的,我的查询将在不到一秒的时间内运行。但是,当日期为@start和@stop时,它需要无限的时间。

-- SQL Server 2008
SELECT Date_, ID, Val1, Val2, 
       RowId=Row_number() OVER (PARTITION BY Date_, ID ORDER BY Val1 DESC)

FROM   ANOTHER_SERVER_DATABASE_VIEW AS V (NOLOCK) 

WHERE  V.ID IS NOT NULL AND V.Val2 <> 0 
       AND V.Date_ BETWEEN  '4/7/2014' AND '4/7/2014'

View有大约1.2亿行。但是,查询只返回20k行。它运行时运行速度非常快,如上所示。但是当你包括时,

DECLARE @start AS DATETIME SET @start = '4/7/2014'
DECLARE @stop  AS DATETIME SET @stop  = '4/7/2014'

.......... AND V.Date_ BETWEEN @start AND @stop

查询返回错误:

OLE DB provider "SQLNCLI10" for linked server "VIEW_SERVER" returned message "Query timeout expired".
Msg 7399, Level 16, State 1, Line 16
The OLE DB provider "SQLNCLI10" for linked server "VIEW_SERVER" reported an error.     Execution terminated by the provider because a resource limit was reached.
Msg 7421, Level 16, State 2, Line 16
Cannot fetch the rowset from OLE DB provider "SQLNCLI10" for linked server "VIEW_SERVER". 

由于V.Date_ = @start运行速度非常快,所以非常令人沮丧。知道为什么这种异常行为? VIEW下的6个表在Date_列上具有NonClustered Index。

2 个答案:

答案 0 :(得分:0)

我怀疑SQL Server正在将V.Date_提升为datetime,因为您已将@start@stop声明为datetime个变量。因此,它可能会进行全表扫描。请尝试将它们声明为date

答案 1 :(得分:0)

如果您还没有这样做,请考虑使用openquery()。这可以允许远程服务器的查询优化器更好地分析和优化查询:

http://msdn.microsoft.com/en-us/library/ms188427(v=sql.90).aspx

另见:

&#39;最佳执行者:在SQL Server&#39;中执行链接服务器查询时的分布式查询(四部分)或OPENQUERY http://blogs.msdn.com/b/sqlsakthi/archive/2011/05/09/best-performer-distributed-query-four-part-or-openquery-when-executing-linked-server-queries-in-sql-server.aspx