Является ли удаление всех записей в таблице плохой практики в SQL Server?

голоса
6

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

delete from treporttable
insert into treporttable (.... this thing and that thing)
Update treportable set x = x * price where (...etc)  

а затем сообщить пробеги от treporttable

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

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

Может кто-нибудь сказать мне, если есть лучшая практика для этого или, если моя информация о журналах неверен и этот код будет хорошо в сервере SQL.

Задан 19/05/2009 в 12:58
источник пользователем
На других языках...                            


9 ответов

голоса
20

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

Из книг на сайте:

TRUNCATE TABLE является функционально идентичен ВЕИТ без предложения WHERE: как удалить все строки в таблице. Но TRUNCATE TABLE работает быстрее и использует меньше системных и журнала транзакций ресурсов, чем DELETE.

http://msdn.microsoft.com/en-us/library/aa260621(SQL.80).aspx

Ответил 19/05/2009 в 12:59
источник пользователем

голоса
5
delete from sometable

Собирается позволит вам откатить изменения. Так что, если ваша таблица очень большая, то это может вызвать много Useage памяти и времени.

Тем не менее, если у вас нет страха неудачи, то:

truncate sometable

Выполнит почти мгновенно, и с минимальными требованиями к памяти. Там нет отката, хотя.

Ответил 19/05/2009 в 13:02
источник пользователем

голоса
1

Ответ зависит от модели восстановления базы данных. Если вы находитесь в режиме полного восстановления, то у вас есть журналы транзакций, которые могли бы стать очень большим при удалении большого количества данных. Тем не менее, если вы резервное копирование журнала транзакций на регулярной основе, чтобы освободить место, это может не быть проблемой для вас.

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

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

Ответил 19/05/2009 в 13:02
источник пользователем

голоса
0

Я думаю , что ваш пример имеет возможный вопрос параллелизма. Что делать , если несколько процессов с помощью таблицы , в то же время? Если добавить JOB_IDстолбец или что - то подобное , что позволит очистить соответствующие записи в этой таблице без затирания данных используются другим процесс.

Ответил 19/05/2009 в 13:06
источник пользователем

голоса
1

Рассмотрите возможность использования временных таблиц. Их имена начинаются с символа # и они удаляются, когда никто не относится к ним. Пример:

create table #myreport (
    id identity,
    col1,
    ...
)

Временные таблицы сделаны быть выброшены, и это происходит очень эффективно.

Другой вариант заключается в использовании TRUNCATE TABLE вместо DELETE. Усечение не будет расти файл журнала.

Ответил 19/05/2009 в 13:10
источник пользователем

голоса
2

Для Натана FEGER:

Вы можете откатить от TRUNCATE. Посмотреть на себя:

CREATE TABLE dbo.Test (я INT); ГО ВСТАВИТЬ ИГНОРИРУЙТЕ dbo.Test (I) выберите 1; GO НАЧАТЬ TRAN TRUNCATE TABLE dbo.Test; Выберите Я ОТ dbo.Test; ОТКАТА GO SELECT, я ОТ dbo.Test; ИДТИ

я

(0 строк (ы) пострадавших)

я

1

(1 ряд (ы) пострадавших)

Ответил 19/05/2009 в 13:25
источник пользователем

голоса
0

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

Ответил 19/05/2009 в 13:28
источник пользователем

голоса
2

Кроме того, можно удалить таблицу, и воссоздать его ... если нет отношений.

[DROP таблица] утверждение транзакционно безопасным в то время как [TRUNCATE] нет.

Так что все зависит от схемы, в каком направлении вы хотите идти !!

Кроме того, использование SQL Profiler для анализа времени выполнения. Проверьте его и посмотреть, что лучше всего !!

Ответил 19/05/2009 в 14:19
источник пользователем

голоса
0

Есть несколько способов, чтобы справиться с этим. Сначала вы можете переместить создание данных для запуска самого отчета. Это я чувствую, это лучший способ справиться, то вы можете использовать временные таблицы, чтобы временно поставить свои данные, и никто не будет иметь проблемы concurency, если несколько людей пытаются запустить отчет в то же время. В зависимости от того, сколько отчетов мы говорим, это может занять некоторое время, чтобы сделать это, так что вам, возможно, потребуется еще один короткий срок SOLUTIO н а.

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

В-третьих вы можете настроить работу для заполнения таблицы (еще в отдельном наборе дб для простого восстановления) один раз в день (усечение в то время). Тогда кто работает отчет в тот же день будет видеть одни и те же данные, и не будет никаких проблем параллелизма. Однако эти данные не будут последнюю минуту. Вы также можете настроить awarehouse данных отчетов, но это, вероятно, избыточна в вашем случае.

Ответил 19/05/2009 в 14:19
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more