我有两个数据库坐在不同的物理服务器上并链接。我需要将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'
您可能想知道几件事:
这是我现在可以给予的全部。任何建议表示赞赏。它不必使用函数。
提前致谢。 Regards.Oz。
答案 0 :(得分:1)
以下是一些可以尝试或考虑的事项:
您是否检查过查询是否使用了最佳可用索引?您可以尝试通过查询分析器运行查询,看看是否有任何可以添加的索引来提高性能。
您运行的是哪个版本的SQL Server?根据版本的不同,您可以将表从一台服务器复制到另一台服务器,以降低在网络上运行查询的成本。
我注意到有几个连接是跨越另一个服务器的 - 你是否可以将所有这些连接合并到一个使用索引优化的视图中 - 可能会减少网络流量。
尝试将您的功能放在另一台服务器上并从第一台服务器调用它,看看是否有任何性能提升。
答案 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。