Имя: Пароль:
1C
1С v8
Удаление записей регистра в sql
,
0 080808Ник
 
23.01.21
22:01
Собственно есть самописная конфигурация. в ней два регистра в одном есть два поля ссылка и дата. в этом регистре 8 000 000 записей, а есть второй регистр в нем есть ссылка из первого регистра, но нет даты. В этом регистре 200 000 000 строчек. Мне нужно удалить из регистра два часть записей за определенный период. средствами 1с запустил обработку, удалилось пара миллионов за сутки. Решил попробовать через SQL. как в запросе delete указать отбор?
Я так пониаю мне нужно что то типа delete from t1 where key in (select key from t2 where date < '2020-1-1') Написал, ругается на синтаксис
1 080808Ник
 
23.01.21
22:15
SELECT
      
  FROM [Test].[dbo].[_InfoRg1960]

  where [_Fld1961]  IN (SELECT [_Fld1948]
      ,[_Fld1951]
      
  FROM [Test].[dbo].[_InfoRg1947]
  where [_Fld1948]<'4015-08-01')
Выдает  Сообщение 116, уровень 16, состояние 1, строка 10
В списке выбора можно указать только одно выражение, если вложенный запрос не предварен EXISTS.
2 080808Ник
 
23.01.21
22:16
упс. чет не вставилось SELECT [_Fld1961] вначале
3 080808Ник
 
23.01.21
22:20
мистяне что, все на митинги ушли?)
4 H A D G E H O G s
 
23.01.21
22:20
Добавить в Регистр, который удаляешь Булево, как первое измерение.
В 1С заполни его и удаляй

delete top 100000
from Test].[dbo].[_InfoRg1947]
where _Fld1948=0x01
5 H A D G E H O G s
 
23.01.21
22:21
Удаляй через top 100000, хотя бы оценишь скорость.
6 H A D G E H O G s
 
23.01.21
22:24
Сколько записей в рамках одной ссылки?
7 H A D G E H O G s
 
23.01.21
22:24
Как много записей нужно удалить?
8 H A D G E H O G s
 
23.01.21
22:27
Ошибка у тебя в подзапросе, здесь

SELECT [_Fld1948]
      ,[_Fld1951]

а надо

SELECT [_Fld1948]
или
SELECT [_Fld1951]
9 080808Ник
 
23.01.21
22:28
(6) та в том и беда, может быть вообще ни одной ссылки, а может быть и несколько тысяч. из первого регистра нужно у удалить где то миллионов 6, а из в торого где то 150 миллионов.
10 080808Ник
 
23.01.21
22:28
(8) о! точно, вот это я тупанул
Спасибо огромное!
11 080808Ник
 
23.01.21
22:29
я тут нагуглил Как правильно удалить записи регистра сведений через MS SQL?
"   H A D G E H O G s
48 - 10.08.17 - 14:40
А так - можно поотключать индексивароние-ведущесть у измерений и ресурсов - и вперед, типовыми средствами." - только ведущие снять или основной отбор тоже?
12 080808Ник
 
23.01.21
22:30
В 1с я сделал процедуру, выгребаю там тысяч 100 записей раскидываю их на 100 таблиц по тысячи и в фоновых заданиях удаляю. быстрее чем последовательно но все равно медленно
13 H A D G E H O G s
 
23.01.21
22:45
Я бы отключил именно для данной операции проверку страниц, епстественно, сделав копию БД предварительно, а после удаления сделал бы check этих 2-х таблиц.
Ну или хотя бы включил режим torn-page
14 080808Ник
 
24.01.21
00:01
(13) Спасибо огромное! Разница в удалении на порядки. 171 000 записей в sql цдалилась за 12 секунд, в 1с на это уходило минут 15-25
15 Злопчинский
 
24.01.21
00:58
да... я думал что в 8-ке не надо как в 77 извращаться... а вишь, как оно, по прежнему все непочеловечески
16 080808Ник
 
24.01.21
01:01
(15) не ну в 8ке извращений можно намного больше придумать и фоновыми заданиями и через скуль. кстати можно сделать внешний источник прикрутить его к своей же базе и через него удалять))))
17 080808Ник
 
24.01.21
01:07
хотя согласе, в регистры сведений в отбор могли на очистку вставить в списке
18 H A D G E H O G s
 
24.01.21
01:19
(17) я точно не помню, а разве нельзя для НабораЗаписей указать Отбор ВСписке.

?

Это вроде решает всю проблему.
19 080808Ник
 
24.01.21
01:39
(18) если бы можно было(
20 DEVIce
 
24.01.21
07:53
(18) Отборы только на равенство.
21 hhhh
 
24.01.21
08:20
(19) всё-таки, наверно, удаление через 1с не до конца отработано. Скорее всего тормоза где-то в процедурах ПриЗаписи и ПередЗаписью регистра, и в подписках там еще, регистрация для обмена и так далее. Надо это всё вырубить. И удалять при ОбменДанными.Загрузка = Истина.

потом с транзакциями надо поработать. Задать допустим 5-10 тыс операций в одной транзакции.
22 Конструктор1С
 
24.01.21
08:36
(0) покажи как средствами 1с удаляешь
23 H A D G E H O G s
 
24.01.21
10:53
(21) проблема 1с в (20)
24 080808Ник
 
24.01.21
13:40
(21) нет, проблема в том что для удаление тебе нужно накладывать отбор на набор записей на равенство, соответственно, по сути мне нужно сделать (6 миллионов раз на 2) запросов в базу данных на чтение и на запись. Через скуль сразу делаю  на удаление и все. По итогу за 2 часа удалил все 150 миллионов записей.
25 080808Ник
 
24.01.21
13:42
(22) Для Каждого Ключ из Ключи Цикл
    Набор.Отбор.Ключ.Установить(Ключ);
    Набор.Записать();
НаборОсновной.Отбор.Ключ.Установить(Ключ);
    НаборНаборОсновной.Записать();
26 Конструктор1С
 
25.01.21
11:45
(25) это дело легко можно было бы распараллелить с помощью фоновых заданий
27 VladZ
 
25.01.21
11:56
(0) "8 000 000 записей" - зачем столько данных в регистре?
28 080808Ник
 
25.01.21
12:27
(26) распараллелил. все равно долго см (12)
(27) то есть 200 миллионов тебя не смутили)
29 sapphire
 
25.01.21
12:52
(0) SELECT INTO во времянку из целевой таблицы
TRUNCATE целевой таблицы
INSERT из времянки в целевую
30 aka MIK
 
25.01.21
12:57
(29) это смотря сколько записей остается. Для свертки базы на 1 число текущего месяца - да, только так
31 VladZ
 
25.01.21
15:21
(28) Я дальше и не читал. :)
32 sapphire
 
25.01.21
15:40
(30) Годится, если записей меньше половины
33 080808Ник
 
25.01.21
16:10
(29) интересный вариант. надо попробовать на тестовой и сравнить скорость
34 sapphire
 
25.01.21
17:39
(33) Да, да, пренепременно попробуй. Много интересного узнаешь.
Собсно, почитай про вариант 2 реструктуризации ИБ на платформе 8.3....
35 080808Ник
 
25.01.21
18:24
(34) "вариант 2 реструктуризации ИБ на платформе 8.3" - это что такое?
36 Ёпрст
 
25.01.21
20:45
(35) https://wonderland.v8.1c.ru/blog/optimizatsiya-restrukturizatsii-bazy-dannykh/

неплохой метод. Единственное, в протоколах скуля должен быть включен tcp/ip, если будет еще и другой канал, типа шаред мемори, то не полетит
37 sitex
 
naïve
25.01.21
20:51
(36) даже если указано lpс в настройках?
38 Ёпрст
 
25.01.21
20:53
(36) да. У нас скуль с сервером 1с на одном компе, приходилось вырубать все протоколы, чтоб оптимизированный механизм реструктуризации заработал. Нужно было, когда режим совместимости убрали, долгая реструктуризация регистра бухгалтерии была.
39 Ёпрст
 
25.01.21
20:55
минус v2 - невозможно отказаться от изменений, как при обычном обновлении. Т.е если запустил, то сиди и жди :)
40 080808Ник
 
26.01.21
23:53
(36) Реализовано в версии 8.3.11.2867. буржуи вы столичные. в нашем селе клиенты на 8.3.10 сидят)
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.