SQL Server: запрос с использованием синонима на удаленном сервере

#sql-server #indexing #linked-server #synonym

#sql-server #индексирование #связанный сервер #синоним

Вопрос:

Мы только что перенесли нашу среду базы данных с сервера 1 на сервер 2. Мы находимся на SQL Server 2014 (старый и новый серверы).

В предыдущей среде у нас был a DATABASE_1 с a Table_a (в котором есть кластеризованный индекс) и a DATABASE_2 , который содержит synonym_a ссылку на DATABASE_1.dbo.table_a . Запрос с использованием этого синонима ( SELECT with JOIN ) выполнялся нормально (выберите top 10000 за 1 секунду).

Теперь у нас есть один сервер с DATABASE_1 с Table_a , а другой сервер (связанный сервер) с DATABASE_2 с synonym_a . Тот же запрос выполняется очень медленно. Я вижу, что план выполнения отличается в среде 2. Индекс в table_a новой среде не используется.

Мы пытались добавить WITH INDEX , но невозможно указать подсказку индекса для удаленного источника данных. Нам нужен синоним (потому что один и тот же код автоматически развертывается на другом сайте и не может иметь имя сервера / базы данных в коде наших запросов, хранимая процедура). И мы не можем заменить представление хранимой процедурой.

У кого-нибудь есть решение этой проблемы?

Комментарии:

1. Известно, что удаленные запросы выполняются медленно, особенно при выполнении JOIN . Всю удаленную таблицу необходимо извлечь из удаленного экземпляра, а затем записать в tempdb качестве рабочей таблицы, а затем объединить с ней. Однако иногда экземпляр выполняет эту операцию один раз за строку . Часто вам лучше сначала вставить всю удаленную таблицу в локальную временную таблицу, а затем присоединиться к ней вместо удаленной таблицы. Если вы можете, сначала ограничьте количество строк, насколько это возможно, из удаленного экземпляра.

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

3. Но почему индекс Таблицы_a не используется? Есть способ принудительного его использования?

4. Разделение серверов должно было избежать единой точки отказа, поскольку на сервере БД у нас много больших баз данных / приложений, относящихся к основным видам деятельности нашей компании. Сейчас мы попытаемся решить проблемы с этой средой.

5. Вы можете попробовать remote join со связанными серверами — это может помочь, если большая часть «объединения» должна выполняться на удаленном сервере.

Ответ №1:

при использовании сервера ссылок план выполнения не может видеть индекс другого сервера, на который у вас есть ссылка.Поэтому, когда вы используете запрос с помощью сервера join, A отправляет запрос на другой сервер самостоятельно, планируя и игнорируя индекс, кстати, попробуйте использовать этот запрос

 select * from (
    select * from Table_a order by (column that index in server 2)
              )a inner join (
    select * from server2.db.owner.table_b order by column)b
    on a.id=b.fkid