Вход | Регистрация
    1  2  3   
1С:Предприятие :: 1С:Предприятие 8 общая

О чем молчит 1С (хранение оборотного регистра)

О чем молчит 1С (хранение оборотного регистра)
Я
   KingDzen
 
29.03.13 - 12:44
Коллеги, добрый день!

Крутую штуку обнаружил, на выяснение которой ушло несколько рабочих дней:

Условие:
1С:Предприятие 8.2 (8.2.15.319) размер ее составляет 230 Гб после шринка.
есть документ РеализацияТоваров, в нем три строки и он сделал три движения по регистру ПродажиКомпании.
Выполняю код, чтобы очистить движекния по данному регистру:

Рег = РегистрыНакопления.ПродажиКомпании;
НаборЗаказыПоставщикам  = Рег.СоздатьНаборЗаписей();
НаборЗаказыПоставщикам.Отбор.Регистратор.Установить(Ссылка);
НаборЗаказыПоставщикам.Прочитать();
НаборЗаказыПоставщикам.Очистить();
НаборЗаказыПоставщикам.Записать();

1С показывает, что у этого документа нет движений по данному регистру.

НО ЭТО ВРАНЬЕ!!! Движения есть! Правда 1С про них ничего нам не говорит. Видимо скрывает, чтобы сберечь наши нервы. Лезу на скуле в оборотную таблицу этого регистра _AccumRgTn6629 и вижу эти строки, но с нулевыми ресурсами.
Эти движения абсолютно не влияют на обороты так как все ресурсы у них - нулевые. И все бы ничего, но они занимают место не хуже обычных движений. Индексы на эту таблицу тоже значительно больше, чем без них.

К счастью сама 1С удаляет эти строки с случае рестуктуризации таблиц регистра. В моем случае это случилось после смены типа измерения с ДокументСсылка на ДокументСсылка.ЗаказПокупателя почти случайно. Не все изменения структуры регистра приведут к реструктуризации, но именно эти приводят точно.

Можно еще использовать такую нереграментированную штуку
:
delete from _AccumRgTn6629 where  _Fld6620 = 0 and _Fld6621 = 0 and _Fld6622 = 0 and _Fld7477 = 0

но как ты понимаешь это является нарушением лицензионного соглашения 1С :)

Ну и что с этого, спросишь ты меня. Да, ничего особенного, но эти действия позволили уменьшить размер нашей базы на 45 гигобайт! А также повысить скорость работы отчетов по продажам не десятки процентов.
Все это сравнительно бесплатно и является безусловно "низко висящим фруктом". Одно действие приводит к огромной экономии дискового пространства, ускорению регламентного обслуживания базы и уменьшению времени выполнения отчетов.

А у тебя есть оборотные регистры в конфигурации? :)
Скажите, может я Америку открыл? Нигде не смог найти информацию о подобном поведении системы.

Спасибо!
 
 
   shuhard
 
1 - 29.03.13 - 12:49
(0)[НО ЭТО ВРАНЬЕ!!! Движения есть! Правда 1С про них ничего нам не говорит. Видимо скрывает, чтобы сберечь наши нервы]
валерьянки попей
   KingDzen
 
2 - 29.03.13 - 12:50
С нервами у меня порядок. Я надеюсь получить комментарии по теме.
   Lexusss
 
3 - 29.03.13 - 12:51
Баянист. Как тебя подпускают к боевым конфам? Гораздо прикольнее, что такие фантомные записи могут повлиять на RLS :) И да, они не только в регистре оборотов, но и в накопления прут.
   Широкий
 
4 - 29.03.13 - 12:53
Таблицу итогов регистра накоплений еще глянь..
Инфаркт обеспечен
   KingDzen
 
5 - 29.03.13 - 12:53
Почему баянист? Проблема давно озвучена? Сам не нашел, подскажи, пожалуйста, где читать матчасть про это?
   НафНаф
 
6 - 29.03.13 - 12:55
_AccumRgTn6629 Это итоги оборотов, к таблице движений не имеет отношения
   Широкий
 
7 - 29.03.13 - 12:55
На инфостарте тема была.. и прилагалась обработка.

Стоимость удаления записи дороже апдейта.. вот записи и остаются (хотя и нудевые)
   zmaximka
 
8 - 29.03.13 - 12:55
прикольно
   KingDzen
 
9 - 29.03.13 - 12:56
В регистре накопления тоже видел, но там такого массового безобразия в плане поглощения места на диске нет, так как ежемесячно рассчитываются итоги. В случае же оборотного регистра помогает только реструктуризация (т.е. пересоздание средствами 1С) оборотной таблицы регистра. Или есть еще какой-то способ?
   KingDzen
 
10 - 29.03.13 - 12:58
(7) Да, я так и понял, что дешевле не удалять. Но в моем случае это привело к тому, что база содержит информацию, которая не используется системой (около 17% от размера базы это не шутки) и вредит быстродействию
   KingDzen
 
11 - 29.03.13 - 13:00
(6) _AccumRgTn6629 это таблица, где хранятся обороты по месяцам, можно конечно и как вы сказать, что она содержит итоги.
   Нога
 
12 - 29.03.13 - 13:01
Это рваный баян же, В таблицах ИТОГОВ не удаляются физически записи, ставится 0, только после пересчета итогов они уходят.
Неприятные последствия РЛС может вызвать на эти регистры, данных вроде нет, а нарушение прав доступа
   Зойч
 
13 - 29.03.13 - 13:01
поминится в 81 подобный глюк был для регистров остатков
   KingDzen
 
14 - 29.03.13 - 13:03
(12) Пересчет итогов никак не исправляет фантомные записи ОБОРОТНОГО регистра. Т.е. он растет безконтрольно в процессе работы конфигурации.
   Carpintera
 
15 - 29.03.13 - 13:03
(0) это происходит именно при программной очистке регистра? И что это за очистка аж на 45 гигов?
   Нога
 
16 - 29.03.13 - 13:05
(14) не верю... как итоги пересчитываешь? из пофигуратора?
   Нога
 
17 - 29.03.13 - 13:05
Сжатие данных там же делал?
   KingDzen
 
18 - 29.03.13 - 13:06
(15) Это происходит и при программном удалении через обработку и в случае удаления проведенного документа у которого стоит Удалять движения автоматически при проведении.
Я проверил и был немало удивлен.
   Kreont
 
19 - 29.03.13 - 13:06
Ну хз. вроде ж нормальное поведение любой БД при удалениях всередине таблиц.

А шринк мссюл это тоже что вакуум для постгреса?
Если да, то неверится что шринк часть таких записей не уберет :(
   KingDzen
 
20 - 29.03.13 - 13:07
(17) Нет не по конфигуратору, а через предприятие. А есть разница? Шринк делал конечно же, но средствами скуля. Опять же есть разница?
   Нога
 
21 - 29.03.13 - 13:07
(20) наверняка есть. я бы проверил, на маленькой базе, чтоб часы не ждать
   Нога
 
22 - 29.03.13 - 13:08
Для скуля строки в таблицах с 0 не есть лишние записи, он их не сожмёт. А вот для 1с разница есть
   GROOVY
 
23 - 29.03.13 - 13:08
Открытие века.... Ты еще глянь как удаление файлов происходит...


Ты себе представь как удалять строки из середины таблицы! Сколько это займет времени?
   KingDzen
 
24 - 29.03.13 - 13:09
(19) Не уберет, конечно! С точки зрения скуля это АБСОЛЮТНО нормальные записи. Скуль же не знает, что записи с пустым набором всех ресурсов абсолютно бесполезны с прикладной точки зрения.
   KingDzen
 
25 - 29.03.13 - 13:11
(23) Да я не против, я только за! :) Меня волнует другой вопрос: каким регламентным заданием на обслуживание 1С я могу периодически избавляться от таких записей? Два способа я отразил в посте. Может кто-то знает более красивый вариант, о котором я не знаю?
   Нога
 
26 - 29.03.13 - 13:12
в конфигураторе в ТИИ есть сжатие таблиц
   KingDzen
 
27 - 29.03.13 - 13:14
(26) Спасибо, за совет, действительно есть разница между SHRINK  и Сжатие таблиц в конфигураторе 1С?
   Нога
 
28 - 29.03.13 - 13:15
(27) есть, SHRINK FILE вобще свободное место просто освобождает
   KingDzen
 
29 - 29.03.13 - 13:18
Кстати, задача стоит уменьшение размера базы данных не типовой КИС на основании УТ.
Начал ее решать запуском скрипта, чтобы узнать какие объекты отъедают больше всего места:
    CREATE TABLE #t([имя таблицы] varchar(255), [строк] varchar(255), [зарезервировано] varchar(255), [всего данных] varchar(255), [размер индексов] varchar(255), [свободно] varchar(255));
 
     
    INSERT INTO #t
 
   exec sp_msforeachtable N'exec sp_spaceused ''?''';
   
   SELECT * FROM #t where [имя таблицы] like N'%RgTn%' ORDER BY CONVERT(bigint, REPLACE([всего данных], ' KB', '')) DESC;
     
    DROP TABLE #t;
 
в топе оказалась как раз оборотная таблица _AccumRgTn6629
   Вуглускр1991
 
30 - 29.03.13 - 13:20
лицензионное соглашение это как девочка на фронте в автосервисе, красивая, ухоженная, чай наливает. в гараже все немного иначе.
 
 
   KingDzen
 
31 - 29.03.13 - 13:20
До удаления фантомных записей она занимала 54 гигабайта (оборотная таблица и индекс) или 83 миллиона записей.
После удаления эта таблица стала весить 20 гигабайт или 34 миллиона записей.
   KingDzen
 
32 - 29.03.13 - 13:20
(30) улыбнуло, коллега
   Fragster
 
33 - 29.03.13 - 13:21
(0) А зачем там ".Прочитать(); .Очистить();"?
   Fragster
 
34 - 29.03.13 - 13:21
гигобайт, круто!
   KingDzen
 
35 - 29.03.13 - 13:23
(33) Для надежности. Я знаю, что хватает и Записать().
   Fragster
 
36 - 29.03.13 - 13:24
вообще об этом написано в умных книжках и куче статей по инету. достаточно сделать пересчет итогов и все пройдет
   NcSteel
 
37 - 29.03.13 - 13:25
(35) ТОгда нужно было еще и запрос сделать или удалять по каждой отдельной записи.
   KingDzen
 
38 - 29.03.13 - 13:25
(36) В конфигураторе пересчитать итогов?
   ssh2006
 
39 - 29.03.13 - 13:26
(14) > Пересчет итогов никак не исправляет

Вот это странно и сомнительно
   KingDzen
 
40 - 29.03.13 - 13:26
(37) Коллега, это не по теме :)
   ковер
 
41 - 29.03.13 - 13:26
закладка
   KingDzen
 
42 - 29.03.13 - 13:27
(39) Может все-таки есть разница между пересчитать итоги в конфигураторе и в предприятии? Тогда да - мы никогда не рассчитывали итоги в конфигураторе.
   ssh2006
 
43 - 29.03.13 - 13:27
"Зачем в 1С нужно периодически пересчитывать итоги по регистрам?"
http://infostart.ru/public/177171/
   НафНаф
 
44 - 29.03.13 - 13:29
набросал

ТЗ = ПолучитьСтруктуруХраненияБазыДанных(,Истина);
Для каждого Регистр Из Метаданные.РегистрыНакопления Цикл
    Сообщить("-- "+Регистр.Имя);
    Стр = ТЗ.НайтиСтроки(Новый Структура("Метаданные,Назначение","РегистрНакопления."+Регистр.Имя,?(Регистр.ВидРегистра=Метаданные.СвойстваОбъектов.ВидРегистраНакопления.Остатки,"Итоги","Обороты")));
    ИмяТаблицы = Стр[0].ИмяТаблицыХранения;
    ПоляТаблицы = Стр[0].Поля;
    Условие = "";
    Для каждого Ресурс Из Регистр.Ресурсы Цикл
        Стр = ПоляТаблицы.НайтиСтроки(Новый Структура("ИмяПоля",Ресурс.Имя));
        Условие = Условие + ?(ЗначениеЗаполнено(Условие)," and ","") +Стр[0].ИмяПоляХранения+"=0"; 
    КонецЦикла; 
    Сообщить("delete from "+ИмяТаблицы+" where "+Условие);
КонецЦикла;
   KingDzen
 
45 - 29.03.13 - 13:31
(44) отлично коллега, я на это намекал в посте
   KingDzen
 
46 - 29.03.13 - 13:33
(43) Верно, но в статье говорится только про остатки. Но оборотный регистр хоть и имеет ту же самую проблему фантомных записей - имеет и свою специфику. А именно пересчет итогов для него не устраняет фантомный записи!
   Нога
 
47 - 29.03.13 - 13:35
(46) да проверь уже! на тощей базе.
в пофигураторе Пересчет, потом сжатие там же
   KingDzen
 
48 - 29.03.13 - 13:35
Проблема точно решается реструктуризацией таблицы. Вызывать из конфигуратора - слишком роскошно для меня. База большая и потребуется большое время для выполнение этой операции для всех таблиц - несколько суток точно. Есть более дешевый по времени вариант - вызвать реструктуризацию только таблицы проблемного регистра. Один из способов я описал в посте.
   KingDzen
 
49 - 29.03.13 - 13:39
(47) ща проверю на тестовой и отпишусь
   ssh2006
 
50 - 29.03.13 - 13:40
(46) > пересчет итогов для него не устраняет фантомный записи!

Сложно в это поверить.
   KingDzen
 
51 - 29.03.13 - 13:44
(50) только что проверил - пересчет итогов через 1С Предприятие\ управление итогами - проблему НЕ РЕШАЕТ для оборотных регистров. Оно и так было понятно, так как мы это делаем каждый месяц - все бы давно обрезалось. Для регистров ОСТАТКОВ шлак исчезает. Сейчас запустил пересчитать итоги через конфигуратор. Жду.
   Нога
 
52 - 29.03.13 - 13:44
(50) сдаётся мне, что в режиме предприятия нельзя указать оборотные регистры для пересчета итогов. Из конфигуратора надо
   bodri
 
53 - 29.03.13 - 13:46
(52) В конфигураторе есть выбор? Неожиданно.
   Нога
 
54 - 29.03.13 - 13:48
(53) в конфигураторе пересчитывает абсолютно ВСЁ, выбрать нельзя
   KingDzen
 
55 - 29.03.13 - 13:50
(54) Задумался конфигуратор, что-то он другое делает по сравнению с пересчетом итогов в предприятии. Видимо разница в этих режимах все же есть. Ждем окончания, что же будет с фантомными записями? :)
   ptiz
 
56 - 29.03.13 - 13:51
Да тьфу на вас, навели панику.
У меня нулевых записей оказалось 0.0001 % от общего числа.
   bodri
 
57 - 29.03.13 - 13:52
(55) меня тоже заинтересовало. жду вместе с тобой
   viktor_vv
 
58 - 29.03.13 - 13:53
(55) Что ж они тебя так зацепили :)?
Эта фигня еще с 7.7 тянется, там же на ДБФ еще удаленные записи справочников физически не удалялись.
   Нога
 
59 - 29.03.13 - 13:54
(55) да понятно что другое, минимум - за весь период считает итоги, а не за указанный, ну и фантомчики удаляет может в обротных. Тут я не уверен, возможно это сделает сжатие таблиц БД
   Fragster
 
60 - 29.03.13 - 13:55
(38) ТИИ пересчет итогов тоже спасет. Но можно и в предприятии.
   KingDzen
 
61 - 29.03.13 - 13:57
(56) как это ты так быстро определил?
   ptiz
 
62 - 29.03.13 - 14:00
(61) Обработкой прошелся по всем таблицам SQL
   Нога
 
63 - 29.03.13 - 14:00
(62) пересчет итогов и сжатие давно делали?
   KingDzen
 
64 - 29.03.13 - 14:03
(62) Можно обработку в студию?
   ptiz
 
65 - 29.03.13 - 14:04
(63) Не поверишь, никогда не делали.
На базе в почти 300гб не возникает такого желания :)
   Нога
 
66 - 29.03.13 - 14:05
Да я сейчас тоже занимаюсь в плотную чисткой 150-ти гиговой базы, от помеченых на удаление, чистки регистров кривых, и этой темой тоже надо будет занятся
 
 Рекламное место пустует
   KingDzen
 
67 - 29.03.13 - 14:05
(65) во-во у меня тоже нет желания. Единственно что делаем пересчет итогов в предприятии раз в месяц и шринк средствами скуля.
   KarpovDeniska
 
68 - 29.03.13 - 14:08
итоги пересчитай
   Нога
 
69 - 29.03.13 - 14:09
(68) абсолютно ценный совет, каждый считает своим долгом это тут сказать?)
   KingDzen
 
70 - 29.03.13 - 14:09
(69) не говори, коллега :)
   ILM
 
71 - 29.03.13 - 14:10
(0) "Я вот не трогаю Гондурас, он и не беспокоит" (с).
Если прочитать про механизмы работы SQL серверов, то становится понятно почему так поступает 1С. Удалять и перестраивать индексы и статистику, освобождать память и страницы в он-лайне выходит ох, как затратно. У вас что уже место кончилось? или тормоза повылазили?
Кароче, я бы световал не чесать "Гондурас".
   KarpovDeniska
 
72 - 29.03.13 - 14:10
(69) ну нужно же помочь человеку ))
   ptiz
 
73 - 29.03.13 - 14:12
   KingDzen
 
74 - 29.03.13 - 14:27
Коллеги, запустил на копии рабочей базы пересчет итогов в режиме конфигуратор. Так вот, висит уже полчаса на регистре, который на порядок меньше, чем сабжевый регистр. Интересно, сколько времени должно пройти для переиндексации всех объектов конфигурации и завершится ли она удачно. Возможно мой вариант с реструктуризаций регистра самый разумный вариант в данном случае. Отпишусь в любом случае.
   KingDzen
 
75 - 29.03.13 - 14:28
(73) спасибо за обработку, думаю многим пригодится
   bodri
 
76 - 29.03.13 - 14:47
(73) спасибо за обработку. 0,17% (44 056/25 279 560) не критично)
   Chai Nic
 
77 - 29.03.13 - 15:02
Вопрос. А при выгрузке/загрузке через dt эти нулевые записи сохраняются?
   ssh2006
 
78 - 29.03.13 - 15:04
Думаю, да, т.к. при загрузке итоги не пересчитываются
   Нога
 
79 - 29.03.13 - 15:04
(78) почти всё ТИИ происходит при загрузке выгрузке, думаю что удалятся
   Живой Ископаемый
80 - 29.03.13 - 15:05
2(77) нет, не сохраняются
   ssh2006
 
81 - 29.03.13 - 15:07
незнаю насчет сохранения нулевых записей, а про пересчет итогов при загрузке из dt задавал вопрос на V8@1c.ru, ответили - не пересчитываются
   ssh2006
 
82 - 29.03.13 - 15:08
* но сам не проверял
   Axel2009
 
83 - 29.03.13 - 15:13
да обработка проверил. регистр продажи записей 2 400 000. хотя смотрю записей через count(*) там 5 лямов... хыхы
   Axel2009
 
84 - 29.03.13 - 15:14
(83)+ обработка показывает наличие нулевых записей в основной таблице, а не в итогах. так что переделайте ее быстрее :)
   ssh2006
 
85 - 29.03.13 - 15:16
Посмотрел код обработки - подтверждаю (84)
   ssh2006
 
86 - 29.03.13 - 15:17
переделать несложно
   be-may
 
87 - 29.03.13 - 15:18
(0)спасибо. не знала.
   Фрэнки
 
88 - 29.03.13 - 15:18
(81) я проверял сравнивая размеры файловой версии базы. При загрузке из дт размер практически такой же. При ТИИ (все галки) в моем случае размер снизился на 25% процентов.
   Нога
 
89 - 29.03.13 - 15:19
хм, а то что в клиент-серверной в конфигураторе ТИИ нет "Сжатие таблиц БД" кто замечал? всегда думал что есть...)
   Fragster
 
90 - 29.03.13 - 15:21
(89) делай в скуле, будь мужиком
   Фрэнки
 
91 - 29.03.13 - 15:21
(89) а это чтоб шринк не забывали делать
   Нога
 
92 - 29.03.13 - 15:36
я к тому что значит только Пересчет итогов уберёт (0), была мысль что это сжатие сделает. Шринк скуля их не убирает
   Никола_Питерский
 
93 - 29.03.13 - 15:40
Уважаемые мегагуру специалисты, подскажите нормально
что этот запрос столько выполняется ??
Объект = Хозрасчетный ИтогиПоСчетамССубконто4
 
Команда = SELECT COUNT(*) FROM _AccRgAT410090
Начало выполнения: 29.03.2013 15:36:56
Окончание выполнения: 29.03.2013 15:38:03
   Chai Nic
 
94 - 29.03.13 - 15:42
(92) "Шринк скуля их не убирает"
Ну это логично.. с его точки зрения это обычные строки таблиц, которые он обязан хранить, пока приложение не захочет ух удалять. То, что они хранят бесполезную информацию, известно на прикладном уровне, но на уровне хранения данных они вполне не пустые.
   ptiz
 
95 - 29.03.13 - 15:48
Всем большое спасибо за указание на ошибку, исправил.
Действительно, в итогах много нулевых.
   ptiz
 
96 - 29.03.13 - 15:49
Осталось select заменить на delete и радоваться :)
   Никола_Питерский
 
97 - 29.03.13 - 15:50
(95) Да у тебя там в найти косяк был только по основной таблице долбило )))
   Нога
 
98 - 29.03.13 - 15:51
(96) радоваться тем что ты перступник?) нарушение лиц соглашения, нуралиев негодует и рвёт на себе последние волосы. Пожалей уважаемого Бориса Георгиевича
   ptiz
 
99 - 29.03.13 - 15:52
(98) Это теоретически, я же так не буду делать!
   Alexey87
 
100 - 29.03.13 - 15:53
Сто
  1  2  3   

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