2011-02-07 4 views
0

У меня есть таблица, где у меня есть около 1,5 миллиона + результаты, которые мне нужно удалить. Раньше я использовал временную таблицу, и это привело к тому, что журнал транзакций увеличился в размере довольно быстро. Проблема в том, что, как только я сделал один результирующий набор, мне нужно перейти на другой, где есть еще 1,5 миллиона + результатов. Производительность этого довольно медленная, и мне интересно, следует ли использовать переменную table, а не писать таблицу в базу данных temp.Временная таблица против переменной таблицы

EDIT

Я использую временную таблицу при выборе начальных 1.5million + записи.

ответ

2

Пошаговый столбец по переменной таблицы по сравнению с темпом таблицы temp, вы, вероятно, лучше доставляете свои удаления в меньшие группы внутри цикла while. Это ваш лучший выбор для поддержания размера журнала транзакций.

что-то вроде:

while (1=1) begin 
    delete top(1000) 
     from YourTable 
     where ... 

    if @@rowcount < 1000 break 
end /* while */ 
+0

Я предполагаю, что мне придется иметь еще один 'delete' в конце цикла while, чтобы очистить остаточные записи? –

+0

Как это работает с 'Сделки'? Я бы положил начало 'transaction' внутри' while'? –

+0

@ Ardman: Я так не думаю. Цикл while выходит, как только удаление удаляет меньше фиксированного размера партии (1000 записей в моем примере), что должно указывать на завершение всех желаемых удалений. Итак, если вы удаляете 1400 строк, цикл выполняется дважды, сначала удаляя 1000 записей, а 400 - следующий. 400 <1000 запускает разрыв. –

1

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

+0

Временная таблица используется, когда я выбираю записи 1.5mil +. Затем я использую таблицу temp для удаления записей. –

+0

@Ardman: У вас должна быть веская причина, по которой вы удаляете из таблицы temp, а не просто удаляете строки напрямую. Зачем? Можете ли вы дать нам обзор вашей логики? –

+0

Извините, я не удаляюсь из временной таблицы. Я использую временную таблицу, чтобы получить список записей. Затем я использую этот список для удаления записей из таблиц. –

0

Переменная таблицы часто не подходит для таких больших ResultSets, будучи более подходящим для небольших количеств. Вероятно, вы обнаружите, что данные таблицы таблицы будут записаны в tempdb в любом случае из-за его размера. Лично я обнаружил, что переменные таблицы намного медленнее временных таблиц при работе с большими наборами результатов. В примере, указанном в конце this article на SQL Server Central, используя 1 миллион строк в таблице каждого раза, запрос с использованием временной таблицы занял менее шестого времени. Лично я обнаружил, что переменные таблицы часто страдают от производительности, когда мне приходится присоединяться к реальным таблицам в запросе.

Если производительность низкая, это может быть, по крайней мере, частично настройки самой базы данных. Установлен ли он автоматически для роста? Какова модель восстановления?

+0

Модель восстановления 'FULL'. Может быть, переход на 'SIMPLE', тогда запуск' DELETE' будет быстрее? –

+0

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

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