#0
by ottto
Потребовалась быстрая удалялка объектов (объектов может удалятся более 10^7). Объекты: справочники, документы. Естественно в более - менее адекватное время эта задача решается если удалять средствами SQL. Пока задачу решал тупо выполнением через АДО текста SQL-запроса типа "DELETE FROM .. WHERE _IDRRef IN (<список гуидов>) " уперся в ограничение что список определяемый конструкцией (v1,v2.....) по размерности не должен превышать 30000. Ну и собственно такая конструкция работает достаточно долго. Хочется поместить все гуиды во временную таблицу, а затем грохать (поскольку чистить нужно не одну таблицу, а таблицу изменений, таблицы табличных частей и т.д.). Собственно для большей части можно свести задачу к тому, что список удаляемых объектов можно определить результатом 1с-кого запроса. Идея писать конвектор 1с-кого в sql запрос меня не очень прельщает. (определение имен полей и передача параметров в списке - много кода) Есть две идее: 1. 1С -ким запросом получить ссылки поместить в запросе во временную таблицу. Обратится SQL- запросом к сгенерированной временной таблице 2. Создать 1с-кий запрос. определить как он транслируется в SQL. заменить SELECT на DELETE :) Собственно вопросы: как бы определить в какой запрос конвертнулся 1с-кий (программно) как определить имя созданной 1с-ким запросом временной таблицы.
#2
by los_hooliganos
как определить имя созданной 1с-ким запросом временной таблицы. - если скуль 2005ый, то заипешься с этим. хотя нарабки есть)))
#8
by H A D G E H O G s
Для примера: INSERT INTO #tt1 (_Q_000_F_000RRef) SELECT _Document45_Q_000_T_001._IDRRef AS _Q_000_F_000RRef FROM _Document45 _Document45_Q_000_T_001 WITH(NOLOCK)
#11
by los_hooliganos
Автор погугли - Enterprise Integrator тамма даже видео трассировки есть из 1с.
#13
by H A D G E H O G s
Даже если узнаешь имя ВТ (из профайлера) - ничего с ней не сделаешь (хм.., может ADO только подцепить), так как 1С оперирует локальными ВТ, а не глобальными
#18
by ottto
запуск удаления может производится не обязательно на сервере БД. Потребуется профайлер ставит на клиента, права altertrace и т.д. хочется через адо. скуль - да 5-й. какие наработки? Думал над этим но думаю всегда можно сделать последний запрос - простеньким) ... не понял:) откуда такая уверенность:)
#19
by los_hooliganos
к локальной временной таблице можно обратиться и из другого сеанса, но надо знать её полное имя.
#24
by H A D G E H O G s
Тупо: 1) Создать справочник, туда залить в 1С ке все удаляемые ссылки В SQL- фильтр при удалении по этому справочнику. Потом его DROPнуть
#33
by ottto
Кстати с регистром сведений может получится - он шустрее пишется и удаляется даже средствами 1с быстро. как?
#34
by los_hooliganos
те берешь селект запрос транслированный, и им через адо сам заливаешь в свою собственную таблицу.
#42
by ottto
это не разово нужно сделать. процедурка должна быть. Вместо метода УдалитьОбъекты будет вывзываться
#43
by los_hooliganos
Кстати профайлер можно настроить на запись трассировки во временный текстовый файл, а 1с-ком запросе написать уникальный ключ. Время от времени парсишь файл профайлера, берешь запрос и вперед.))
#44
by H A D G E H O G s
Интересно вот, а 1С овцы используют локальные ВТ вместо глобальных чтобы не заморачиваться с коллизиями при многопользовательских подключениях? Так ведь сеанс Сервера Приложений - один. Не пойму...
#46
by H A D G E H O G s
Писать аналог УдалитьОбъекты да еще с контролем ссылочной целостности на SQL - нереально! Поэтому - в 1С ->РегСведений-> из него уже удаляем...
#51
by ottto
Контроль ссылочности никто не требовал. -удаляемые этой процедуры и справочники на момент удаления будут проверены средствами 1с. Нужно просто грохнуть массив ссылок.
#55
by H A D G E H O G s
З.Ы. А РС лучше чем справочник - так как 1) Нет 3-х индексов по умолчанию присутствующих у справочника 2) Нет контроля уникальности кода 3) Нет генерации ГУИДа
#56
by los_hooliganos
Вообщем вопрос из разряда: Почему нельзя писать SELECT * FROM... в рабочих базах.
#60
by los_hooliganos
а приколись 2 8ные базы на одном сервере. и обе создали временные таблицы и...
#64
by ottto
я так понимаю сейчас больше всего людей интересует почему локальные, а неглобальные. Я воспринимаю такое положение как данность:). Задачу мне нужно решить в таких ограничениях, а решать ее в предположениях вот если бы были глобальными - не носит прикладной характер
#65
by Fester Adams
Вообще, если допустим число удаляемых записей из таблицы намного больше оставляемых, то проще выполнить truncate + insert оставляемых. При операции DELETE лучше использовать INNER JOIN - тогда не надо заморачиваться с ограничениями IN
#69
by rsv
Поместите интрересующие вас ссылки в физическую таблицу. И потом delete from ОткудаУдаляем where Поле IN (select Поле from ВашаТаблица).
#70
by H A D G E H O G s
Случаем не надо удалить все помеченные на удаление, без контроля ссылочной целостности?
#75
by rsv
+ delete не быстр. Т.к. пишется инфа еще в лог транзакций. А у Truncate нет условия. Без транзакций но всю таблицу целиком. Так штааааа.
#78
by ottto
нужно же еще поместить в физ таблицу - это тоже потеря времени. сейчас 1000000 элементов конструкцией DELETE FROM WHERE _IDRref in (v1,v2...) удаляются приблизительно 20 минут. Нужно бы сократить раз в 5 - 10
#80
by los_hooliganos
Как увидеть реальное имя временной таблицы: where id = (select object_id('tempdb..#tt1'))
#81
by ottto
Спасибо..., но как еще 1с-ку заставить выполнить такой код - поскольку нужно то именно из ее сеанса, а не АДО:)
#87
by Axel2009
убить все индексы кроме кластерного и удалять. "Собственно для большей части можно свести задачу к тому, что список удаляемых объектов можно определить результатом 1с-кого запроса." нафига тогда во временную таблицу помещать? пищите сразу delete с запросом. если скуль 2005, то там можно delete top 10000 from bla-bla-bla
#89
by Axel2009
преобразовать к виду delete from ОткудаУдаляем inner join (select Поле from ВашаТаблица) on IN поле = поле.
#90
by ottto
посмотрел транслятор. Не работает когда разыменовываешь более чем на одно поле. Например: Запрос: ВЫБРАТЬ Номенклатура.Ссылка ИЗ Справочник.Номенклатура КАК Номенклатура Транслируется в: Select Nomenklatura._IDRRef From _Reference30 As Nomenklatura А так удаление 1000000 заняло 5 минут. - приемлимый результат.
#91
by Axel2009
запусти технологический журнал и будет тебе щастье. там каждый запрос 1сный записывается в файл и какой из него получается скульный.
#92
by Axel2009
и с каких это пор можно к локальной временной таблице одного сеанса, обратиться из другого?
#93
by ottto
проблема в том что временной таблицы нет. ее нужно генерировать запросами - а как менее накладно ее сгенерировать это для меня БОЛЬШОЙ вопрос. мне нужен не разовый запрос... а процедурка УдалитьМногоОбъектов заменитель метода УдалитьОбъекты.
#94
by Axel2009
1. менее накладно ее не генерировать. а удалять порциями. 2. разово ты узнаешь откуда все удаляется. а потом уже этот запрос тянуть в продолжение.
#95
by ottto
ну вот не совсем так. В обработке насколько я понял получается временная таблица и потом данные херятся по конструкцией delete from ... where _iddref in (select _iddref from #table1) результат 3-5 минут если херить порционно: 333 раз по delete from ... where _iddref in (v1,...v30000) то 20 минут. (больше 30000 размер списка сделать нельзя - оптимизатор просит упростить запрос)
#97
by ottto
Смотрю план запроса вроде впорядке все Cluster Index Seek выполняется ровно 1 раз на 30000 порцию.
#98
by Axel2009
delete top 3000 from ОткудаУдаляем t1 inner join (select _iddref from #table1) t2 on IN t1._iddref = t2._iddref только на таблицу #table1 навесить индекс по полю _iddref
#99
by Axel2009
а как его съедает оптимизатор? вызов на каждую строку @p1 or @p2 or @p3 и т.д. 30000 раз, и вызов на каждую строку.
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям
Похожие вопросы 1С
- 1cv8 SQL: Имя SQL сервера и имя SQL базы данных
- v8 строка подключения V8.Connect
- Волшебнику и всем кто поможет по теме "v8 УРБД на v8 за четыре шага"
- v8: при v8 = Новый COMОбъект("V8.Application") дает ошибку ..
- v8: Не могу подключиться из V8 к V8
- v8: есть ли аналоги openconf для 1с v8
- v8: Как удалить 1С v8 ?
- Быстрое удаление помеченных на удаление объектов
- Получить текст запроса для SQL
- Как в построитель запроса передать текст запроса из ТЗ?
В этой группе 1С
- Закрытие кассовой смены
- Обработка заполнения табличных частей
- Номер года в литерале типа 'Дата' превышает 3999
- Автоматический расчет непрерывного стажа в ЗУП
- Как выбрать колонку в поле табличного документа
- УПП 8.1. Постоянные разницы при амортизации ОС. Почему попадают только временные?
- Курсовые разницы при реализации.
- Проводки в документе "Отражение зарплаты в регламентированном учете"
- Не работает стандратная RefPrint
- не выставляется скрытый счет затрат в поступлении товаров услуг
- купюроприемник и 1С
- Как внести начальные остатки по расчетному счету в УТ
- при обмене данными требует пароль
- ЗУП не рассчитывает отпускные
- ЗиУП 8: Табель учета раб времени - не дает поставить дробное (3,5) число часов
- 1с УТ при открытии любого документа склада выдает ошибку отсутствия переменной
- Автоматическое снятие резерва товара
- нумерация документов в новом году
- Пропали рубли с ценников
- Зависание 1С сервера на SQL