我有两台SQL Server,一台用于生产,一台用于测试。考虑以下设置:
Prod: Test:
db_1 db_1
db_2 db_2
现在db_1
中有一个存储过程可以访问db_2
:
spFoo:
...
select * from db_2.dbo.bar
...
在测试环境中,相同的过程还需要访问db_2
,但不仅如此,它还需要访问位于Prod而不是Test上的db_2
。因此,在测试过程中,程序必须如下所示:
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
前缀而影响性能?
答案 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.servers
从id=0
中隐式添加表。但这只是我的猜测。