EXEC (запрос) AT связанный сервер с базой данных Oracle - PullRequest
4 голосов
/ 27 февраля 2009

Я использую Microsoft SQL Server 2005. Мне нужно синхронизировать данные между сервером SQL и базой данных Oracle. Первое, что мне нужно, это выяснить, соответствует ли количество данных на стороне Oracle определенным фильтрам (здесь я использую ID в качестве простого примера).

SELECT COUNT(*) FROM oracleServer..owner.table1 WHERE id = @id;

Проблема, с которой я столкнулся, состоит в том, что таблица на разлинованном сервере или Oracle очень велика с 4M строк данных. Приведенный выше запрос занял около 2 минут, чтобы вернуть данные. Этот код - просто часть. На самом деле мой SP имеет несколько других запросов для обновления, вставки данных с сервера с подкладкой на мой сервер SQL. SP работал часами или более 10 часов, чтобы работать с большой базой данных Oracle. Поэтому T-SQL с разлинованным сервером мне не подходит.

Недавно я обнаружил OPENQUERY и EXEC (...) AT linedServer. OPENQUERY () очень быстро. Потребовалось примерно 0 раз, чтобы получить тот же результат. Однако он не поддерживает запрос переменных или выражения. Запрос должен быть литеральной константной строкой.

EXEC () аналогично для сквозного запроса к Oracle. Это также быстро. Например:

EXEC ('SELECT COUNT(*) FROM owner.table1 WHERE id = ' + CAST(@id AS VARCHAR))
  AT oracleServer

Проблема в том, как передать результат COUNT (*) обратно. Я пытался гуглить примеры в Интернете и MSDN. Все, что я могу найти, это примеры SQL или ExpressSQL linedServer, такие как:

EXEC ('SELECT ? = COUNT(*) FROM ...', @myCount OUTPUT) AT expressSQL

Этот запрос не работает для Oracle. Похоже, в Oracle, вы можете установить значение в качестве вывода следующим образом:

SELECT COUNT(*) INTO myCount ...

Я пробовал это:

EXEC ('SELECT COUNT(*) INTO ? FROM ...', @myCount OUTPUT) AT oracleServer
EXEC ('SELECT COUNT(*) INTO : FROM ...', @myCount OUTPUT) AT oracleServer
EXEC ('SELECT : = COUNT(*) FROM ...', @myCount OUTPUT) AT oracleServer

Никто из тех, кто работает. Я получил сообщение об ошибке, в котором говорится, что запрос не выполняется на сервере Oracle.

Я мог бы написать проект .Net SQL Server для выполнения этой работы. До этого мне просто интересно, есть ли способ передать значение в качестве выходного параметра, чтобы я поместил коды T-SQL с большей производительностью в мой SP?

Ответы [ 2 ]

3 голосов
/ 27 февраля 2009

Просто быстрое обновление по этому вопросу. Я думаю, что я получил решение. Я нашел это в обсуждении аналогичной проблемы на Dev NewsGroup . Основываясь на информации, я попробовал это:

DECLARE @myCount int;
DECLARE @sql nvarchar(max);
set @sql =
N'BEGIN 
  select count(*) into :myCount from DATAPARC.CTC_MANUAL_DATA; 
END;'
EXEC (@sql, @myCount OUTPUT) AT oracleServer;
PRINT @myCount; -- 3393065 

Wa! Я получил результат через 3 секунды, сравнивая запрос T-SQL непосредственно в Orable DB (+ 2 минуты). Важно использовать «BEGIN» и «END»; обернуть запрос как анонимный блок и не пропустить ";" после КОНЦА

Вам нужен анонимный блок для выходных параметров. Если у вас есть только входные данные или нет параметров, блок вам не нужен и запрос работает нормально.

Наслаждайся этим! Кстати, это быстрое обновление. Если ты не увидишь меня снова, у меня не будет проблем по этому вопросу.

0 голосов
/ 14 декабря 2016

В связанных сервисах самая большая проблема - это производительность (IMHO) [linkedserver]...[dbo.RemoteTable] vs OPENQUERY(linkedserver, 'Select * from dbo.RemoteTable') всегда используйте второй

Теперь ответим на вопрос. OPENQUERY и EXEC() AT намного быстрее. EXEC(Select * from dbo.RemoteTable) AT linkedserver покажет результаты, но повторно использовать невозможно.

Мое простое решение:

SELECT * INTO LocalTable FROM OPENQUERY(linkedserver, 'Select * from dbo.RemoteTable')

OR

INSERT INTO LocalTable SELECT * FROM OPENQUERY(linkedserver, 'Select * from dbo.RemoteTable')

намного ^ 10 быстрее, чем

SELECT * INTO LocalTable FROM [linkedserver]...[dbo.RemoteTable]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...