powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Надо с таблицы удалить около 13 млн записей по условию, как это можно сделать?
17 сообщений из 17, страница 1 из 1
Надо с таблицы удалить около 13 млн записей по условию, как это можно сделать?
    #38831563
Pvase
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица, в ней есть записи. Часть записей заполнена только по колонке ID (поле идентификатор). Надо удалить все записи, у которых заполнено только это поле. Для удаления условие по полю не ID, а поле, которое если пустое - значит запись нужно удалять Делаю запрос:
Код: sql
1.
DELETE FROM [Fct_0008] WHERE [IdDOC310] IS NULL


При этом:
Код: sql
1.
SELECT COUNT(*) FROM [Fct_0008] WHERE [IdDOC310] IS NULL


равно: 13 529 892
а всех записей в таблице = 22 406 658.
Как можно выполнить такое удаление побыстрее?

Дело в том, что запустив такой запрос:
Код: sql
1.
DELETE FROM [Fct_0008] WHERE [IdDOC310] IS NULL

он проработал минут 15 и выдал ошибку о переполнении лога для базы (лог ограничен 20 ГБ).
...
Рейтинг: 0 / 0
Надо с таблицы удалить около 13 млн записей по условию, как это можно сделать?
    #38831566
Pvase
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pvase,

Добавил еще один лог файл на 40 ГБ, посмотрим, может пройдет.
...
Рейтинг: 0 / 0
Надо с таблицы удалить около 13 млн записей по условию, как это можно сделать?
    #38831569
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pvase, удаляйте не все сразу, а порциями
...
Рейтинг: 0 / 0
Надо с таблицы удалить около 13 млн записей по условию, как это можно сделать?
    #38831573
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. в цикле DELETE TOP
2. select into newtable where <то, что надо оставить>, очистить [Fct_0008], из newtable перенести в [Fct_0008]
...
Рейтинг: 0 / 0
Надо с таблицы удалить около 13 млн записей по условию, как это можно сделать?
    #38831583
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PvasePvase,

Добавил еще один лог файл на 40 ГБ, посмотрим, может пройдет.

для таких объёмов данных маловато. У вас Recovery Model какой? Если Full, то как бы лог не пришлось бекапить между операциями.
...
Рейтинг: 0 / 0
Надо с таблицы удалить около 13 млн записей по условию, как это можно сделать?
    #38831607
NickAlex66
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Pvase,

Если таблица [Fct_0008] широкая, то создание индекса по [IdDOC310] WHERE [IdDOC310] IS NULL вероятно поможет делу.
Конечно удалять порциями с коммитом после очередной порции.
Ну и Simple предпочтительнее.
...
Рейтинг: 0 / 0
Надо с таблицы удалить около 13 млн записей по условию, как это можно сделать?
    #38831609
Pvase
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Glory1. в цикле DELETE TOP
2. select into newtable where <то, что надо оставить>, очистить [Fct_0008], из newtable перенести в [Fct_0008]
Спасибо, то что надо.
...
Рейтинг: 0 / 0
Надо с таблицы удалить около 13 млн записей по условию, как это можно сделать?
    #38831621
Pvase
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Режим сразу поставил Simple. Спасибо, DELETE TOP (300000) выполняется всего по 40 секунд, пару раз прошелся и дело решено.

По существу. Эта таблица используется для загрузки данных из DTSX пакетов. После месяца работы обнаружил что есть дубли по полю ID. Посмотрел сколько их - оказалось почти половина. Причем все поля равны NULL, а ID дублируется. Вот решил почистить и добавить класстерный индекс по полю. Но вопрос остается, почему пожет при загрузке в DTSX пакетах происходит такое дублирования поля идентификатора?
MS SQL 2012.
...
Рейтинг: 0 / 0
Надо с таблицы удалить около 13 млн записей по условию, как это можно сделать?
    #38831628
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PvaseНо вопрос остается, почему пожет при загрузке в DTSX пакетах происходит такое дублирования поля идентификатора?
Потому что DTSX пакета всего лишь добавляет те данные, которые вы ему указываете добавить
...
Рейтинг: 0 / 0
Надо с таблицы удалить около 13 млн записей по условию, как это можно сделать?
    #38831665
Pvase
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Glory,

Это понятно, но почему он при этом значение в поле ID, которое является идентификатором с шагом 1 дублируется? Ведь ID вроде нигде не заполняется, SQL его должен сам прставлять уникальным, а получается что дублирует.
...
Рейтинг: 0 / 0
Надо с таблицы удалить около 13 млн записей по условию, как это можно сделать?
    #38831681
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PvaseЭто понятно, но почему он при этом значение в поле ID, которое является идентификатором с шагом 1 дублируется?
Потому что так написан пакет/запрос

PvaseВедь ID вроде нигде не заполняется, SQL его должен сам прставлять уникальным, а получается что дублирует.
С чего бы это SQL вдруг самому начать заполнять какое-то поле, да еще следить за уникальностью значений в нем ?
...
Рейтинг: 0 / 0
Надо с таблицы удалить около 13 млн записей по условию, как это можно сделать?
    #38831767
Pvase
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Glory,

Ну я так думал, что когда выполняешь INSERT для таблицы, то в поля, которые пропущены вставляется NULL, а в поле со свойством identity с шагом 1 должно автоматом вставлятся значение предыдущее + 1. Или для DTS пакетов это не действует?
Вот каие настройки на шаге вставки данных через OLE DB. Сопоставления для поля ID нет (выбрано "<Пропустить>"), а флажек "Сохранять ИД" в диспетчере соединений не установлен. Может что-то не так настроено? Подскажите пожалуйста.
...
Рейтинг: 0 / 0
Надо с таблицы удалить около 13 млн записей по условию, как это можно сделать?
    #38831908
Фотография zasandator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pvase,

Код: sql
1.
2.
3.
4.
5.
while 1=1
begin
    DELETE top(5000) FROM [Fct_0008] WHERE [IdDOC310] IS NULL
    if @@rowcount = 0 break
end
...
Рейтинг: 0 / 0
Надо с таблицы удалить около 13 млн записей по условию, как это можно сделать?
    #38831917
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PvaseGlory,

Ну я так думал, что когда выполняешь INSERT для таблицы, то в поля, которые пропущены вставляется NULL, а в поле со свойством identity с шагом 1 должно автоматом вставлятся значение предыдущее + 1. Или для DTS пакетов это не действует?
Вот каие настройки на шаге вставки данных через OLE DB. Сопоставления для поля ID нет (выбрано "<Пропустить>"), а флажек "Сохранять ИД" в диспетчере соединений не установлен. Может что-то не так настроено? Подскажите пожалуйста.Подсказать нельзя, мы же не представляем. как там работает ваш пакет, и что там написано.
...
Рейтинг: 0 / 0
Надо с таблицы удалить около 13 млн записей по условию, как это можно сделать?
    #38831973
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PvaseНу я так думал, что когда выполняешь INSERT для таблицы,
А вот так прямо команду INSERT написали у себя в пакете ?
Или может в Профайлере ее увидели ?

Pvaseа в поле со свойством identity с шагом 1 должно автоматом вставлятся значение предыдущее + 1.
Вот именно, что +1. Только вот от чего +1 ?
...
Рейтинг: 0 / 0
Надо с таблицы удалить около 13 млн записей по условию, как это можно сделать?
    #38832646
Pvase
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Glory,

Это я предположил, ведь у задачи вставки данных в таблицу SQL, когда источником есть запрос T-SQL по идее может быть или INSERT или BULK INSERT. Но в любом случаем код ID не заполняется пакетом, потому что нет сопоставления для этого поля. Если бы поле не заполнялось, то оно везде было бы NULL, а так видно что идет наращивание.
Есть предположение что когда то возник сбой, поэтому и произошла такая вставка. Потому что после удаления дублей и повтроного выполнения пакета (раз 20 минимум с разныими условиями) дубли не появились.
...
Рейтинг: 0 / 0
Надо с таблицы удалить около 13 млн записей по условию, как это можно сделать?
    #38832654
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PvaseT-SQL по идее может быть или INSERT или BULK INSERT
А вы считаете, что ни одна из этих команд не может добавить дублирующие значения в indetity ?

PvaseНо в любом случаем код ID не заполняется пакетом,
Еще раз - вы видели команду, которая передается серверу на выполнение ?

PvaseЕсть предположение что когда то возник сбой, поэтому и произошла такая вставка.
Ну если, например,DBCC CHECKIDENT назвать сбоем, то да, однозначно сбой
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Надо с таблицы удалить около 13 млн записей по условию, как это можно сделать?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]