Использование T-SQL с БД Oracle - PullRequest
0 голосов
/ 26 февраля 2009

Я использую запрос T-SQL непосредственно в окне запросов Microsoft SQL Server Studio для большой базы данных Oracle, и мой SQL-сервер 2005.

Я создал связанный сервер как myOracleServer. Используя следующий запрос T-SQL:

SELECT COUNT(*) FROM myOracleServer..owner.myTable WHERE id = 1000 AND Dt = '2009-02-26'

Чтобы сделать один звонок, требуется больше 1 минуты. Для таблицы небольшого размера это нормально, но myTable на стороне Oracle очень велика с миллионами строк данных.

Что я обнаружил, так это то, что я могу использовать OPENQUERY для выполнения аналогичного вызова с запросом SQL в качестве сквозного. Результат очень быстрый. Время выполнения 00: 00: 02!

SELECT * FROM OPENQUERY(myOracleServer, 'SELECT COUNT(*) FROM owner.myTable WHERE ...');

У меня проблема в том, что запрос не является константной строкой. Я могу изменить значения id и Dt в запросе, что-то вроде:

'SELECT COUNT(*) FROM ownwer.myTable WHERE id = ' + CAST(@id AS VARCHAR)...

OPENQUERY не поддерживает переменную в качестве строки запроса или выражения.

Есть ли какой-нибудь другой способ получить сквозной запрос к Oracle с высокой производительностью?

Ответы [ 3 ]

0 голосов
/ 26 февраля 2009

Вы пытались создать представление на основе этого запроса? Если это сработает, вы сможете использовать представление, как если бы это была локальная таблица.

0 голосов
/ 26 февраля 2009

Я думаю, что придумываю решение для решения проблемы медлительности, когда пытаюсь передать запрос с сервера 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!

Мое болото будет обновлено сегодня вечером.

0 голосов
/ 26 февраля 2009

Попробуйте что-то вроде этого

DECLARE @sql varchar(2000)
SET @sql = SELECT COUNT(*) FROM owner.MyTable WHERE id = " + CAST(@id to varchar(9))
SELECT * FROM OPENQUERY(myOracleServer, @Sql)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...