2009-12-08 2 views
2

У меня довольно простая команда, которую я иногда работать:Быстрая, Atomic Таблица Замена

BEGIN TRAN T1; 
truncate table mytable 
insert into mytable select name from myview 
COMMIT TRAN T1; 

Эта команда имеет два некрасивых побочных эффектов: во-первых, выберите запросов на MyTable часто тайм-аут. Во-вторых, выбор запросов на mytable иногда не возвращает результатов. Меня не волнует, вернет ли он результаты предварительной транзакции или результаты после транзакции, но не хочет, чтобы они возвращали что-либо посередине или время ожидания. Одно из решений, о котором я думал и которое почти наверняка поможет, - это сначала скопировать представление в временную таблицу (так как представление немного дороже). Это не полностью решает проблему, но почти наверняка сделает окно достаточно узким, чтобы проблема была проигнорирована. Честно говоря, окно достаточно узкое, чтобы игнорировать его сейчас, но я не люблю игнорировать его. Другим решением, которое является примером безумной надстройки, было бы заменить таблицу двумя таблицами (например, двойным буфером) и вызвать новейшую, правильно заполненную таблицу.

Есть ли более элегантный способ заменить стол на новый?

+0

Какой уровень изоляции транзакций вы используете? – mwigdahl

+0

Я не знаю, как установить его или что я использую. – Brian

ответ

7

Никто не должен ничего видеть посередине. Если они это сделают, значит, вы делаете грязные чтения, и вы заслуживаете каждого плохого результата, который вы получите.

Вы можете использовать ALTER TABLE ... SWITCH PARTITION ... для «переключения» в содержимом другой таблицы (должны иметь идентичную структуру и ограничения). Операция такая же атомная и быстрая, как и она, она просто меняет некоторые указатели на метаданные, поэтому контент «магически» перемещается в таблицу назначения. См. Transferring Data Efficiently by Using Partition Switching. Ни источнику, ни месту назначения не обязательно должны быть явно «партиционированные» таблицы, операция переключения работает на обычных, однораздельных таблицах.

+0

+1 - для переключения разделов. –

Смежные вопросы