Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Удаление данных из большой таблицы (как ускорить).  [new]
KarpovD
Member

Откуда: ...
Сообщений: 14
Привет.

Есть большая табличка от 50 млн записей.

Первичный ключ составной, состоит из трех полей: Field1, Field2, Field3.

Gоле Field2 - дата.
Требуется быстро удалять из таблицы данные за некоторый период.

Новый индекс создать нельзя.

Когда данные за указанный период есть - все происходит достаточно быстро
а вот когда нет - то начинаются проблемы))

Подскажите, пожалуйста, есть ли возможность как-то решить проблему без создания индекса по дате?
13 сен 12, 17:56    [13160119]     Ответить | Цитировать Сообщить модератору
 Re: Удаление данных из большой таблицы (как ускорить).  [new]
--__Александр__--
Member

Откуда:
Сообщений: 2631
DECLARE @tbl_DEL ( Field1, Field2, Field3)
INSERT INTO @tbl_DEL
SELECT  Field1, Field2, Field3
  FROM Big_Table
 WHERE Field2 >= par1 
   AND Field2 <= par2

DELETE Big_Table
  FROM Big_Table
  JOIN @tbl_DEL as D
    ON D.Field1 = Big_Table.Field1 
   AND D.Field2 = Big_Table.Field2 
   AND D.Field3 = Big_Table.Field3 
13 сен 12, 18:01    [13160158]     Ответить | Цитировать Сообщить модератору
 Re: Удаление данных из большой таблицы (как ускорить).  [new]
edyaN
Member

Откуда: Berlin
Сообщений: 185
--__Александр__--,

так тоже будет не быстро. Много времени уйдет на заполнение временной таблицы.
без индекса никак.

можно поменять порядок полей в первичном ключе, чтобы первым было Field2. Но я бы тогда на другие запросы посмотрел.
13 сен 12, 18:11    [13160207]     Ответить | Цитировать Сообщить модератору
 Re: Удаление данных из большой таблицы (как ускорить).  [new]
KarpovD
Member

Откуда: ...
Сообщений: 14
Да))
я тоже так подумал сначала
но побыстрей вроде-бы)

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

спасибо)
13 сен 12, 18:27    [13160314]     Ответить | Цитировать Сообщить модератору
 Re: Удаление данных из большой таблицы (как ускорить).  [new]
KarpovD
Member

Откуда: ...
Сообщений: 14
конечно жесть, я планировал динамическим SQL по всем таблицам пройтись))
но, состав PK разный... ничего не поделаешь))
13 сен 12, 18:30    [13160331]     Ответить | Цитировать Сообщить модератору
 Re: Удаление данных из большой таблицы (как ускорить).  [new]
балк
Guest
перелейте балком только нужные записи в другу таблицу и переименуйте ее.

без соответствующего индекса на исходный таблице самый дешевый вариант один раз ее просканить
13 сен 12, 19:28    [13160654]     Ответить | Цитировать Сообщить модератору
 Re: Удаление данных из большой таблицы (как ускорить).  [new]
балк
Guest
балк
перелейте балком только нужные записи в другу таблицу и переименуйте ее.

без соответствующего индекса на исходнОЙ таблице самый дешевый вариант один раз ее просканить
13 сен 12, 19:30    [13160667]     Ответить | Цитировать Сообщить модератору
 Re: Удаление данных из большой таблицы (как ускорить).  [new]
KarpovD
Member

Откуда: ...
Сообщений: 14
слишком все мудрено становится))
время очень критично,
перезаливаться огромные таблицы 50-10млн записей будут быстрее 10-20 сек?,
плюс не будет прав на созданние таблиц
и запись в таблицы тем временем идет, это придется учитывать)

вариант со временной табличкой не подошел,
там время запроса/удаления даже 1..100 строк сократилось с 2минут до 50 секунд, но этого не достаточно.
и потерялась универсальность - отдельно для 400 таблиц не очень хочется описывать.

странно, но я пока что нашел выход:
проблема с таймаутами возникает только когда за указанный период данных в таблице нет.
а раз данных нет, то и удалять их не надо)))
13 сен 12, 20:00    [13160805]     Ответить | Цитировать Сообщить модератору
 Re: Удаление данных из большой таблицы (как ускорить).  [new]
Владимир Затуливетер
Member

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

сравните планы удаления когда данные есть и когда данных нет, может быть это что-то даст.
14 сен 12, 00:58    [13161600]     Ответить | Цитировать Сообщить модератору
 Re: Удаление данных из большой таблицы (как ускорить).  [new]
Glory
Member

Откуда:
Сообщений: 104751
KarpovD
Когда данные за указанный период есть - все происходит достаточно быстро
а вот когда нет - то начинаются проблемы))

И почему бы тогда не проверить перед удалением наличие данных в заданном периоде ?
14 сен 12, 11:30    [13163127]     Ответить | Цитировать Сообщить модератору
 Re: Удаление данных из большой таблицы (как ускорить).  [new]
KarpovD
Member

Откуда: ...
Сообщений: 14
проверка есть, но она тоже долго работает (select top 1)

а еще очень интересно... (поправьте, если я не прав)
запрос
delete top(NN) 
from MyBigTable
where Field2<@Date

выполняется дольше, если реальное количество удаляемых записей меньше "NN"

т.е. мне надо в цикле удалить 75430 записей по 1000 штук
75 тыс удаляются циклом без проблем
а 430 - уже "долго"

это на больших таблицах, на маленьких разница не ощутима.
14 сен 12, 12:30    [13163800]     Ответить | Цитировать Сообщить модератору
 Re: Удаление данных из большой таблицы (как ускорить).  [new]
Glory
Member

Откуда:
Сообщений: 104751
KarpovD
выполняется дольше, если реальное количество удаляемых записей меньше "NN"

Это вопрос - почему разные запросы работают разное время и дают разные результаты ?
14 сен 12, 12:33    [13163829]     Ответить | Цитировать Сообщить модератору
 Re: Удаление данных из большой таблицы (как ускорить).  [new]
iap
Member

Откуда: Москва
Сообщений: 47063
KarpovD
проверка есть, но она тоже долго работает (select top 1)
Какая же это проверка? Проверку надо предикатом EXISTS() делать.
14 сен 12, 12:41    [13163914]     Ответить | Цитировать Сообщить модератору
 Re: Удаление данных из большой таблицы (как ускорить).  [new]
KarpovD
Member

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

это не вопрос, а мое наблюдение.

запрос один и тот же.

если в таблице имеется количество записей кратное количеству указанному в запросе, то он выполняется быстро.
если нет - медленней.
14 сен 12, 12:43    [13163933]     Ответить | Цитировать Сообщить модератору
 Re: Удаление данных из большой таблицы (как ускорить).  [new]
Glory
Member

Откуда:
Сообщений: 104751
KarpovD
это не вопрос, а мое наблюдение.

Хорошее наблюдение

KarpovD
запрос один и тот же.

У одинаковых запросов текст совпадает до последней буквы.
14 сен 12, 12:53    [13164033]     Ответить | Цитировать Сообщить модератору
 Re: Удаление данных из большой таблицы (как ускорить).  [new]
KarpovD
Member

Откуда: ...
Сообщений: 14
всем спасибо)
14 сен 12, 12:58    [13164113]     Ответить | Цитировать Сообщить модератору
 Re: Удаление данных из большой таблицы (как ускорить).  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
KarpovD
проверка есть, но она тоже долго работает (select top 1)

а еще очень интересно... (поправьте, если я не прав)
запрос
delete top(NN) 
from MyBigTable
where Field2<@Date

выполняется дольше, если реальное количество удаляемых записей меньше "NN"

т.е. мне надо в цикле удалить 75430 записей по 1000 штук
75 тыс удаляются циклом без проблем
а 430 - уже "долго"
Если вы программист, попробуйте догадаться сами.
У вас таблица на 50М, вам нужно удалить 75К, которые, скорее всего, находятся где-то в начале таблицы. Индексов по дате нифига нет, следовательно чтобы удалить строки скан таблицы неизбежен. Ну и теперь представьте что вы SQL Engine и вам сказали удалить тыщу строк, и как вы будете это делать? Для вариантов:
а) В таблице 75430 строк удовлетворяющих условию.
а) В таблице 430 строк удовлетворяющих условию.

Основная проблема не в удалении, а в том чтобы найти строки для удаления.
14 сен 12, 20:39    [13167467]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить