Сократить время простоя таблицы, переименовав старую таблицу, а затем заполнив новую версию? - PullRequest
4 голосов
/ 28 июля 2011

У меня есть несколько постоянных таблиц, которые нужно перестраивать каждую ночь.

Чтобы сохранить эти таблицы «живыми» как можно дольше, а также предложить возможность иметь резервную копию только данных за предыдущий день, другой разработчик смутно предложил выбрать маршрут, аналогичный этому, когдапроисходит ночная сборка:

  1. создать постоянную таблицу (версию сборки; например, tbl_build_Client)

  2. переименовать живую таблицу (tbl_Client получаетпереименовано в tbl_Client_old)

  3. переименовать версию сборки в живую версию (tbl_build_Client переименовывается в tbl_Client)

переименоватьбудут использоваться таблицы sp_rename.
http://msdn.microsoft.com/en-us/library/ms188351.aspx

Видите ли вы более эффективные способы решения этой проблемы или какие-либо серьезные подводные камни в подходе?Заранее спасибо.


Обновление

Попытка выкинуть ответ и рекомендацию gbn об использовании синонимов, будет ли это рациональным подходом, или я получаю некоторыечасть ужасно неправильно?

Три реальных таблицы для «Клиента»:
1. dbo.build_Client
2. dbo.hold_Client
3. dbo.prev_Client

Потому что «Клиент» - это то, какдругие процессы ссылаются на данные «клиента», по умолчанию используется синоним

CREATE SYNONYM         Client  
FOR           dbo.hold_Client

. Затем выполните эти шаги для обновления данных, сохраняя при этом непрерывный доступ.
(1.a.) TRUNCATE dbo.prev_Client (этоимел вчерашние данные)
(1.b.) INSERT INTO dbo.prev_Client записи из dbo.build_Client, поскольку dbo.build_Client еще имел вчерашние данные

(2.a.) TRUNCATE dbo.build_Client
(2.b.) INSERT INTO dbo.build_Client новая сборка данных из нового процесса построения данных
(2.c.) изменить синоним

DROP SYNONYM           Client
CREATE SYNONYM         Client  
FOR          dbo.build_Client

(3.a.) TRUNCATE dbo.hold_Client
(3.b.) INSERT INTO dbo.hold_Client записи из dbo.build_Client
(3.c.) меняют синоним

DROP SYNONYM          Client
CREATE SYNONYM        Client  
FOR          dbo.hold_Client

Ответы [ 4 ]

4 голосов
/ 28 июля 2011

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

  • Иметь 3 таблицы: Client1, Client2, Client3 со всеми индексами, ограничениями и триггерами и т. Д.
  • Использовать синонимы чтобы скрыть реальную таблицу, например, Client, ClientOld, ClientToLoad
  • Чтобы создать новую таблицу, вы усекаете / записываете в «ClientToLoad»
  • Затем вы УДАЛЯЕТЕ и СОЗДАЕТЕ синонимы в транзакции, так
    • Клиент -> что такое ClientToLoad
    • ClientOld -> что такое Клиент
    • ClientToLoad -> что такое ClientOld

Вы можете использовать SELECT base_object_name FROM sys.synonyms WHERE name = 'Client', чтобы определить текущее перенаправление

Это работает во всех выпусках SQL Server: другой способ - «переключение разделов», для которого требуется корпоративная версия

1 голос
/ 28 июля 2011

Некоторые вещи, которые нужно иметь в виду:

  1. Репликация - если вы используете репликацию, я не верю, что вы сможете легко реализовать эту стратегию
  2. Индексы - убедитесь, что все ваши индексы в таблицах перенесены в ваши новые / старые таблицы по мере необходимости
  3. Ведение журнала - я не помню, был ли sp_rename полностью зарегистрирован, поэтому вы можете проверить это на случай, если вам понадобится откат и т. Д.

Это возможные недостатки, которые я могу вспомнить из головы. В противном случае это кажется эффективным способом справиться с ситуацией.

1 голос
/ 28 июля 2011

За исключением пропущенного шага 0. Drop tbl_Client_old if exists решения выглядят хорошо, особенно если вы запускаете его в явной транзакции. Однако нет никаких резервных копий каких-либо предыдущих данных.

Другое решение, без переименований и выпадений, которое я лично предпочел бы:

  1. Копировать все строки из tbl_Client в tbl_Client_old;
  2. Усечение tbl_Client.
  3. (Необязательно) Удалите устаревшие записи из tbl_Client_old.

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

0 голосов
/ 28 июля 2011

если вы используете SQL Server 2008, почему вы не можете использовать горизонтальное разбиение?Все данные содержатся в одной таблице, но новые и старые данные содержатся в отдельных разделах.

...