Я перетаскиваю биты данных из одной базы данных 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;