SQL Server 2005: выберите, что присоединение таблиц с удаленного сервера выполняется слишком медленно - когда я "выбрать мин (столбец)" - PullRequest
3 голосов
/ 24 февраля 2010

Обновление: после некоторых экспериментов кажется, что медленная ситуация - это когда я вызываю «SELECT min (column) FROM theTableValuedFunction ()».

Я буду вызывать локальный сервер ServerLocal и другойудаленный сервер ServerForeign.У меня есть SQL-запрос в табличной функции на ServerLocal, который выглядит следующим образом:

SELECT columns
FROM ServerForeign.database.tableA
JOIN ServerForeign.database.tableB ON columns
JOIN ServerForeign.database.tableC ON columns
JOIN ServerForeign.database.tableD ON columns
JOIN ServerForeign.database.tableE ON columns
JOIN ServerForeign.database.tableF ON columns
WHERE conditions

Итак, вот мои вопросы:

Когда я запускаю это, ServerLocal передает весь запрос к ServerForeignи попросить его выполнить само объединение и вернуть результаты за одну операцию, или он захватывает целые таблицы, бесполезно передавая все только для того, чтобы отфильтровать его / объединить их на ServerLocal?

«Условия WHERE» втабличная функция очень общая;в различных местах, где вызывается табличная функция, она применяется далее, где условия.Есть ли какая-то эффективность, которую можно получить, переместив операторы where в код функции с табличным значением или нет никакой разницы?

Будет ли существенным преимуществом помещение функции с табличным значением в ServerForeign и вызов ее из ServerLocalили я все равно буду терпеть такую ​​же медлительность, просто передавая данные?Если я перевожу табличную функцию в ServerForeign, а ServerLocal применяет предложение WHERE в точке, где она вызывает табличную функцию, то достаточно ли у SQL Server достаточно умного, чтобы передать это предложение WHERE из ServerLocal в ServerForeign и использовать его для уменьшения количествапереданные строки, или он бездумно возвращает все их и отбрасывает строки, которые не совпадают?

По различным внешним причинам я предпочел бы НЕ размещать какой-либо код на ServerForeign.Если есть способ запустить весь код SQL на ServerLocal и при этом эффективно работать с данными из ServerForeign, это было бы предпочтительным.

Ответы [ 3 ]

1 голос
/ 24 февраля 2010

Я обнаружил, что при таких обстоятельствах может быть быстрее кешировать удаленные данные локально во временной таблице, особенно если вы можете отфильтровать их с помощью предложения where при их перетягивании.

1 голос
/ 25 февраля 2010

Я столкнулся с этим сам. Часто удаленные таблицы копируются в локальную базу данных для выполнения запроса. Попробуйте удалить все критерии предложения "where" в удаленных базах данных, и это должно ускориться.

Очевидно, что это не решение, но большинство рекомендует создать SP или представление для удаленной базы данных и вызвать его вместо этого.

Так что в вашем случае, если вы создаете представление, убедитесь, что предложение WHERE находится на удаленном сервере, по крайней мере, для столбцов из удаленных таблиц.

1 голос
/ 24 февраля 2010

если вы создадите план выполнения (Control-L в SQL Server Manager Studio), вы увидите, что именно он отправляет. Шаги будут называться «Удаленный запрос», и если вы наведите на него курсор, он покажет вам отправляемый удаленный запрос.

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