sql - 跨服务器同步数据库表的最佳方式

标签 sql database tsql

我开发了一个跨 sql-server 同步数据的工具。该工具负责将源表中的记录更新或插入到目标表中。应该对目标表中不存在的行执行插入。应该对目标表中已存在的行执行更新。

之前我在代码中进行了表之间的比较,但事实证明这非常慢(至少我的编码方式是这样)。现在,我使用 one sql 查询进行插入,使用 one 进行更新。性能更好,但仍然很慢。下面是我的 SQL 命令。你看到有什么可以优化的吗?例如。我可以使用外部联接以外的更快的东西吗?

更新命令:

UPDATE [Respondent]
SET [SampleGroupID] = ls.[SampleGroupID], [RespondentStatusTypeID] = ls.[RespondentStatusTypeID], [PilotTest] = ls.[PilotTest], [Username] = ls.[Username], [Password] = ls.[Password], [ImportUniqueID] = ls.[ImportUniqueID], [WORespID] = ls.[WORespID], [DateLastAnswered] = ls.[DateLastAnswered], [DateCreated] = ls.[DateCreated], [Email] = ls.[Email], [Phone] = ls.[Phone], [Name] = ls.[Name], [JobTitle] = ls.[JobTitle], [PhoneDirect] = ls.[PhoneDirect], [PhoneMobile] = ls.[PhoneMobile], [Fax] = ls.[Fax], [CompanyName] = ls.[CompanyName], [Department] = ls.[Department], [Address] = ls.[Address], [Address1] = ls.[Address1], [Address2] = ls.[Address2], [Zipcode] = ls.[Zipcode], [City] = ls.[City], [District] = ls.[District], [CountryCode] = ls.[CountryCode], [Country] = ls.[Country], [Info1] = ls.[Info1], [Info2] = ls.[Info2], [Info3] = ls.[Info3], [Info4] = ls.[Info4], [Info5] = ls.[Info5], [Info6] = ls.[Info6], [Info7] = ls.[Info7], [Info8] = ls.[Info8], [Info9] = ls.[Info9], [Info10] = ls.[Info10], [Info11] = ls.[Info11], [Info12] = ls.[Info12], [Info13] = ls.[Info13], [Info14] = ls.[Info14], [Info15] = ls.[Info15], [Info16] = ls.[Info16], [Info17] = ls.[Info17], [Info18] = ls.[Info18], [Info19] = ls.[Info19], [Info20] = ls.[Info20], [PublicIdentifier] = ls.[PublicIdentifier], [LockedByUser] = ls.[LockedByUser], [DialAttempts] = ls.[DialAttempts], [DialProbationExpires] = ls.[DialProbationExpires], [CATIScreenOptionID] = ls.[CATIScreenOptionID], [CATIPersonID] = ls.[CATIPersonID], [TotalDuration] = ls.[TotalDuration], [IsExternal] = ls.[IsExternal]
FROM [LinkedServerName].[DBName].[dbo].[Respondent] ls LEFT OUTER JOIN [Respondent] adm
ON ls.RespondentID = adm.RespondentID AND ls.SurveyID = adm.SurveyID
WHERE ls.SurveyID = 1061 AND adm.RespondentID IS NOT NULL

插入命令:

INSERT INTO [Respondent] ([RespondentID], [SurveyID], [SampleGroupID], [RespondentStatusTypeID], [PilotTest], [Username], [Password], [ImportUniqueID], [WORespID], [DateLastAnswered], [DateCreated], [Email], [Phone], [Name], [JobTitle], [PhoneDirect], [PhoneMobile], [Fax], [CompanyName], [Department], [Address], [Address1], [Address2], [Zipcode], [City], [District], [CountryCode], [Country], [Info1], [Info2], [Info3], [Info4], [Info5], [Info6], [Info7], [Info8], [Info9], [Info10], [Info11], [Info12], [Info13], [Info14], [Info15], [Info16], [Info17], [Info18], [Info19], [Info20], [PublicIdentifier], [LockedByUser], [DialAttempts], [DialProbationExpires], [CATIScreenOptionID], [CATIPersonID], [TotalDuration], [IsExternal])
SELECT ls.[RespondentID], ls.[SurveyID], ls.[SampleGroupID], ls.[RespondentStatusTypeID], ls.[PilotTest], ls.[Username], ls.[Password], ls.[ImportUniqueID], ls.[WORespID], ls.[DateLastAnswered], ls.[DateCreated], ls.[Email], ls.[Phone], ls.[Name], ls.[JobTitle], ls.[PhoneDirect], ls.[PhoneMobile], ls.[Fax], ls.[CompanyName], ls.[Department], ls.[Address], ls.[Address1], ls.[Address2], ls.[Zipcode], ls.[City], ls.[District], ls.[CountryCode], ls.[Country], ls.[Info1], ls.[Info2], ls.[Info3], ls.[Info4], ls.[Info5], ls.[Info6], ls.[Info7], ls.[Info8], ls.[Info9], ls.[Info10], ls.[Info11], ls.[Info12], ls.[Info13], ls.[Info14], ls.[Info15], ls.[Info16], ls.[Info17], ls.[Info18], ls.[Info19], ls.[Info20], ls.[PublicIdentifier], ls.[LockedByUser], ls.[DialAttempts], ls.[DialProbationExpires], ls.[CATIScreenOptionID], ls.[CATIPersonID], ls.[TotalDuration], ls.[IsExternal]
FROM [LinkedServerName].[DBName].[dbo].[Respondent] ls LEFT OUTER JOIN [Respondent] adm
ON ls.RespondentID = adm.RespondentID AND ls.SurveyID = adm.SurveyID
WHERE ls.SurveyID = 1061
AND adm.RespondentID IS NULL

最佳答案

我之前尝试过自己构建这样一个系统,但结果却是一场灾难。我用来在数据库之间同步数据的是一个名为 SQL data Compare, 的 Redgate 工具。

关于sql - 跨服务器同步数据库表的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4967144/

相关文章:

c# - 比 nHibernate 更轻的东西

c# - 从 SQL 读取数百万条记录,处理它们并将它们插入到另一个 SQL 服务器

sql-server - 插入与选择

mysql - SQL求和计算困惑

sql - 如何将数组聚合并加入或联合到平面 Json 对象中?

mysql - INNER JOIN 与 SELECT STATEMENT ISSUE

sql - 将商或更长的表达式分配给局部(实数)变量 T SQL

mysql - 这个mysql/myisam表可以优化吗?

mysql - 网络消息系统的数据库结构

asp.net - 数据库在 Visual Studio 2008 中生成失败