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

Откуда:
Сообщений: 79
Здравствуйте.
Столкнулся с тем, что при трансформации данных большой таблы (20 млн зап.), используемой в качестве источника данных для OLAP, оооочень долго происходит удаление данных за период. Раньше надо было вычистить все целиком из таблы и залить свежую инфу, я использовал TRUNCATE TABLE - все работало мгновенно, все 20 млн чикались в 1 секунду. С недавнего времени появилась острая необходимость удалять данные определенного периода - примерно половину из всех записей командой DELETE FROM MyTable WHERE DATEPART(QQ,Period) = 4.

Создал некластерный индекс по полю Period , в плане он задействуется (NON Clastered Index SCAN) cost 99%, но 2 с половиной часа - это очень долго.

Монитор активности не показывает каких-либо фантастических цифр. Процессорная нагрузка практически нулевая. Смотрю, что происходит распараллеливание, множатся CXPACKETы. Попытался убрать с помощью MAXDOP 1 это распараллеливание, но выигрыша во времени выполнения не получил.

Попробовал на более быстром железе, и был удивлен - время выполнения команды отличалось незначительно. На 1 минуту быстрей.

Вообще, создается такое впечатление, что ресурсы сервера используются в каком-то урезаном режиме.
Интересно было бы послушать мнения по этому поводу, что не так? То что DELETE логирует каждую запись в отличие от TRUNCATE TABLE - дает такую задержку? Индекс не тот? Как ускорить?

Заранее благодарю за ответы.
21 ноя 14, 12:05    [16884242]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить DELETE  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37254
Читайте про partitioning.
21 ноя 14, 12:06    [16884253]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить DELETE  [new]
aleks2
Guest
Вам, батенька, срочно нужно переквалифицироваться в управдомы.

1. WHERE DATEPART(QQ,Period) = 4. - Какой вам индекс? Вы бредите.
2. Куды вы торопитесь?
21 ноя 14, 12:08    [16884274]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить DELETE  [new]
iap
Member

Откуда: Москва
Сообщений: 47107
Durex_
WHERE DATEPART(QQ,Period) = 4
Это при любом раскладе тормоз. Делай по Period индекс, не делай...
Создать вычисляемое поле - квартал от Period, а уже его проиндексировать и использовать в WHERE - это может слегка помочь.
21 ноя 14, 12:11    [16884316]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить DELETE  [new]
Durex_
Member

Откуда:
Сообщений: 79
iap
Durex_
WHERE DATEPART(QQ,Period) = 4
Это при любом раскладе тормоз. Делай по Period индекс, не делай...
Создать вычисляемое поле - квартал от Period, а уже его проиндексировать и использовать в WHERE - это может слегка помочь.


Да мне вообще индексы нежелательны. Потом задержка при заливке этого же объема + кусочек новых съест время выигранное при удалении.
21 ноя 14, 12:19    [16884407]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить DELETE  [new]
iap
Member

Откуда: Москва
Сообщений: 47107
Durex_
Да мне вообще индексы нежелательны
Тогда у Вас нет проблем. Никаких.
21 ноя 14, 12:20    [16884413]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить DELETE  [new]
Glory
Member

Откуда:
Сообщений: 104751
Durex_
Вообще, создается такое впечатление, что ресурсы сервера используются в каком-то урезаном режиме. Интересно было бы послушать мнения по этому поводу, что не так?
То что DELETE логирует каждую запись в отличие от TRUNCATE TABLE - дает такую задержку?


Прежде, чем что-то удалить, DELETE должен выбрать это что-то
А TRUNCATE-у ничего не надо выбирать, эта команда сразу начинает удалять данные

Ну и в журнал разумеется пишется меньше информации
21 ноя 14, 12:25    [16884476]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить DELETE  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3716
Glory
А TRUNCATE-у ничего не надо выбирать, эта команда сразу начинает удалять данные

это что-то новое
21 ноя 14, 12:52    [16884693]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить DELETE  [new]
tarrus
Member

Откуда: Bergen
Сообщений: 831
Ivan Durak
Glory
А TRUNCATE-у ничего не надо выбирать, эта команда сразу начинает удалять данные

это что-то новое

Ничего нового.
Removes all rows from a table without logging the individual row deletions. TRUNCATE TABLE is similar to the DELETE statement with no WHERE clause; however, TRUNCATE TABLE is faster and uses fewer system and transaction log resources.
21 ноя 14, 12:56    [16884729]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить DELETE  [new]
Glory
Member

Откуда:
Сообщений: 104751
Ivan Durak
Glory
А TRUNCATE-у ничего не надо выбирать, эта команда сразу начинает удалять данные

это что-то новое

Новое - это то, что перед DELETE нужно сначала выбрать удаляемые записи ?
Или что TRUNCATE не делает выборку удаляемых записей ?
21 ноя 14, 13:00    [16884759]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить DELETE  [new]
ilyaBS
Member

Откуда: Киев
Сообщений: 77
некластерный индекс на такой большое таблице по малой кардинальностью - это полюбому плохо. даже полное сканирование таблицы может быть быстрее, чем некластерного индекса. я согласен с пользователем jap. еще как вариант использовать partition и удалять только нужные.
21 ноя 14, 13:17    [16884893]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить DELETE  [new]
Durex_
Member

Откуда:
Сообщений: 79
Гавриленко Сергей Алексеевич
Читайте про partitioning.



Microsoft SQL Server 2012 - 11.0.2100.60 (X64) 
	Feb 10 2012 19:39:15 
	Copyright (c) Microsoft Corporation
	Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)



Standard Edition не поддерживает секционирование.
21 ноя 14, 14:21    [16885417]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить DELETE  [new]
Exproment
Member

Откуда:
Сообщений: 416
Durex_, секционирование - логический механизм, который может быть реализован физическим партиционированием, что в вашем случае невозможно. Как вариант для вас -> "partition view sql server"(вставить в гугл).
21 ноя 14, 14:39    [16885603]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить DELETE  [new]
Exproment
Member

Откуда:
Сообщений: 416
Durex_
Индекс не тот? Как ускорить?

Durex_
WHERE DATEPART(QQ,Period) = 4.

Еще почитать про sargable predicate и переосмыслить условие. Более того, если в вашем сообщении присутствует слово индекс, то должен быть приложен план запроса.
21 ноя 14, 14:43    [16885631]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить