Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Надо с таблицы удалить около 13 млн записей по условию, как это можно сделать?  [new]
Pvase
Member

Откуда:
Сообщений: 1010
Есть таблица, в ней есть записи. Часть записей заполнена только по колонке ID (поле идентификатор). Надо удалить все записи, у которых заполнено только это поле. Для удаления условие по полю не ID, а поле, которое если пустое - значит запись нужно удалять Делаю запрос:
DELETE FROM [Fct_0008] WHERE [IdDOC310] IS NULL

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

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

Дело в том, что запустив такой запрос:
DELETE FROM [Fct_0008] WHERE [IdDOC310] IS NULL
он проработал минут 15 и выдал ошибку о переполнении лога для базы (лог ограничен 20 ГБ).
11 дек 14, 15:59    [16984226]     Ответить | Цитировать Сообщить модератору
 Re: Надо с таблицы удалить около 13 млн записей по условию, как это можно сделать?  [new]
Pvase
Member

Откуда:
Сообщений: 1010
Pvase,

Добавил еще один лог файл на 40 ГБ, посмотрим, может пройдет.
11 дек 14, 16:00    [16984240]     Ответить | Цитировать Сообщить модератору
 Re: Надо с таблицы удалить около 13 млн записей по условию, как это можно сделать?  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
Pvase, удаляйте не все сразу, а порциями
11 дек 14, 16:01    [16984251]     Ответить | Цитировать Сообщить модератору
 Re: Надо с таблицы удалить около 13 млн записей по условию, как это можно сделать?  [new]
Glory
Member

Откуда:
Сообщений: 104751
1. в цикле DELETE TOP
2. select into newtable where <то, что надо оставить>, очистить [Fct_0008], из newtable перенести в [Fct_0008]
11 дек 14, 16:02    [16984262]     Ответить | Цитировать Сообщить модератору
 Re: Надо с таблицы удалить около 13 млн записей по условию, как это можно сделать?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4901
Pvase
Pvase,

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


для таких объёмов данных маловато. У вас Recovery Model какой? Если Full, то как бы лог не пришлось бекапить между операциями.
11 дек 14, 16:09    [16984315]     Ответить | Цитировать Сообщить модератору
 Re: Надо с таблицы удалить около 13 млн записей по условию, как это можно сделать?  [new]
NickAlex66
Member

Откуда:
Сообщений: 319
Pvase,

Если таблица [Fct_0008] широкая, то создание индекса по [IdDOC310] WHERE [IdDOC310] IS NULL вероятно поможет делу.
Конечно удалять порциями с коммитом после очередной порции.
Ну и Simple предпочтительнее.
11 дек 14, 16:24    [16984412]     Ответить | Цитировать Сообщить модератору
 Re: Надо с таблицы удалить около 13 млн записей по условию, как это можно сделать?  [new]
Pvase
Member

Откуда:
Сообщений: 1010
Glory
1. в цикле DELETE TOP
2. select into newtable where <то, что надо оставить>, очистить [Fct_0008], из newtable перенести в [Fct_0008]

Спасибо, то что надо.
11 дек 14, 16:26    [16984423]     Ответить | Цитировать Сообщить модератору
 Re: Надо с таблицы удалить около 13 млн записей по условию, как это можно сделать?  [new]
Pvase
Member

Откуда:
Сообщений: 1010
Режим сразу поставил Simple. Спасибо, DELETE TOP (300000) выполняется всего по 40 секунд, пару раз прошелся и дело решено.

По существу. Эта таблица используется для загрузки данных из DTSX пакетов. После месяца работы обнаружил что есть дубли по полю ID. Посмотрел сколько их - оказалось почти половина. Причем все поля равны NULL, а ID дублируется. Вот решил почистить и добавить класстерный индекс по полю. Но вопрос остается, почему пожет при загрузке в DTSX пакетах происходит такое дублирования поля идентификатора?
MS SQL 2012.
11 дек 14, 16:30    [16984452]     Ответить | Цитировать Сообщить модератору
 Re: Надо с таблицы удалить около 13 млн записей по условию, как это можно сделать?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Pvase
Но вопрос остается, почему пожет при загрузке в DTSX пакетах происходит такое дублирования поля идентификатора?

Потому что DTSX пакета всего лишь добавляет те данные, которые вы ему указываете добавить
11 дек 14, 16:33    [16984479]     Ответить | Цитировать Сообщить модератору
 Re: Надо с таблицы удалить около 13 млн записей по условию, как это можно сделать?  [new]
Pvase
Member

Откуда:
Сообщений: 1010
Glory,

Это понятно, но почему он при этом значение в поле ID, которое является идентификатором с шагом 1 дублируется? Ведь ID вроде нигде не заполняется, SQL его должен сам прставлять уникальным, а получается что дублирует.
11 дек 14, 16:47    [16984577]     Ответить | Цитировать Сообщить модератору
 Re: Надо с таблицы удалить около 13 млн записей по условию, как это можно сделать?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Pvase
Это понятно, но почему он при этом значение в поле ID, которое является идентификатором с шагом 1 дублируется?

Потому что так написан пакет/запрос

Pvase
Ведь ID вроде нигде не заполняется, SQL его должен сам прставлять уникальным, а получается что дублирует.

С чего бы это SQL вдруг самому начать заполнять какое-то поле, да еще следить за уникальностью значений в нем ?
11 дек 14, 16:55    [16984620]     Ответить | Цитировать Сообщить модератору
 Re: Надо с таблицы удалить около 13 млн записей по условию, как это можно сделать?  [new]
Pvase
Member

Откуда:
Сообщений: 1010
Glory,

Ну я так думал, что когда выполняешь INSERT для таблицы, то в поля, которые пропущены вставляется NULL, а в поле со свойством identity с шагом 1 должно автоматом вставлятся значение предыдущее + 1. Или для DTS пакетов это не действует?
Вот каие настройки на шаге вставки данных через OLE DB. Сопоставления для поля ID нет (выбрано "<Пропустить>"), а флажек "Сохранять ИД" в диспетчере соединений не установлен. Может что-то не так настроено? Подскажите пожалуйста.
11 дек 14, 17:34    [16984893]     Ответить | Цитировать Сообщить модератору
 Re: Надо с таблицы удалить около 13 млн записей по условию, как это можно сделать?  [new]
zasandator
Member [скрыт] [заблокирован]

Откуда:
Сообщений: 4887
Pvase,

while 1=1
begin
    DELETE top(5000) FROM [Fct_0008] WHERE [IdDOC310] IS NULL
    if @@rowcount = 0 break
end
11 дек 14, 19:58    [16985462]     Ответить | Цитировать Сообщить модератору
 Re: Надо с таблицы удалить около 13 млн записей по условию, как это можно сделать?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31983
Pvase
Glory,

Ну я так думал, что когда выполняешь INSERT для таблицы, то в поля, которые пропущены вставляется NULL, а в поле со свойством identity с шагом 1 должно автоматом вставлятся значение предыдущее + 1. Или для DTS пакетов это не действует?
Вот каие настройки на шаге вставки данных через OLE DB. Сопоставления для поля ID нет (выбрано "<Пропустить>"), а флажек "Сохранять ИД" в диспетчере соединений не установлен. Может что-то не так настроено? Подскажите пожалуйста.
Подсказать нельзя, мы же не представляем. как там работает ваш пакет, и что там написано.
11 дек 14, 20:22    [16985540]     Ответить | Цитировать Сообщить модератору
 Re: Надо с таблицы удалить около 13 млн записей по условию, как это можно сделать?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Pvase
Ну я так думал, что когда выполняешь INSERT для таблицы,

А вот так прямо команду INSERT написали у себя в пакете ?
Или может в Профайлере ее увидели ?

Pvase
а в поле со свойством identity с шагом 1 должно автоматом вставлятся значение предыдущее + 1.

Вот именно, что +1. Только вот от чего +1 ?
11 дек 14, 22:37    [16985865]     Ответить | Цитировать Сообщить модератору
 Re: Надо с таблицы удалить около 13 млн записей по условию, как это можно сделать?  [new]
Pvase
Member

Откуда:
Сообщений: 1010
Glory,

Это я предположил, ведь у задачи вставки данных в таблицу SQL, когда источником есть запрос T-SQL по идее может быть или INSERT или BULK INSERT. Но в любом случаем код ID не заполняется пакетом, потому что нет сопоставления для этого поля. Если бы поле не заполнялось, то оно везде было бы NULL, а так видно что идет наращивание.
Есть предположение что когда то возник сбой, поэтому и произошла такая вставка. Потому что после удаления дублей и повтроного выполнения пакета (раз 20 минимум с разныими условиями) дубли не появились.
12 дек 14, 16:02    [16989675]     Ответить | Цитировать Сообщить модератору
 Re: Надо с таблицы удалить около 13 млн записей по условию, как это можно сделать?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Pvase
T-SQL по идее может быть или INSERT или BULK INSERT

А вы считаете, что ни одна из этих команд не может добавить дублирующие значения в indetity ?

Pvase
Но в любом случаем код ID не заполняется пакетом,

Еще раз - вы видели команду, которая передается серверу на выполнение ?

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

Ну если, например,DBCC CHECKIDENT назвать сбоем, то да, однозначно сбой
12 дек 14, 16:06    [16989715]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить