Я столкнулся со странной проблемой при использовании 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#) в свои журналы и решил выполнить запрос в Query Analyzer непосредственно на сервере базы данных. К моему большому удивлению, запрос выполнился правильно менее чем за 10 секунд.
Поэтому я изолировал выполнение SQL в простой тестовой программе и наблюдал одинаковое время ожидания запроса как на сервере, на котором изначально выполнялось это решение, так и при его локальном запуске на сервере базы данных. Также я попытался создать хранимую процедуру и выполнить ее из программы, но это также истекло. Запуск его в Query Analyzer работает нормально менее чем за несколько секунд.
Кажется, проблема возникает только тогда, когда я выполняю этот запрос из программы C#. Кто-нибудь видел такое поведение раньше и нашел для него решение?
ОБНОВЛЕНИЕ: теперь я использовал SQL Profiler на сервере. Очевидная разница заключается в том, что при выполнении запроса из программы .NET он отображается в журнале как «exec sp_executesql N'INSERT INTO...'», но при выполнении из Query Analyzer он отображается в журнале как обычный запрос. .
Далее я попытался подключить SQL Query Analyzer, используя того же пользователя SQL, что и программа, и это вызвало проблему и в Query Analyzer. Таким образом, проблема возникает только при подключении через TCP/IP с использованием пользователя sql.