Оптимальный способ синхронизации таблиц базы данных между серверами - PullRequest
1 голос
/ 11 февраля 2011

Я разработал инструмент для синхронизации данных между sql-серверами.Инструмент отвечает за обновление или вставку записей из исходной таблицы в таблицу назначения.Вставка должна выполняться в строках, которые не существуют в целевой таблице.Обновление должно быть выполнено для строк, которые уже существуют в целевой таблице.

Ранее я сравнивал таблицы в коде, но это оказалось очень медленным (по крайней мере, так, как я его кодировал),Сейчас я использую один sql запрос для вставки и один для обновления.Производительность лучше, но она все еще медленная.Ниже приведены мои команды 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

Ответы [ 2 ]

1 голос
/ 11 февраля 2011

Если вы используете SQL Server 2008 или более позднюю версию, вам нужно взглянуть на MERGE , чтобы можно было свести его к одному утверждению.

Если это что-то, что происходит регулярно, рассматривали ли вы возможность использования встроенных инструментов, таких как репликация?

1 голос
/ 11 февраля 2011

Я пытался создать такую ​​систему раньше, но это оказалось катастрофой.Для синхронизации данных между базами данных я использую инструмент Redgate, который называется Сравнение данных SQL,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...