Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Очистка РН за период средствами SQL

Очистка РН за период средствами SQL
Я
   trey1
 
04.04.19 - 14:19
Всем привет! Ребят очень нужна ваша помощь. Как очистить таблицу РН до определенной даты? Мне нужно чтобы всё удалилось до определенной даты.

если общий запрос то я думаю так

Connection.Execute("TRUNCATE TABLE "+имя РН как оно в скуле);
 
 
   1Сергей
 
1 - 04.04.19 - 14:20
Удаляет все строки в таблице или указанные секции таблицы, не записывая в журнал удаление отдельных строк. Инструкция TRUNCATE TABLE похожа на инструкцию DELETE без предложения WHERE, однако TRUNCATE TABLE выполняется быстрее и требует меньших ресурсов системы и журналов транзакций.

https://docs.microsoft.com/ru-ru/sql/t-sql/statements/truncate-table-transact-sql?view=sql-server-2017
   Cyberhawk
 
2 - 04.04.19 - 14:22
Через 1С замерял за сколько удаляется? Или ты не 1Сник?
   bolobol
 
3 - 04.04.19 - 14:24
Обновление итогов не забудьте!
   trey1
 
4 - 04.04.19 - 14:25
(2) 1Сник, записей больше 100 миллионов, после полдня просиживания решил что это прям не самый лучший вариант
   Ёпрст
 
5 - 04.04.19 - 14:25
(0) неправильно думаешь
   trey1
 
6 - 04.04.19 - 14:27
(5) Как правильно? Поэтому и спрашиваю
   trey1
 
7 - 04.04.19 - 14:28
(3) После того как снесу в ыйд? чтобы данные в ВТ появились видимо?
   Ёпрст
 
8 - 04.04.19 - 14:28
(6) как минимум, delete + where
а так, на нимфостарте полно поделок по удалению всего и вся средстами sqlготовых
   trey1
 
9 - 04.04.19 - 14:31
(8) я видел, если даже разработка стоит 1стартмани эт надо абонемент купить минимум за 4500, эт как бы дофига, учитывая что мне нужно то только одна обработка
   Ёпрст
 
10 - 04.04.19 - 14:33
(9) ищи их -же, на других ресурсах.
 
 Рекламное место пустует
   Робинзон Крузо
 
11 - 04.04.19 - 14:34
Грохнуть регистр в метаданных. Выгрузить загрузить через .dt. Восстановить необходимый период из копии с помощью КД 2.0
   Ёпрст
 
12 - 04.04.19 - 14:47
ну вот, первая же ссылка в поиске.. внизу статьи пример
https://habr.com/ru/post/264687/
   timurhv
 
13 - 04.04.19 - 16:56
(6)
- Создать таблицу с префиксом запросом SQL;
- Скопировать записи из старой таблицы в новую с отбором по периоду;
- Грохнуть старую таблицу;
- Переименовать новую таблицу;
   timurhv
 
14 - 04.04.19 - 16:57
(12)
----------------
командаРегистров.CommandText = командаРегистров.CommandText + "DELETE FROM " + ОсновнаяТаблицаРегистра + " WHERE _RecorderRRef IN (SELECT _IDRRef FROM " + строкаТаблицы.ИмяТаблицыХранения + " WHERE _Date_Time BETWEEN @StartDate AND @EndDate);";
----------------
Это долгая операция, если нужно удалить данные допустим за 10 лет и сформировать остатки на начало 2019 года.
   ptiz
 
15 - 04.04.19 - 17:01
Я так чищу, потом только итоги пересчитать:

    // создаем копию таблицы

    Команда = "SELECT * INTO " + ИмяВремТаблицы + " FROM " + ИмяТаблицы + "WHERE " + ИмяПоляПериода + " > " + ДатаСтрокойВSQL(КонецДня(Дата2));
    ВыполнитьКомандуSQL(Команда);
    
    // чистим текущую таблицу

    Команда = "TRUNCATE TABLE " + ИмяТаблицы;
    ВыполнитьКомандуSQL(Команда);
    
    // возвращаем данные из копии таблицы

    Команда = "INSERT INTO " + ИмяТаблицы + " SELECT * FROM " + ИмяВремТаблицы;
    ВыполнитьКомандуSQL(Команда);
    
    // удаляем временную таблицу

    Команда = "DROP TABLE " + ИмяВремТаблицы;
    ВыполнитьКомандуSQL(Команда);
   timurhv
 
16 - 04.04.19 - 17:08
(15) Можно еще дополнить условие, которое оставит движения документов определенных, например корректировки данных.
   bolero
 
17 - 04.04.19 - 17:12
(14) > WHERE _RecorderRRef IN (SELECT

поубивав бы

DELETE FROM {} reg
USING (SELECT n.{} bref
          FROM {} n
          WHERE n.{} = TRUE
      ) t
WHERE
  reg.{} = t.bref

   bolero
 
18 - 04.04.19 - 17:17
(17) подробнее: DELETE WHERE IN (SELECT) - по каждой строчке очищаемой страницы будет производиться сравнение, входит ли значение в колонке в список из 100500 (или 100500800) отобранных другим запросом значений, и время исполнения запроса возрастает в гиперболической зависимости от объема данных

DELETE USING (SELECT) WHERE - аналог JOIN для DELETE - внутрях сначала обычным SELECT JOIN быстро отбирается список строк к удалению, и за один проход удаляется
   rsv
 
19 - 04.04.19 - 17:26
(18)  вывод все равно один ...delete пишет в лог .. Truncate нет
   bolero
 
20 - 04.04.19 - 17:40
(19) чего-то я этот вывод пропустил, видимо топик невнимательно читал...

TRUNCATE коротенько пишет в WAL одну операцию "поделить на ноль вон ту таблицу", на реплику эта операция передается быстро, и исполняется там также быстро
а DELETE - да, подробно перечисляет, что именно удалять, и кусок журнала может получиться увесистым

частичного TRUNCATE не существует

ТС изначально запрашивал "почистить регистр до определенной даты", это можно сделать
DELETE FROM WHERE _Period < '2019-01-01'

я пока не видел, чтобы в РН и регистраторе даты различались, поэтому брать дату из регистратора смысла не вижу

а если более подробный отбор по регистраторам - то схема из (17)
   Immortal
 
21 - 04.04.19 - 19:00
И таблицу итогов не забудьте
   trey1
 
22 - 05.04.19 - 06:12
О ребят спасибо большое всем за помощь и наводки, сейчас буду разбираться!


Список тем форума
Рекламное место пустует  Рекламное место пустует
Прочитай, хотя бы, Митичкина "Разработка в системе 1С:Предприятие 8". Волшебник
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует