Я думаю, что придумываю решение для решения проблемы медлительности, когда пытаюсь передать запрос с сервера SQL 2005 на базу данных Oracle.
Есть три способа сделать это. первый выглядит примерно так:
SELECT COUNT(*) FROM myOracleServer..owner.myTable
WHERE id = 1000 AND Dt = '2009-02-26'
Если таблица на стороне Oracle является большой, например, с 3M строками данных, время выполнения очень велико. Сегодня я попробовал это снова на моем сервере SQL, и это заняло около 2'44 "только для одного запроса (возможно, таблица очень занята в рабочие дни).
Второй метод заключается в использовании OPENQUERY, как я уже говорил в своем вопросе:
SELECT COUNT(*) FROM OPENQUERY(myOracleServer, N'SELECT COUNT(*) FROM
owner.myTable WHERE id = 1000 AND Dt = TO_DATE(''2009-02-26'')');
Это очень быстро. Я запускаю его снова, и время выполнения 00:00:00, потрясающе быстро! Однако проблема этого метода в том, что OPENQUERY НЕ поддерживает переменную как запрос.
На самом деле, я нашел этот метод и был очень взволнован результатом вчера вечером на работе. Я написал блог по этому вопросу прошлой ночью. Сегодня утром, когда я попытался применить это в работе (хранимая процедура), я не смог использовать OPENQUERY, поскольку в моем случае запрос переменной должен быть построен по идентификатору и дате.
Хорошей новостью является то, что я нашел третий путь , отличное решение проблемы:
DECLARE @sql NVARCHAR(MAX);
SET @sql = N'SELECT COUNT(*) FROM owner.myTable WHERE id = ' +
CAST(@id AS VARCHAR) + N' AND Dt = TO_DATE(''' + @dt +
N''', ''yyyy-mm--dd'')');
EXEC (@sql) AT myOracleServer;
Ключевым моментом здесь является использование EXEC с AT для указания удаленного сервера или связанного сервера, и не забудьте использовать () для заключения в скобки переменной @sql. Время выполнения - 00: 00: 00!
Мое болото будет обновлено сегодня вечером.