TSQL链接服务器全限定名称解析

时间:2018-11-01 15:49:04

标签: sql-server linked-server

我有两台SQL Server,一台用于生产,一台用于测试。考虑以下设置:

Prod:        Test:
db_1         db_1
db_2         db_2

现在db_1中有一个存储过程可以访问db_2

产品db_1中的

spFoo:

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

在测试环境中,相同的过程还需要访问db_2,但不仅如此,它还需要访问位于Prod而不是Test上的db_2。因此,在测试过程中,程序必须如下所示:

测试db_1中的

spFoo:

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

我的问题:

由于两个脚本都希望访问Prod上的数据库,但是只有Test上的版本需要通过为服务器名称加上前缀来限定名称,因此我是否也可以为prod保留前缀,即将prod上的版本更改为此:

产品db_1中的

spFoo:

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

由于在Prod上,名称Prod.db_2.dbo.bar会引用同一台机器上的数据库,所以我的幻想是不会进行适当的名称查找,即SQL会知道Prod与它本身是同一台机器,并且不会。不必采取路由来进行DNS查找和/或身份验证等。

这仅仅是幻想吗?会不会在Prod上为数据库名称加上Prod前缀而影响性能?

2 个答案:

答案 0 :(得分:0)

我认为使用在每个服务器上都有不同定义的同义词会更好。因此,在您的开发数据库上,运行:

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;

答案 1 :(得分:0)

长话短说不会影响性能

我在机器上运行了一个简单的测试。 我创建了表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执行时间:CPU时间= 1501毫秒,经过的时间= 8962毫秒。

第二次查询

  

(受影响的1000000行)

     

SQL Server执行时间:     CPU时间= 1452毫秒,经过的时间= 10128毫秒。

所以区别是: 50ms

因此,如您所见,您可以指定表的完整路径:)

我认为这是因为,当您不指定完整的服务器名称时,SQL Server会使用本地sys.serversid=0中隐式添加表。但这只是我的猜测。