我使用的是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。
答案 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