Имя: Пароль:
1C
1C 7.7
v7: Выгрузка данных из SQL-базы
,
0 vadim777
 
15.11.16
18:34
Конфигурация - ПиБ для Укры, на SQL 2008 под Win SRV 2008. Размер базы 73Гб. Делаю выгрузку, в строке состояния сообщение "Установка соединения с сервером базы данных", и так уже более 2 часов. Загрузка ЦП - в среднем 32%. Сам конфигуратор в диспетчере задач - не отвечает.
Кто работал с такими огромными базами - это нормальное состояние, имеет смысл ждать? Или завис?
PS: попутный вопрос - база расположена на динамическом томе. Загрузка файла выгрузки из рабочей базы длилась больше обычного раза в 3. Динамический том намного медленнее базового?
1 Amra
 
15.11.16
19:36
Не понял, что за выгрузка? В конфигураторе - "выгрузить ИБ" или что?
2 vadim777
 
15.11.16
19:43
(1) Ага..
3 Джинн
 
15.11.16
19:45
(0) Упрется в размер файла и отвалится.
4 pavlika
 
15.11.16
19:50
Если не секрет, то выгрузку для чего делаете?
5 Amra
 
15.11.16
19:52
(3) На NTFS? С чего бы?
(4) Тоже интересно
6 vadim777
 
15.11.16
19:54
(4,5) Не могу сделать удаление помеченных - не хватает памяти. Решил попробовать в dbf, кусками.
7 Klesk666
 
15.11.16
19:56
(0) у меня размер 30 гиг, выгрузка в dt не более 30 минут, может сервер(ы) слабоват(ы)?
(6) ищи нестандартные обработки удаления
8 Amra
 
15.11.16
19:58
(6) Сильно сомневаюсь что развернется в ДБФ
9 vadim777
 
15.11.16
20:08
(7) Может и слабоват компик - проц Q6600, 4Гб ram. Диски правда большие 500гб и 3тб. Вот диск на 3тб - динамический. Может он и тормозит?
10 FN
 
15.11.16
20:28
Это 7.7? Такой размер в dbf никто не выгружает - не взлетит.
Удаляй прямыми запросами. Ну или штатно через удалитьобъекты() порциями.
11 vadim777
 
15.11.16
20:32
(10) Штатно порциями не получается - на этапе анализа отваливается с сообщением о нехватке памяти.
А прямыми запросами - ой боюсь-боюсь...
12 Slypower
 
16.11.16
10:31
16 Гб штатно выгружается часа 3, так же в зависшем состоянии. Потом загрузке в дбф, база весит гига 4, пашет. Там же фалов много, но ни один не превышает 2 Гб
13 Ёпрст
 
16.11.16
10:37
(6) ну, секунд за 20 удалится всё.
14 Ёпрст
 
16.11.16
10:39
если хочешь штатненько, то для начала, отключи ЖР в пофигураторе - будет раз в 10 быстрее происходить удаление.
15 Фрэнки
 
16.11.16
10:40
(12) :) сказочник. Это же все зависит от того, что в самой базе, сколько и каких регистров налупили с оборотами и остатками, итогами и для бухии тоже.

У тебя тоже ПиБ была?
16 Slypower
 
16.11.16
12:43
(15) не, я про ТиС) Просто пример)
17 пипец
 
16.11.16
12:47
Если много периодических данных их можно порезать (это раз)
- в скуль ванрианте прямыми все нормально удаляется
18 Это_mike
 
16.11.16
13:00
(15) выгружается-то без итогов...
(0) правильно - сделать пряямыми запросами...
19 varelchik
 
16.11.16
13:15
Дарю.
    лДата=глДатаЗапрета;
    Пока лДата<=ПолучитьДатуТА() Цикл
        Текст="
        |select
        |j.iddoc [Док $Документ],
        |j.iddocdef Док_вид
        |from _1sjourn j (nolock)
        |WHERE
        |j.ismark=1
        |and
        |j.date_time_iddoc<=:ВыбДата~
        |";
        ИТЗ=СоздатьОбъект("ИндексированнаяТаблица");
        Список=СоздатьОбъект("СписокЗначений");
        Запрос.УстановитьТекстовыйПараметр("ВыбДата",лДата);
        Состояние("Удаление документов");
        Запрос.ВыполнитьИНструкцию(Текст,ИТЗ);
        ИТЗ.Выгрузить(Список,,"Док");
        УдалитьОбъекты(Список,1);
        лДата=ДобавитьМесяц(лДата,12);
    КонецЦикла;
20 varelchik
 
16.11.16
13:16
И ни каких перегрузок памяти.
Все красиво удаляется.
правда долго.
но это ничего.
21 Ёпрст
 
16.11.16
13:23
(19) дык ему не только доки, ему все объекты..
Да и УдалитьОбъекты не быстрый метод.
22 varelchik
 
16.11.16
13:26
так я понял что ему документы надо грухнуть
23 Ёпрст
 
16.11.16
13:27
(22) см. (6)
24 Это_mike
 
16.11.16
13:28
(22) не только. всех помеченых объектов
25 Slypower
 
16.11.16
13:43
На просторах есть обработка: удаление доков в средствами SQL.

Процедура Удалить()
    
    SQL_db = СоздатьОбъект("ODBCDatabase");
    SQL_db.Attach1C();
    
    рс = СоздатьОбъект("ODBCRecordset");
    
    Сообщить("Обработка таблиц документов");
    
    Для Счетчик = 1 По Докум.РазмерСписка() Цикл //по таблицам документов
        
        Если Докум.Пометка(Счетчик) = 0 Тогда
            Продолжить;
        КонецЕсли;
        
        ВидДок = Докум.ПолучитьЗначение(Счетчик);
        
        Сообщить(" ..." + ВидДок + "...");
        
        Состояние("...удаляются строки документов...");
        
        ТекстЗапроса = "
            |Delete
            |    Док
            |FROM
            |   $ДокументСтроки." + ВидДок.Идентификатор + " as Док
            |INNER JOIN
            |   _1SJourn ON _1SJourn.IDDoc = Док.IDDoc
            |WHERE
            |    _1SJourn.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~
            |";  
            
        рс.УстановитьТекстовыйПараметр("НачДата", НачДата);
        рс.УстановитьТекстовыйПараметр("КонДата", КонДата);
        
        Попытка
            рс.ВыполнитьИнструкцию(ТекстЗапроса);
            Сообщить("...строки удалены");
        Исключение
            Сообщить("Запрос по строкам документов вида " + ВидДок.Идентификатор + " не выполнился!", "!");
        КонецПопытки;
    
        Состояние("...удаляются шапки документов...");
        
        ТекстЗапроса = "
            |Delete
            |    Док
            |FROM
            |   $Документ." + ВидДок.Идентификатор + " as Док
            |INNER JOIN
            |   _1SJourn ON _1SJourn.IDDoc = Док.IDDoc
            |WHERE
            |    _1SJourn.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~
            |";  
        
        рс.УстановитьТекстовыйПараметр("НачДата", НачДата);
        рс.УстановитьТекстовыйПараметр("КонДата", КонДата);
        
        Попытка
            рс.ВыполнитьИнструкцию(ТекстЗапроса);
            Сообщить("...шапки удалены");
        Исключение
            Сообщить("Запрос по шапкам документов вида " + ВидДок.Идентификатор + " не выполнился!", "!");
        КонецПопытки;
        
    КонецЦикла; //по табоицам документов
    
    Состояние("");
    Сообщить("Обработка таблиц регистров");
    
    Для СчетчикРег = 1 По спРегистров.РазмерСписка() Цикл //по таблицам регистров
        
        ВидРег = спРегистров.ПолучитьЗначение(СчетчикРег);
    
        Сообщить("..." + ВидРег + "...");
    
        ТекстЗапроса = "
        |Delete
        |    Рег
        |FROM
        |   $Регистр." + ВидРег.Идентификатор + " as Рег
        |INNER JOIN
        |   _1SJourn ON _1SJourn.IDDoc = Рег.IDDoc
        |WHERE " + УсловиеПоВидамДок() + "
        |    AND
        |    _1SJourn.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~
        |";  
        
        рс.УстановитьТекстовыйПараметр("НачДата", НачДата);
        рс.УстановитьТекстовыйПараметр("КонДата", КонДата);
        Попытка
            рс.ВыполнитьИнструкцию(ТекстЗапроса);
            Сообщить("...движения удалены");
        Исключение
            Сообщить("Запрос по регистру вида " + ВидРег + " документов вида " + ВидДок.Идентификатор + " не выполнился!", "!");
        КонецПопытки;
        
    КонецЦикла; //по таблицам регистров
    
    //смотрим общие таблицы по всем видам
    
    Сообщить("Обработка общих таблиц");
    
    Сообщить(" ...удаляются проводки...");
    
    ТекстЗапроса = "
        |Delete
        |    Пров
        |FROM
        |   _1SENTRY as Пров
        |INNER JOIN
        |   _1SJourn ON _1SJourn.IDDoc = Пров.DocID
        |WHERE " + УсловиеПоВидамДок() + "
        |    AND
        |    _1SJourn.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~
        |";  
        
    рс.УстановитьТекстовыйПараметр("НачДата", НачДата);
    рс.УстановитьТекстовыйПараметр("КонДата", КонДата);
    
    Попытка
        рс.ВыполнитьИнструкцию(ТекстЗапроса);
        Сообщить("...проводки удалены");
    Исключение
        Сообщить("Запрос по проводкам документов не выполнился!", "!");
    КонецПопытки;
        
    Сообщить(" ...удаляются периодические реквизиты, заполняемые документами...");
    
    ТекстЗапроса = "
        |Delete
        |    Конст
        |FROM
        |   _1SCONST as Конст
        |INNER JOIN
        |   _1SJourn ON _1SJourn.IDDoc = Конст.DocID
        |WHERE " + УсловиеПоВидамДок() + "
        |    AND
        |    _1SJourn.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~
        |";  
        
    рс.УстановитьТекстовыйПараметр("НачДата", НачДата);
    рс.УстановитьТекстовыйПараметр("КонДата", КонДата);
    
    Попытка
        тз = рс.ВыполнитьИнструкцию(ТекстЗапроса);
        Сообщить("...периодика удалена");
    Исключение
        Сообщить("Запрос по периодике не выполнился!", "!");
    КонецПопытки;
    
    Сообщить(" ...удаляются перекрестные ссылки...");
        
    ТекстЗапроса = "
        |DELETE
        |    Док
        |FROM
        |    _1scrdoc as Док
        |INNER JOIN
        |   _1SJourn ON _1SJourn.IDDoc = SUBSTRING(Док.ParentVal, 7, 9)
        |WHERE " + УсловиеПоВидамДок() + "
        |    AND
        |    Док.child_date_time_iddoc BETWEEN :НачДата AND :КонДата~
        |";
    
    рс.УстановитьТекстовыйПараметр("НачДата", НачДата);
    рс.УстановитьТекстовыйПараметр("КонДата", КонДата);
    
    Попытка
        рс.ВыполнитьИнструкцию(ТекстЗапроса);
        Сообщить("...перекрестные ссылки удалены");
    Исключение
        Сообщить("Запрос по перекрестным ссылкам и графам отбора не выполнился!", "!");
    КонецПопытки;
        
    Сообщить(" ...удаляются операции...");
        
    ТекстЗапроса = "
        |DELETE
        |    Док
        |FROM
        |    _1soper as Док
        |INNER JOIN
        |   _1SJourn ON _1SJourn.IDDoc = Док.DocID
        |WHERE " + УсловиеПоВидамДок() + "
        |    AND
        |    Док.date_time_docid BETWEEN :НачДата AND :КонДата~
        |";
    
    рс.УстановитьТекстовыйПараметр("НачДата", НачДата);
    рс.УстановитьТекстовыйПараметр("КонДата", КонДата);
    
    Попытка
        рс.ВыполнитьИнструкцию(ТекстЗапроса);
        Сообщить("...операции удалены");
    Исключение
        Сообщить("Запрос по таблице операций не выполнился!", "!");
    КонецПопытки;
    
    Сообщить(" ...удаляются ссылки из журнала документов...");
    
    ТекстЗапроса = "
        |Delete
        |    _1SJourn
        |FROM
        |   _1SJourn
        |WHERE " + УсловиеПоВидамДок() + "
        |    AND
        |    _1SJourn.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~
        |";  
        
    рс.УстановитьТекстовыйПараметр("НачДата", НачДата);
    рс.УстановитьТекстовыйПараметр("КонДата", КонДата);
    
    Попытка
        рс.ВыполнитьИнструкцию(ТекстЗапроса);
        Сообщить("...ссылки удалены");
    Исключение
        Сообщить("Запрос по ссылкам документов не выполнился!", "!");
    КонецПопытки;
    
    Состояние("...Обрезка лога базы данных...");

    // обрезка ЛОГа базы
    sql="BACKUP LOG "+SQL_db+"
        |    WITH TRUNCATE_ONLY";
    RecSet=рс.Execute(sql);  
    
    sql="DBCC SHRINKDATABASE
        |    ("+SQL_db+", TRUNCATEONLY)";
    RecSet=рс.Execute(sql);
    
    Сообщить("Не забудьте запустить Тестирование и Исправление!");
    Предупреждение("Обработка закончена!");
    
КонецПроцедуры  


Только это пробовалось на ТиС, удаляет все доки. Быстро. Переносил ТА на 2000г.
26 Ёпрст
 
16.11.16
13:50
(25) еще один не читатель
27 Эльниньо
 
16.11.16
14:36
(0) 1cpp.dll есть?
28 Slypower
 
16.11.16
14:36
Чем мог, тем помог))) может что и пригодилось)))
29 Эльниньо
 
16.11.16
14:47