Предложение WHERE не выполняется удаленно при запросе внешней таблицы Azure SQL - PullRequest
0 голосов
/ 04 июня 2018

Я перетаскиваю биты данных из одной базы данных SQL Azure в другую, используя функцию внешние таблицы .

Как описано в разделе «Повышение производительности», важно убедиться, что предложения WHEREоцениваются на удаленном сервере.Это гарантирует, что будут возвращены только необходимые строки, в отличие от возврата всей удаленной таблицы и ее фильтрации на локальном сервере.

Это прекрасно работает для запроса, подобного:
SELECT column_list FROM remote_table WHERE some_clause

Однако, если я объединю его с локальной вставкой:
INSERT INTO local_table (column_list) SELECT column_list FROM remote_table WHERE some_clause

.. внезапно будет возвращена вся таблица, и вместо этого будет вычислено some_clause локально, что приведет к огромному снижению производительности.
IЯ не могу воспроизвести проблему между двумя локальными экземплярами SQL (по общему признанию, используя связанные серверы вместо внешних таблиц).ГДЕ всегда оценивается удаленно, как и ожидалось.

Почему расхождение?
Есть ли способ подтолкнуть оптимизатор запросов в правильном направлении?

(SELECT INTO на самом деле работает, как и ожидалось, в Azureпоэтому практическим обходным путем представляется временная таблица.)

Обновление:
Проблема воспроизводима только при IDENTITY_INSERT = ON для локальной таблицы и когда локальный идентификатор равенвставляется из удаленной таблицы.

Если предположить, что [Id] является столбцом локальной идентификации, это вызывает проблему:
SET IDENTITY_INSERT local_table ON;
INSERT INTO local_table (Id) SELECT Id FROM remote_table WHERE Id = 1;

Однако, указавИдентификатор вместо вытягивания работает нормально:
INSERT INTO local_table (Id) SELECT 1 FROM remote_table WHERE Id = 1;

...