【发布时间】:2011-01-06 22:40:36
【问题描述】:
我在使用 SQL Server 2000 和两个链接服务器时遇到了一个奇怪的问题。两年来,我们的解决方案一直顺利运行,但昨天突然一个查询将数据从一个数据库同步到另一个数据库开始超时。
我连接到生产网络中的服务器,该服务器链接到包含我需要从中获取数据的订单的服务器。
查询包含一些连接,但基本上这总结了所做的事情:
INSERT INTO ProductionDataCache
(column1, column2, ...)
SELECT tab1.column1, tab1.column2, tab2.column1, tab3.column1 ...
FROM linkedserver.database.dbo.Table1 AS tab1
JOIN linkedserver.database.dbo.Table2 AS tab2 ON (...)
JOIN linkedserver.database.dbo.Tabl32 AS tab3 ON (...)
...
WHERE tab1.productionOrderId = @id
ORDER BY ...
显然我第一次尝试解决这个问题是从原来的 5 分钟增加超时限制。但是当我在 30 分钟到达时仍然暂停时,我开始怀疑发生了其他事情。一个查询不会从不到 5 分钟的执行时间变成一夜之间超过 30 分钟的执行时间。
我将 SQL 查询(最初是在 C# 代码中)输出到我的日志中,并决定直接在数据库服务器上执行查询分析器中的查询。令我大吃一惊的是,查询在不到 10 秒的时间内正确执行。
所以我在一个简单的测试程序中隔离了 SQL 执行,并观察到在最初运行此解决方案的服务器上以及在数据库服务器上本地运行它时,相同的查询超时。我也尝试创建一个存储过程并从程序中执行它,但这也会超时。在查询分析器中运行它不到几秒钟就可以正常工作。
似乎只有当我从 C# 程序执行此查询时才会出现问题。有没有人见过这样的行为,并找到了解决方案?
更新: 我现在已经在服务器上使用了 SQL Profiler。明显的区别是,当从 .NET 程序执行查询时,它在日志中显示为“exec sp_executesql N'INSERT INTO ...'”,但从查询分析器执行时,它在日志中作为普通查询出现.
此外,我尝试使用与程序相同的 SQL 用户连接 SQL 查询分析器,这也引发了查询分析器中的问题。所以似乎只有在使用 sql 用户通过 TCP/IP 连接时才会出现问题。
【问题讨论】:
-
您是否确保执行此代码的任何登录都没有被锁定或更改域?此外,这听起来更像是一个安全问题,而不是其他任何问题。程序在什么账户下运行如何?
-
我尝试执行一个简单的 SELECT COUNT(*) 查询,只是为了验证程序实际上正在与数据库服务器通信并且可以从中获得任何结果。这工作得很好。
标签: c# .net sql-server-2000 linked-server