TSQL для связанного сервера полное разрешение имен - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть два сервера SQL, один для производства и один для тестирования. Рассмотрим следующую настройку:

Prod:        Test:
db_1         db_1
db_2         db_2

Теперь в db_1 есть хранимая процедура, которая обращается к db_2:

spFoo в Prod db_1:

...
select * from db_2.dbo.bar
...

В тестовой среде той же самой процедуре также требуется доступ к db_2, но не только к этому, он должен получить доступ к db_2, расположенному в Prod вместо Test. Итак, на тесте процедура должна выглядеть так:

spFoo в тесте db_1:

...
select * from Prod.db_2.dbo.bar
...

Мой вопрос:

Поскольку оба сценария хотят получить доступ к базе данных в Prod, но только в версии в Test необходимо указать имя, добавив префикс имени сервера, можно ли оставить префикс на месте и для prod, т. Е. Изменить версию на prod на эту :

spFoo в Prod db_1:

...
select * from Prod.db_2.dbo.bar
...

Поскольку в Prod имя Prod.db_2.dbo.bar будет ссылаться на базу данных на той же машине, моя фантазия заключается в том, что правильный поиск имени не будет выполняться, т. Е. SQL будет знать, что Prod - это та же машина, что и сама, и не имеет вывести маршрут для поиска DNS и / или аутентификации и т. д.

Или это просто фантазия? Повлияет ли это на производительность в Prod, если префикс имени базы данных будет Prod?

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Короче говоря, это не повлияет на производительность

Я запускаю простой тест на моей машине. Я создал таблицу TMP. Имеет 100 случайных чисел. В первом запросе я явно ссылаюсь на локальный сервер.

select * 
from NTB07.Test.dbo.tmp a, NTB07.Test.dbo.tmp b, NTB07.Test.dbo.tmp c

select * 
from dbo.tmp a, dbo.tmp b, dbo.tmp c

И проверил время выполнения запросов. Для первого запроса

(затронуто 1000000 строк)

Время выполнения SQL Server: время ЦП = 1501 мс, прошедшее время = 8962 мс.

Второй запрос

(затронуто 1000000 строк)

Время выполнения SQL Server: Время ЦП = 1452 мс, прошедшее время = 10128 мс.

Таким образом, разница составляет: 50мс

Итак, как вы видите, вы можете указать полный путь к таблице:)

Я предполагаю, что это потому, что если вы не укажете полное имя сервера, SQL Server неявно добавляет таблицу из sys.servers с id=0, которая является локальной. Но это только мое предположение.

0 голосов
/ 01 ноября 2018

Я думаю, что вам лучше использовать синоним, который имеет разные определения на каждом сервере. Итак, в вашей базе данных dev запустите:

USE db_1;
CREATE SYNONYM dbo.bar_syn FOR Prod.db_2.dbo.bar;

И в вашей базе данных prod запустите:

USE db_1;
CREATE SYNONYM dbo.bar_syn FOR db_2.dbo.bar;

Тогда, независимо от того, на каком сервере вы находитесь, следующий код будет возвращать один и тот же результат:

USE db_1;
SELECT *
FROM dbo.bar_syn;
...