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

v7: Прямые запросы к БД: DELETE частями

v7: Прямые запросы к БД: DELETE частями
Я
   OnePrg
 
04.10.21 - 15:36
Вот этот код

    ТекстЗапроса = "
    |DELETE
    |    _1SUPDTS
    |FROM
    |    _1SUPDTS as U          
    |INNER JOIN
    |   #тбУдалять as тбУдалять ON U.OBJID = тбУдалять.OBJID and U.DBSIGN = тбУдалять.DBSIGN";
    RS.ВыполнитьИнструкцию(ТекстЗапроса);                                                    

при больших объёмах кладёт 1С-ку

Как сделать выполнение его частями?

Думал вот так:

    ТекстЗапроса = "
    |DELETE TOP 1000
    |    _1SUPDTS
    |FROM
    |    _1SUPDTS as U          
    |INNER JOIN
    |   #тбУдалять as тбУдалять ON U.OBJID = тбУдалять.OBJID and U.DBSIGN = тбУдалять.DBSIGN";
    тб = RS.ВыполнитьИнструкцию(ТекстЗапроса);              
        Пока тб.КоличествоСтрок()<> 0 Цикл
           тб = RS.ВыполнитьИнструкцию(ТекстЗапроса);              
        КонецЦикла;                              

но не уверен. ВыполнитьИнструкцию при DELETE возвращает таблицу?
   mikecool
 
1 - 04.10.21 - 15:37
where и описываешь условия пачки
   ДенисЧ
 
2 - 04.10.21 - 15:37
выбрать первые 1000, поместить в вт, потом соединять с этой вт.
   pechkin
 
3 - 04.10.21 - 16:21
ну сделай топ 1 и проверь
   Sserj
 
4 - 04.10.21 - 17:41
При запросе на изменение delete/update/insert ВыполнитьИнструкцию возвращает не таблицу а число - количество обработанных записей.
Т.е. цикл должен быть типа такого:
Пока RS.ВыполнитьИнструкцию(ТекстЗапроса) > 0 Цикл
КонецЦикла
   trad
 
5 - 04.10.21 - 17:43
(0)
set nocount on
delete...
   Sserj
 
6 - 04.10.21 - 17:50
Вообще странно что delete куда-то что-то кладет.
Подозреваю что тут дело не в самом delete а в том как укладывается #тбУдалять.
Если там сотни тысяч строк то как она укладывается. Или она создается запросом.
И еще какие индексы есть у _1SUPDTS, может поможет создание временного индекса по двум полям DBSIGN и OBJID если такого нет.
   trad
 
7 - 04.10.21 - 17:54
   trad
 
8 - 04.10.21 - 17:58
   Sserj
 
9 - 04.10.21 - 17:59
Быстро глянул что такое эта _1SUPDTS.
И с ней явно неправльно работают.
OBJID это id объекта а он не уникальный!
Для документов он сквозной у всех видов документов а у справочников он уникальный только в пределах самого справочника.
Тобишь один ID может быть у какого то документа и у всех видов справочников одновременно.
Поэтому у таблицы иднекс должен быть по трем полям DBSIGN,TYPEID и OBJID и для оптимального соединения в условии join должны быть все эти 3 поля.
А вашим запросом вы можете грохнуть кучу объектов которые грохать не собирались.

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