tsql - 从托管在不同服务器上的不同数据库中连接两个表

时间:2014-11-25 01:50:45

标签: sql-server tsql

我有两个数据库坐在不同的物理服务器上并链接。我需要将DB1.T1与DB2.T2连接并创建一个id。问题是性能。我的大四学生坚持使用一个函数,我在下面创建了它。

IF OBJECT_ID (N'dbo.getXXXId', N'FN') IS NOT NULL
    DROP FUNCTION dbo.getTRId;
GO
CREATE FUNCTION dbo.getTRId (@gcPRef bigint)
RETURNS varchar (100)
WITH EXECUTE AS CALLER --may not be necessary. not sure.
AS
BEGIN

     DECLARE @TRID varchar (100);
     SELECT @TRID =  CONVERT(varchar (12), hu2.PropId) 
              + '_'+ CONVERT(varchar (12), c.WSId)
        FROM [172.29.110.133].DB1.dbo.checks c
        join [172.29.110.133].DB1.[dbo].VHier
                          ON VHier.xx= c.xx
        join [172.29.110.133].DB1.[dbo].rvc
                          ON rvc.xx= VHier.xx
                          AND rvc.yy= VHier.yy
        join [172.29.110.133].DB1.[dbo].HUNIT hu
                          ON c.xx= hu.xx
    WHERE c.CheckId = @gcPRef;

     RETURN (@TRID);
END;
GO

我使用下面的查询使用上面的函数查询每个checkid。

select getTRId(guestCheckPRef), guestCheckid from DB2.Guest_CHECKS GC
where GC.closeBusinessDate = '2014-06-25'

您可能想知道几件事:

  • DB1和DB2托管在不同的物理服务器上。
  • 我不是DBA,所以如果我做错了,请告诉我。
  • 每天创建大约45000条记录。所以这是行数..
  • 我已经尝试过加入它们而不涉及函数。它需要永远。在30秒内,仅返回450条记录。我不能长时间锁定桌子。
  • CONSTRAINT [DB1.PK_CHECK] PRIMARY KEY CLUSTERED
  • CONSTRAINT [DB2.XPKGUEST_CHECKS] PRIMARY KEY NONCLUSTERED
  • 我不知道约束是否在这里发挥作用。 DB2.GUEST_CHECKS.guestCheckPRef在这里甚至不是FK。 guestCheckPRef是DB1.CHECK中的PK。
  • 表现很差。我需要返回 DB2.propid + DB2.wsid + DB1.guestCheckid。

这是我现在可以给予的全部。任何建议表示赞赏。它不必使用函数。

提前致谢。 Regards.Oz。

2 个答案:

答案 0 :(得分:1)

以下是一些可以尝试或考虑的事项:

  1. 您是否检查过查询是否使用了最佳可用索引?您可以尝试通过查询分析器运行查询,看看是否有任何可以添加的索引来提高性能。

  2. 您运行的是哪个版本的SQL Server?根据版本的不同,您可以将表从一台服务器复制到另一台服务器,以降低在网络上运行查询的成本。

  3. 我注意到有几个连接是跨越另一个服务器的 - 你是否可以将所有这些连接合并到一个使用索引优化的视图中 - 可能会减少网络流量。

  4. 尝试将您的功能放在另一台服务器上并从第一台服务器调用它,看看是否有任何性能提升。

答案 1 :(得分:0)

在函数中执行“选择”通常被认为“不是一个好主意”。对于结果集中的每一行,函数中的select将重复一次,这可能是性能差的原因。

的ERP。这应该是评论,而不是答案。要将此转换为正确答案,请将查询重写为连接,而不使用该函数。 (即,获取函数的内容并将其集成到单个连接中。)

您的示例查询应如下所示:

;with getTRID as 
(SELECT CONVERT(varchar (12), hu2.PropId) 
  + '_'+ CONVERT(varchar (12), c.WSId) AS TRID
  FROM [172.29.110.133].DB1.dbo.checks c
join [172.29.110.133].DB1.[dbo].VHier
  ON VHier.xx= c.xx
join [172.29.110.133].DB1.[dbo].rvc
  ON rvc.xx= VHier.xx
  AND rvc.yy= VHier.yy
join [172.29.110.133].DB1.[dbo].HUNIT hu
  ON c.xx= hu.xx)
select getTRId.TRID, guestCheckid from DB2.Guest_CHECKS GC
inner join getTRID ON CheckId = guestCheckPRef
where GC.closeBusinessDate = '2014-06-25'

N.B。我在这里工作,所以请不要因语法错误而烦恼! THX。

史蒂夫G。