ВСТАВИТЬ ОТКРЫТИЕ - PullRequest
2 голосов
/ 08 мая 2019

Я пытаюсь выполнить и вставить запрос на связанный сервер в SQL Server.

Для этого я использую оператор INSERT INTO OPENQUERY.

Связанный сервер - это Apache HIVE, использующий поставщик ODBC Cloudera.

Операция вставки занимает около 1 минуты в моей настройке при выполнении из клиента HIVE.

Однако SQL INSERT всегда отключается через 30 секунд.

Я установил для параметра Query Timeout значение 0, но, похоже, он не влияет на оператор INSERT, однако он хорошо работает для операторов SELECT, занимающих более длительное время.

Это известное ограничение? Есть ли способ изменить время ожидания для оператора вставки при использовании OPENQUERY?

EDIT

Я бы хотел уточнить настройки, с которыми я работаю.

----------                     ----------------------    ---------------
| MS SQL | => Linked Server => | Hive ODBC Provider | => | Hive Server |
----------                     ----------------------    ---------------

В Hive у меня есть таблица calc_result, в которой я хотел бы периодически сохранять результаты вычислений с сервера SQL. Например, я пытаюсь вставить, используя такой запрос.

insert openquery(HIVE, 'select timestamp timestamp , tag tag, value value from calc_result')
values('2019-04-22 11:50:41', 'test',2.0)

Операция вставки правильно перехватывается сервером HIVE, и начинается задание MapReduce. Однако задание будет прекращено через 30 секунд из-за тайм-аута.

SQL-сервер покажет следующее сообщение об ошибке.

Поставщик OLE DB "MSDASQL" для связанного сервера "HIVE" вернул сообщение "[Cloudera] [Hardy] (72) Истекло время ожидания выполнения запроса.".

Однако SELECT OPENQUERY работает нормально и будет следовать настройкам Query Timeout связанного сервера (в данном случае это значение равно 0).

Ответы [ 3 ]

1 голос
/ 11 мая 2019

Редактировать это совершенно другой вариант использования, чем я себе представлял.В этом случае не должно быть никакой разницы в выборе / вставке.

Поскольку вы настроили время ожидания связанного сервера, в свойствах связанного сервера есть второе место, где вы можете проверить параметр Время ожидания команды в строке поставщика:

enter image description here

Другой вариант, который приходит мне в голову, это тайм-аут на уровне экземпляра.По умолчанию установлен на 600 секунд (10 минут), что намного выше ваших 30 секунд.Тем не менее, вы все равно можете попробовать его, чтобы увидеть, есть ли какое-либо влияние.

Для бесконечного ожидания:

sp_configure 'show advanced options',1
go
reconfigure
go
sp_configure 'remote query timeout (s)',0
go
reconfigure
go
0 голосов
/ 20 мая 2019

Хотя я не нашел способа изменить OPENQUERY время ожидания с 30 секунд, я обнаружил, что использование EXEC AT Связанного сервера для нормальной работы для запросов INSERT при соблюдении настроек времени ожидания.

Я случайнонаткнулся на решение в этом блоге 2009 года .Базы данных могут не быть моей сильной стороной, но я чувствую, что документация по SQL Server может быть улучшена.Простая страница со списком возможных способов взаимодействия со связанным сервером могла бы сэкономить мне много попыток.

0 голосов
/ 11 мая 2019

Я бы попробовал использовать временную таблицу SELECT INTO, а затем материализовать ее с помощью обычной INSERT INTO:

SELECT c1, c2
INTO #temp_tab
FROM OPENQUERY(mylinkedserver, 'SELECT c1, c2 FROM remote_table');

INSERT INTO normal_table(col1, col2)
SELECT c1, c2
FROM #temp_tab;

EDIT:

Вы можете попробовать обернуть его транзакцией и удалить псевдонимы:

BEGIN TRAN;
insert openquery(HIVE, 'select timestamp, tag, value from calc_result')
values('2019-04-22 11:50:41', 'test',2.0);
COMMIT;

При необходимости настроить DTC: Как включить распределенные транзакции для связанного сервера?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...