我将链接服务器定义为我的本地SQL Server中的远程服务器。
我在以下本地和远程服务器的联接中运行查询:
SELECT *
FROM [RemteServer].[RemoteDB].[dbo].[Links]
WHERE Id NOT IN
(
SELECT ExternalId
FROM [dbo].[Links]
)
当我在SQL Server Management Studio上运行此查询时,它会在2分钟内执行,但是当我在连接到本地SQL Server的本地计算机上运行C#程序时,会产生超时错误。
i在C#连接字符串上将connect timeout
设置为600。我也将链接服务器属性上的Connection timeout
和Query timeout
设置为600。
如何防止超时错误?
P.S:SQL Server版本是2008。我使用Visual Studio 2015并在vs。
我的建议是将大部分查询迁移到SQL Server上,并使用存储的过程进行工作。
SQL Server
CREATE PROCEDURE dbo.lsp_GetRemoteLinks
AS
BEGIN
IF OBJECT_ID('tempdb..#RemoteLinks') IS NOT NULL DROP TABLE #RemoteLinks
SELECT *
INTO #RemoteLinks
FROM [RemteServer].[RemoteDB].[dbo].[Links]
SELECT *
FROM #RemoteLinks
WHERE (Id NOT IN (SELECT ExternalId FROM [dbo].[Links] ))
DROP TABLE #RemoteLinks
END
GO
c#
DataTable RemoteLinks = new DataTable();
using (SqlConnection conn = new SqlConnection(strConn)) {
conn.Open();
using (SqlCommand cmd = new SqlCommand("lsp_GetRemoteLinks", conn)) {
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandTimeout = 120;
RemoteLinks.Load(cmd.ExecuteReader());
}
conn.Close();
}
这应该减少您的时间,但是我确实提高了CommandTimeout
值。
如果此数据不需要"实时",我将考虑制作一个永久的本地表格,并使用 sql agent 定期重新填充它,然后您将是能够在表上使用索引以进一步提高效率。
您在此查询上的性能并不理想,因为您本质上试图将链接服务器的每个记录读取到执行查询的本地服务器上。如果您可以通过添加将在远程服务器上执行的WHERE子句来过滤结果,则您的性能将大大提高。
DECLARE @ExtLinks TABLE (Id INT)
INSERT INTO @ExtLinks (Id)
SELECT ID
FROM [RemteServer].[RemoteDB].[dbo].[Links]
--WHERE Princess = 'Zelda'
SELECT * FROM @ExtLinks
WHERE Id NOT IN
(
SELECT ExternalId
FROM [dbo].[Links]
)