Как устранить множественные серверные звонки | MS SQL Сервер - PullRequest
0 голосов
/ 06 января 2020

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

Какой самый простой и выполнимый способ сделать это, чтобы конечное время выполнения SP было быстрее, а также предпочтение решениям, которые не требуют значительных изменений в приложении?

Например:

select * 
from dbo.table1 a 
inner join server2.dbo.table2 b on a.id = b.id

1 Ответ

1 голос
/ 06 января 2020

Кросс-серверные СОЕДИНЕНИЯ могут быть проблематичными c, так как оптимизатор не всегда выбирает наиболее эффективное решение, что может даже привести к тому, что вся удаленная таблица будет перетаскиваться по вашей сети для запроса одной строки.

Репликация - безусловно, лучший вариант, если вы можете это оправдать. Это будет означать, что у вас должен быть первичный ключ в таблице, которую вы хотите реплицировать, что кажется разумным ограничением (ха!), Но может стать проблемой со сторонней системой.

, если удаленная таблица мал, тогда может быть лучше взять временную локальную копию, например SELECT * INTO #temp FROM server2.<database>.dbo.table2;. Затем вы можете изменить свой запрос на что-то вроде этого: select * from dbo.table1 a inner join #temp b on a.id = b.id;. Временная таблица будет помечена для сбора мусора по окончании сеанса, поэтому не нужно убирать за собой.

Если таблица больше, то вы можете сделать то же самое, но также добавить индекс к вашему. временная таблица, например CREATE INDEX ix$temp ON #temp (id);. Обратите внимание, что если вы используете именованный индекс, у вас возникнут проблемы, если вы запустите одну и ту же процедуру дважды одновременно, так как имя индекса не будет уникальным. Это не проблема, если выполнение всегда выполняется последовательно.

Если у вас есть небольшое количество идентификаторов, которые вы хотите включить, тогда OPENQUERY может быть способом к go, например SELECT * FROM OPENQUERY('server2', 'SELECT * FROM table2 WHERE id IN (''1'', ''2'')'); , Преимущество здесь в том, что вы теперь выполняете запрос на удаленном сервере, поэтому более вероятно использовать более эффективный план запроса.

Суть в том, что если вы ожидаете, что сможете присоединиться к удаленному и локальная таблица, тогда у вас всегда будет какой-то уровень неопределенности; даже если запрос работает хорошо в один день, он может внезапно решить выполнить LOT медленнее на следующий день. Небольшие вещи, такие как добавление одной строки данных в удаленную таблицу, могут полностью изменить способ выполнения запроса.

...