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