T-SQL: Как правильно удалить часть строк в таблице? #782914


#0 by arsik
Составил запрос. На удаление с использованием временной таблицы. Но как этой временной таблице добавить индекс?
#1 by МихаилМ
забыли про смещение дат. забыли про tref (uid-ы могут совпадать ) .
#2 by МихаилМ
а по теме
#3 by МихаилМ
#4 by arsik
>>uid-ы могут совпадать Ну там не очень важная таблица, если пару лишних строк удалится ничего страшного нет. >>забыли про смещение дат В базе 0 смещение, так что ничего страшного я думаю.
#5 by Ёпрст
посмотрите на эти даты в табличке
#6 by arsik
Посмотрел. Я изначально просто выбрал документы, допустим за сегодня, нормально. Только сегодняшние выбрались.
#7 by Naf_kultura
зачем тут временная таблица вообще?
#8 by Ёпрст
дык, модно, молодежно
#9 by arsik
ХЗ. Так в 1С обычно принято. :) Еще индекс можно построить по временной. Вроде как быстрее должно быть.
#10 by Мойдодыр
для однократного применения индекс не нужен
#11 by Naf_kultura
DELETE FROM _InfoReg4206 WHERE     (_Fld4207_RRRef NOT IN (SELECT     _IDRRef FROM         _Document9915 WHERE     (_Date_Time >= @datevar) UNION ALL SELECT   _IDRRef FROM     _Document106 WHERE    (_Date_Time >= @datevar) ))
#12 by arsik
UNION ALL - я так понимаю быстрее должен обрабатывать объединение?
#13 by arsik
Спорно. Почему то во всех мануалах (по 1С) советуют использовать временные с индексами. Даже если они 1 раз используются.
#14 by Naf_kultura
естественно
#15 by arsik
SELECT происходит быстро, а вот DELETE - уже час шуршит. Таблица исходная из которой нужно удалить очень большая (250 миллионов записей). Временная вышла около 3 миллионов. Как ускорить DELETE?
#16 by Naf_kultura
если ты почти всю ее удаляешь, то бишь оставляешь 3 из 250 миллионов, то не проще было создать другую таблицу. Туда перенести нужные данные INSERT. Старую грохнуть DROP. Новую переименовать
#17 by arsik
Была такая мысль но моего опыта не хватит, что бы пересоздать таблицу. Там же еще и индексы нужно создать.
#18 by Мойдодыр
В sql менеджере - показать код создания
#19 by arsik
Есть такое. А как со статистикой быть? Она автоматом создается?
#20 by youalex
DECLARE @docs table(UIDs binary) - это не временная таблица, а табличная переменная. Непонятно, зачем она вообще: [1c] DELETE reg FROM _InfoReg4206 reg JOIN _Document9915 doc ON reg._RecorderRRef = doc._IDRRef WHERE doc._Date_Time >= @datevar     --AND reg._RecorderTRef = 0x00000105 /*это условие луше указать, чтобы в индекс попасть, значение можно в профайлере узнать*/ [/1c] И для второй таблицы доков - аналогично.
#21 by youalex
+ смещение дат, да.
#22 by youalex
+ - еще можно удалять порциями: DELETE TOP (1000)
#23 by Yuri 83
Тем не менее правильно товарищ в говорит... Времени разобраться плюс время выполнить все равно будет меньше, чем вот так, в лоб удалять. Можно еще просто создать копию таблицы с нужными данными (можно мастером накликать код, если сложно), затем truncate table очистит полностью исходную, потом обратно скопировать данные. Будет быстрее гораздо. Только права на truncate должны быть
#24 by arsik
А обратно скопировать через insert? Или какой то другой ход есть?
#25 by youalex
можно через временную: BEGIN TRAN BEGIN TRY 1) SELECT INTO #temp SELECT ... 2) TRUNCATE TABLE Reg 3) INSERT INTO Reg SELECT * FROM #temp END TRY BEGIN CATCH     SELECT ERROR_MESSAGE     ROLLBACK TRAN END CATCH IF @@TRANCOUNT > 0 COMMIT TRAN SELECT @@TRANCOUNT -- должно быть 0 !!
#26 by arsik
Спасибо. То что надо. Так и сделаю.
#27 by youalex
1) - SELECT reg.* INTO #temp FROM _InfoReg4206 reg ...
#28 by arsik
Спасибо большое. Все получилось. Сократилось до 7 минут. У меня еще вопрос. После инсерта нужно переиндексацию, (перестроение, реорганизацию) индексов этой таблицы делать или sql сам все автоматом сделает?
#29 by МихаилМ
не нужно . автоматом
#30 by arsik
Спасибо.
#31 by arsik
Оказалось все не так просто. На тестовой базе все нормально, на рабочей ошибка: Поиск по этим полям показал, что запись все же уникальна. Я так полагаю, что просто во время выполнения запроса в эту таблицу вносятся изменения из 1С. Как заблокировать на уровне SQL таблицу на время выполнения всего скрипта? Пример скрипта тут:
#32 by Naf_kultura
выгнать юзеров
#34 by mehfk
Тебе нужен TABLOCK
#35 by arsik
Не пойдет. Там постоянно кроме юзеров еще и автообмены. Ну и выгонять юзеров долго. У меня сначала идет TRUNCATE, потом INSERT. Между этими двумя строками может пролезть INSERT от 1С? Правильно так?
#36 by mehfk
INSERT INTO _InfoReg4206 WITH (TABLOCK) SELECT * FROM #tmp_InfoReg4206_20161017113542
#37 by Oftan_Idy
Вот лезут такие грязными ручками в SQL, а потом базы падают. Начерта это делать напрямую? Почему не через платформу?
#38 by arsik
250 милионов записей из регистра долго удаляются. Аа. Точно. Не в тот запрос воткнул.
#39 by mehfk
А вообще, что удаляешь? Версии объектов?
#40 by arsik
Не. Создали тут умельцы свой регистр. Только очистку тупую сделали. 100 т. записей в день удаляется, посредством 1С, а прирастает больше. Иногда намного больше, это когда перепроведения всякие. Сейчас накопилось 270 миллионов записей, из них актуальны только 13 миллионов.
Тэги: Админ
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С