Определение наиболее эффективных и безопасных блокировок таблиц при массовом копировании данных - PullRequest
1 голос
/ 21 января 2012

Это будет одна из тех худших из худших ситуаций, когда вы захотите предложить что-то совершенно другое. Не волнуйтесь, я знаю, и, к сожалению, я ничего не могу с этим поделать, поэтому постарайтесь ограничить ваши ответы теми, которые объясняют наименьшее возможное изменение, которое окажет наибольшее влияние.

С учетом сказанного, вот моя ситуация: существует процесс, который реплицирует данные с сервера Sybase (15.5) на SQL Server (2008 R2) каждые 30 минут в рабочее время. На сервере SQL есть связанный сервер с базой данных Sybase, из которой мы копируем таблицы. Вот страшная часть: копирование выполняется путем УДАЛЕНИЯ всех существующих строк и ВСТАВЛЕНИЯ новых из Sybase, таким образом (в рамках хранимой процедуры на SQL-сервере, запускаемой программным обеспечением для планирования предприятий):

-- Table 1
DELETE FROM abc1;
INSERT INTO abc1 (col1, col2, col3)
    SELECT col1, col2, col3 FROM LINKED.SERVER.dbo.abc1;
GO

-- Table 2
DELETE FROM abc2;
INSERT INTO abc2 (col1, col2, col3)
    SELECT col1, col2, col3 FROM LINKED.SERVER.dbo.abc2;
GO

-- ... and so on for hundreds of tables

На копии сервера SQL отсутствуют индексы, первичные ключи, внешние ключи или целостность данных, но мы можем контролировать схемы таблиц; мы не можем, однако, коснуться сервера Sybase. База данных MSSQL - это в основном доступная только для чтения среда для отчетов и поиска. Производительность не критична. Так было в течение многих лет, и поэтому оно живет ...

Если у вас еще не было рвоты, возможно, вы уже подумали о проблеме: время от времени, в течение нескольких секунд, наши приложения и отчеты не могут найти (а иногда и не могут получить доступ) данные в таблицы, в то время как они удаляются и вставляются в.

Я не администратор, поэтому такие вещи, как блокировки таблиц, блокировки блокировки, эксклюзивные блокировки и т. Д., Мне чужды, но я понимаю, что, возможно, они могли бы помочь в этой ситуации. Прочитав статью MSDN о табличных подсказках, мой мозг говорит мне, что я должен что-то делать с транзакциями и блокировками таблиц. Я понятия не имею, что, скажем, будет делать следующее, потому что я также не уверен, как это проверить:

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
GO

-- Table 1
BEGIN TRANSACTION UpdateAbc1
    DELETE FROM abc1 WITH (TABLOCK, HOLDLOCK);
    INSERT INTO abc1 WITH (TABLOCK, HOLDLOCK) (col1, col2, col3)
        SELECT col1, col2, col3 FROM LINKED.SERVER.dbo.abc1;
COMMIT TRANSACTION UpdateAbc1

-- Table 2
BEGIN TRANSACTION UpdateAbc2
    DELETE FROM abc2 WITH (TABLOCK, HOLDLOCK);
    INSERT INTO abc2 WITH (TABLOCK, HOLDLOCK) (col1, col2, col3)
        SELECT col1, col2, col3 FROM LINKED.SERVER.dbo.abc2;
COMMIT TRANSACTION UpdateAbc2

Итак, мои вопросы:

  • Будет ли изменение хранимой процедуры включать транзакции и блокировку разрешать запросы к таблицам, которые собираются изменить, чтобы они продолжались, не возвращаясь пустыми и / или вызывая взаимоблокировки?
  • Если нет, и если бы вы могли что-то изменить (на сервере SQL), что бы это было?

Sybase и Microsoft SQL Server находятся в точке, где возможна нормальная репликация базы данных, и это было рассмотрено, но задача слишком громоздка для нашей группы и нашего бюджета.

1 Ответ

0 голосов
/ 21 января 2012

Идея ... перемешать таблицы так, чтобы запрашиваемая не загружалась.

Вы можете использовать ALTER TABLE .. SWITCH .С помощью SWITCH вы можете перемещать данные между одинаковыми таблицами в файловой группе.Обратите внимание, что таблица назначения должна быть пустой, поэтому она может не соответствовать вашим настройкам.

В этом случае рассмотрите , скрывающую таблицы с синонимами .

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