Имя: Пароль:
1C
1С v8
Удаление записей из таблиц 1С прямым SQL запросом
0 KarpovDeniska
 
06.02.12
23:05
SQL_ТекстЗапроса = "
| DELETE  FROM " +  ИмяТаблицы + " WHERE " +  ИмяТаблицы + "._Period <="+"'"+Формат(КонецПериода,"ДЛФ=DT")+"';";

Попытка
Connection.execute(SQL_ТекстЗапроса,,128);
       Исключение
           Сообщить(ОписаниеОшибки());
       КонецПопытки;
1 Чайник Рассела
 
06.02.12
23:06
гениально.
Бекап сделал?
2 Господин ПЖ
 
06.02.12
23:06
и чо?
3 KarpovDeniska
 
06.02.12
23:08
))))))))))  Извиняюсь не дописал, случайно отправил  )), собственно текст запроса выше. У меня вопрос: при выполнении этого запроса когда период не большой, запрос как бы выполняется , но данные не меняются,т.е как было 100 регистраторов так и остаётся. когда делаю период около года, тогда запрос начинает отрабатывать нормально и всё чистит, в чём проблема может быть??
4 aleks-id
 
06.02.12
23:11
а ты рисковый...
5 KarpovDeniska
 
06.02.12
23:12
агась, база 600 гигов  )))
6 also
 
06.02.12
23:32
drop table пиши сразу, не ошибешься
7 Попытка1С
 
06.02.12
23:46
Зачем тебе 1с тут... открывай квери и вперед..
8 KarpovDeniska
 
07.02.12
08:17
(7) это не решает проблему, в qa результат тот же
9 rs_trade
 
07.02.12
08:23
(8) запрос как бы выполняется, это как?
10 KarpovDeniska
 
07.02.12
09:23
(9) т.е Выполняется, нормально отрабатывает, в исключение не попадает, только очень быстро, такое ощущение, как будто для пустой таблицы отрабатывает, хотя за это период выборку делаю, всё ок
11 Ненавижу 1С
 
гуру
07.02.12
09:26
интересно, если это РН, то как быть с итогами?
12 Ёпрст
 
07.02.12
09:27
(3)
И где там  в запросе ограничение на период? там только на дату
13 Ёпрст
 
07.02.12
09:29
(11) пересчитает потом. вот другие зависимые таблички надо бы тоже чистить еще
14 KarpovDeniska
 
07.02.12
09:30
(12) Бли, с начала года по эту дату 100 доков например, потом прибавляю к дате 6 месяцев, получается 10000 доков, вот когда 10000 начинает чистить, когда меньше фиг ( это утрированно)
15 KarpovDeniska
 
07.02.12
09:30
(11) я итоги отключил, а какие ещё зависимые???
16 ОчкарикСлава
 
07.02.12
09:31
(15) ну регистры, наприемр "Списанные товары" для РТУ  и т.д.
17 Sammo
 
07.02.12
09:32
К слову - будет сильно разбухать файл лога (при модели фул).
Для сокращенияМожно делать - select во временную табличку по условию. Дропаешь старую, переименовываешь временную в старое наименование.
+ проверь конец периода.

P.S. Имхо - лучше использовать штатные механизмы.
18 ОчкарикСлава
 
07.02.12
09:32
А чем штатная обработка не катит?
19 KarpovDeniska
 
07.02.12
09:32
Штатными 14 дней чистилось всё, и мы забили
20 Sammo
 
07.02.12
09:33
(15) Зависит от очищаемой таблицы. Здесь нет контроля ссылочной целостности. Например, грхнешь счет, а наклданые оставишь - появятся битые ссылки.
21 KarpovDeniska
 
07.02.12
09:33
мож кто нить знает как побыстрому очистить РН кроме как с отбором по регистратору?
22 zelebobi4
 
07.02.12
09:34
(15)
Гм.Например чистишь таблицу документов заказ покупателя. А на основании заказа  вводидтся  реализация товаров.  (В ут типовой такое есть) То если удалить заказ, в док-те реализация будет ссылка на несуществующую запись.
Собственно в этом есть минус - надо все связи проработать.
23 ptiz
 
07.02.12
09:34
Вместо
Формат(КонецПериода,"ДЛФ=DT")

я бы для уверенности сделал так

"CONVERT(datetime, '" + Формат(Дата, "ДФ='yyyy-MM-dd HH:mm:ss'") + "' , 120)"
24 KarpovDeniska
 
07.02.12
09:34
(20) да и фиг сними , перетяну из копии если что по уиду
25 zelebobi4
 
07.02.12
09:34
(21)
Тебе вообще весь надо грохнуть?
26 KarpovDeniska
 
07.02.12
09:35
(23) так пробовал, выдаёт ошибку что то типа неподдерживаемый system type
27 ОчкарикСлава
 
07.02.12
09:35
может лучше перетянуть в пустую базу то что надо оставить?
28 KarpovDeniska
 
07.02.12
09:36
(27) уже думал, непонятно как перетягивать непериодические регистры, которые тоже неслабых размеров
29 KarpovDeniska
 
07.02.12
09:37
(25) ну да, или проще нав все доки грохнуть, тогда и РН потруться
30 Lama12
 
07.02.12
09:38
(0) А лицензию 1С нарушать кто учил?
31 ptiz
 
07.02.12
09:40
Сделай в квари аналайзере SELECT вместо DELETE и посмотри, какие записи возвращает.
32 ptiz
 
07.02.12
09:42
у меня так работает
Процедура ОчиститьРегистрНакопленияВSQL(ИмяРегистра, Дата1, Дата2) Экспорт

   ОбъектМетаданных = Метаданные.РегистрыНакопления[ИмяРегистра];
   
   МассивМД = Новый Массив;
   МассивМД.Добавить(ОбъектМетаданных);
   
   ТаблицаБД = ПолучитьСтруктуруХраненияБазыДанных(МассивМД, Истина);
   
   ИмяТаблицы = ТаблицаБД.Найти("Основная", "Назначение").ИмяТаблицыХранения;
   
   
   // удаляем частями по 500 000 записей
   
   Команда = "DELETE " + ИмяТаблицы + "
             |FROM
             |    (SELECT TOP 500000 _Period FROM dbo." + ИмяТаблицы + "
             |    WHERE _Period >= " + ДатаСтрокойВSQL(Дата1) + " and  _Period <= " + ДатаСтрокойВSQL(КонецДня(Дата2)) + " ORDER BY _Period) as t
             |WHERE t._Period = " + ИмяТаблицы + "._Period";
             
   Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 1 Период ИЗ РегистрНакопления." + ИмяРегистра + " ГДЕ Период МЕЖДУ &Дата1 И &Дата2");
   Запрос.УстановитьПараметр("Дата1", Дата1);
   Запрос.УстановитьПараметр("Дата2", КонецДня(Дата2));
   Результат = Запрос.Выполнить();
   Пока НЕ Результат.Пустой() Цикл
       
       ОбработкаПрерыванияПользователя();
       
           RecSet.Open(Команда, SQLServer, 3, 1, 1);
       
       Результат = Запрос.Выполнить();
       
   КонецЦикла;
   

КонецПроцедуры
33 Sammo
 
07.02.12
09:45
(29) Ага. И обработка удаления табличных частей у документов тоже сделана?
34 Ёпрст
 
07.02.12
09:48
(0) воткни OUTPUT DELETED.* ..увидишь записи, которые удалил..

А так, вот готовая поделка, к примеру:
http://infostart.ru/public/16731/
35 ptiz
 
07.02.12
09:49
(29) Про журналы не забудь, а то весело будет.
36 rs_trade
 
07.02.12
10:44
вместо delete подставь select * и посмотри результат
37 zmaximka
 
07.02.12
11:00
Отважные вы люди как я погляжу
38 rs_trade
 
07.02.12
12:08
(37) а в чем отвага? при наличии определенных знаний работа напрямую со скулем не представляет никакой сложности и опасности. если для вас скуль это нечто темное и неизведанное, тогда конечно.
39 KarpovDeniska
 
07.02.12
12:59
(34) то что нужно ))
40 acsent
 
07.02.12
13:05
так удалять нужно шапку документ, табличные части, движения с пересчетом итогов, журналы, криткрии отбора.
а ты только шапку
41 KarpovDeniska
 
07.02.12
13:21
(40) неее, удаляю все то что ты написал )
42 KarpovDeniska
 
07.02.12
23:15
подскажите кто знает, а на скуле временную таблицу можно вообще переименовать? если нет, то как реальную таблицу можно заменить временной, что то нигде не могу найти как это делается
43 KarpovDeniska
 
07.02.12
23:32
шо, никто не знает чтоль?? тогда ещё один вопрос:

если я сделаю "SELECT * INTO _MyTable FROM _MyTable AS T WHERE T.PERIOD >= '01012012'
Таблица перезатрётся, если такая уже есть в базе??? или будет ошибка на неуникальность имени???
44 s03
 
08.02.12
00:17
http://msmvps.com/blogs/gladchenko/archive/2010/03/09/1761298.aspx#5

вот здесь есть выкладки по массовой загрузке или удалению в SQL
45 s03
 
08.02.12
00:23
(42) заменить сами таблицы - никак, а вот залить данные из одной в другую - смотри пост выше.
А если кратко, то в старой TRUNCATE, и затем
INSERT INTO стараяТаблица WITH (TABLOCK)
SELECT * FROM новаяТаблица

Примерно так
46 Господин ПЖ
 
08.02.12
00:24
(43) зависит от ограничений накладываемых на таблицу
47 rs_trade
 
08.02.12
02:11
(42) а зачем переименовывать временную таблицу?
48 Sammo
 
08.02.12
07:46
Дропаешь старую
drop table 'имя таблицы'
И переименовываешь временную
exec sp_rename 'старое имя', 'новое имя'

Но сие работает, если временная таблицу у тебя физически таблица, а не с #
49 Sammo
 
08.02.12
07:47
(47) Например, отбираешь с отбором во временную без #. Дропаешь старую, переименовываешь временную.
50 Кириллка
 
08.02.12
07:51
(43)Если _MyTable уже есть, то ругнется - 100%.
51 vde69
 
08.02.12
08:14
кто мешает удалять штатными методами?

запускаешь 31 сеансов и в них начинаешь штатно удалять в разных периодах....

в первом сеансе все документы первого числа каждого месяца, во втором второе число...

если база не кривая, никаких блокировок не будет :)
52 vde69
 
08.02.12
08:15
да и лог поставь в симпл на время удаления.... транзакции сделай не очень большие, я-бы сделал по 1 дню
53 vde69
 
08.02.12
08:20
(51) кстати можно 31 регламентных задания, запустить, думаю это будет самое быстрое и правильное, у регламентного задания есть параметр, это будет номером дня в месяце...

надо будет попробовать :)
54 Sammo
 
08.02.12
08:37
+(51) Кстати, только за счет перевода операции на сервер скорость возрастает раза в 2 (один и тот же алгоритм работы)
55 KarpovDeniska
 
08.02.12
09:32
(54) запускали в 10 сеансах на 64 разрядном серваке, 14 дней, окончания не дождались
56 KarpovDeniska
 
08.02.12
09:34
ой, (51)
57 Sammo
 
08.02.12
10:29
(55) С отключенным пересчетом итогов и ОбменДанными.Загрузка = истина?
58 KarpovDeniska
 
08.02.12
10:48
(57) да
59 vde69
 
08.02.12
11:01
конечно не в обиду, но все-же удивляюсь как в 24 года доверили базу в 600 гигов.

лично у меня нет опыта работы с такими базами... 30 - это нормально, а тут 600 :)
60 KarpovDeniska
 
08.02.12
11:07
))) у меня тож нет, а у них вариантов не много, пользователи кричат целыми днями на it отдел, что 1С тупит, документы 30 мин проводится. у них рарус год на аутсорсе работал, и чёт толку ни хрена, тольк косяки
61 KarpovDeniska
 
08.02.12
11:11
подскажите, на что упереться можно в таблице табчасти, какое нить поле типа периода, чтобы можно было тоже все убить раньше какой нить даты.
62 vde69
 
08.02.12
11:11
(60) сделай фоновое задание и пусть полгода удаляет....

а вообще что-то у тебя не правильно там, за 14 дней в 10 потоков можно черта лысого удалить,

что-то у тебя СОВСЕМ не так!!!

удаление идет быстрее записи, на среднем оборудовании запись ляма записей в регистр сведений идет примерно 40 минут (штатной обработкой)

сколько у тебя строк в этом регистре?
63 rs_trade
 
08.02.12
11:12
(61) связь только по шапке.
65 KarpovDeniska
 
08.02.12
11:18
(63) т.е я кидаю доки во врем таблицу, потом говорю " удалить табчасть где табчасть.ссылка в (выбрать ссылка из времдоков);

а так как сначала удаляются доки, а потом таб части, то получается, что если документы удалятся, а на таб частях упадёт на ошибке, или на таймауте, то табчасти уже придётся удалять только все?
66 KarpovDeniska
 
08.02.12
11:21
(62) не путай регистр сведений и накопления
67 vde69
 
08.02.12
11:23
(65) o_O

есть такое слово Транзакция....
68 KarpovDeniska
 
08.02.12
11:23
сведений чистится за 3 минуты, накопления в день 150 тысяч регистраторов где то
69 KarpovDeniska
 
08.02.12
11:23
(67) уже сообразил
70 vde69
 
08.02.12
11:24
(66) ничем не отличается если расчет итогов отключен
71 KarpovDeniska
 
08.02.12
11:24
(68) в регистре 2300000 регистраторов
72 rs_trade
 
08.02.12
11:25
(65) удаляй сначала ТЧ. если доки уже удалил, удаляй тч для которых нет шапок документов. соединяй таблицу тч с основной таблицей и по нулл грохай.
73 vde69
 
08.02.12
11:25
(68) 150тыс документов - это детские обьемы, максимум минут 30...

обнови статистику, отключи итоги
74 KarpovDeniska
 
08.02.12
11:26
итоги отключены
75 vde69
 
08.02.12
11:26
(71) это ДЕТСКИЕ обьемы, даже 7.7 нормально тянет... интересно от куда у тебя 600 гиг???
76 vde69
 
08.02.12
11:28
сейчас выясним что база 20 гигов а все остальное скульный лог, и в конторе нет ни одного спеца по скулю, по этому ни кто ни когда регламенты не делал :)
77 KarpovDeniska
 
08.02.12
11:32
(76) т.е если в документе 1000000 строк то это вообще не важно???
78 KarpovDeniska
 
08.02.12
11:32
(78) и в регистре на 1 док милион записей тоже все равно?
79 vde69
 
08.02.12
11:34
(77) с точки зрения базы почти не важно, если индексировали правильно... единственое - это то что транзакция будет слишком большая (памяти много)

а вообще за такой документ убить нужно....
80 rs_trade
 
08.02.12
11:35
(77) в документе может быть максимум 100000 строк. это на заметку.
81 KarpovDeniska
 
08.02.12
11:37
(80) 2 таб части, в одной контрагенты, в другой номенклатура, контрагентов 500 номенклатуры 5000, движения делаются так: на каждого контрагента выбирается вся номенклатура, итого 2500000 записей
82 vde69
 
08.02.12
11:43
(81) мда.... такого я еще не видел...
тому кто это сделал руки оторвать нафиг...


теперь я понимаю от куда размеры базы :)

переделывай все...

1. документ на 1 контрагента (в шапку)
2. нафига регистр накоплений? это класический регистр сведений...
3. индексы в порядок приводить...
83 KarpovDeniska
 
08.02.12
11:45
(82) ну да, документ мне тоже изначально понравился,про индексы х.з, слышал админы пытались переиндексацию запустить, она часов 20 идёт, столько времени соответственно никто не даёт
84 KarpovDeniska
 
08.02.12
11:46
т.е год с базой точно не делалось никаких регламентов
85 rs_trade
 
08.02.12
11:52
(81) а что за движения? надо смотреть можно ли перепроектировать, что бы не было кросс-джойна.
86 vde69
 
08.02.12
11:56
(84) обнови SQL статистику, скорость возрастет раз в 200
87 KarpovDeniska
 
08.02.12
11:56
(86) а это как и чего?
88 vde69
 
08.02.12
12:00
89 KarpovDeniska
 
08.02.12
12:01
(88) спасибо, а насколько долгая эта процедура?
90 vde69
 
08.02.12
12:02
(89) на 100 гигах минут 20, но пользователи могут работать в это время
91 KarpovDeniska
 
08.02.12
12:04
(81) я думал разбить на 2 регистра просто, в один контрагентов , в другой номенклатуру,ну или  как (82) на одного контра 1 док, но меня съедят, это им 500 доков придётся делать, они же не привыкли
92 rs_trade
 
08.02.12
12:09
(91) да не надо 500 доков делать. в движениях что пишется?
93 vde69
 
08.02.12
12:13
(91) 500 документов должны делатся из одной обработки
94 KarpovDeniska
 
08.02.12
12:18
(93) как вариант, (92) контрагент , номенклатура
95 rs_trade
 
08.02.12
12:19
(94) в ресурсах что хранится?
96 KarpovDeniska
 
08.02.12
12:20
(95) булево
97 rs_trade
 
08.02.12
14:03
(96) типа принадлежность номенклатуры контрагенту?
98 KarpovDeniska
 
08.02.12
14:06
(97) запрет
99 pumbaEO
 
08.02.12
14:10
(98) И это храниться в регистре накопления?
100 rs_trade
 
08.02.12
14:17
(98) периодичность важна, я так понимаю?
101 rs_trade
 
08.02.12
14:30
можно вообще отказаться от регистров. забацать запрос и пусть из доков данные получает. методологически не совсем верно конечно, но зато нету диких объемов регистров.
103 KarpovDeniska
 
08.02.12
16:15
(101) тоже об этом думал,да, периордичность важна
104 KarpovDeniska
 
08.02.12
16:17
(90) узнал у админов, обновление статистики выполняется постоянно. логи 20 гигов, база 600 )))))
105 KarpovDeniska
 
08.02.12
18:41
(101) там выборка среза последних по этому регистру для отчета, если через документы, чет как  то закручено получается (((
106 Ёпрст
 
09.02.12
10:51
(104) Дык шринкани лог..
107 Ёпрст
 
09.02.12
10:51
нафик он в 20 гигов не упал