![]() |
![]() |
|
Как быстро свернуть большую таблицу значений? | ☑ | ||
---|---|---|---|---|
0
eeyore
10.07.09
✎
17:30
|
Создаю ТЗ:
ТЗ = Новый ТаблицаЗначений; ТЗ.Колонки.Добавить("Подразделение", Новый ОписаниеТипов("СправочникСсылка.Подразделения")); ТЗ.Колонки.Добавить("Продукция", Новый ОписаниеТипов("СправочникСсылка.Номенклатура")); ТЗ.Колонки.Добавить("ВесПродукции"); ТЗ.Колонки.Добавить("КоличествоПродукции"); ТЗ.Колонки.Добавить("СуммаЗатратНаВесПродукции", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2))); ТЗ.Колонки.Добавить("КоличествоМатериалаНаВесПродукции", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3))); ТЗ.Колонки.Добавить("Счет"); ТЗ.Колонки.Добавить("Субконто1"); ТЗ.Колонки.Добавить("Субконто2"); ТЗ.Колонки.Добавить("Субконто3"); ТЗ.Колонки.Добавить("Материал"); ТЗ.Колонки.Добавить("ЭтоПолуфабрикат", Новый ОписаниеТипов("Булево")); Заполняю ее в обработке - получаю ~200 000 записей Далее стоит задача свернуть ее, по такому правилу: ТЗ.Свернуть("Подразделение, Продукция, ЭтоПолуфабрикат, Материал, КоличествоПродукции", "КоличествоМатериалаНаВесПродукции, СуммаЗатратНаВесПродукции"); После сворачивания - в таблице остается в 2 раза меньше записей, НО 1с сворачивает ее 1 час. Как решить вопрос со скоростью? |
|||
1
Лефмихалыч
10.07.09
✎
17:31
|
(0) запросом пробовал?
|
|||
2
73
10.07.09
✎
17:31
|
Запросом не пробовал?
|
|||
3
eeyore
10.07.09
✎
17:33
|
(1),(2) - забыл уточнить у меня платформа 8.0
|
|||
4
НЕА123
10.07.09
✎
17:34
|
индексы могет помогут, но не уверен.
|
|||
5
GedKo
10.07.09
✎
17:37
|
(0) а может в обработке не добавлять строки, а искать по нужным критериям уже созданные строки и изменять значения?
|
|||
6
eeyore
10.07.09
✎
17:37
|
(4) к сожалению индексы только в 8.1 а у меня 8.0, к тому же там с индексами нюанс:
"Индекс индексирует строковое представление ссылочного объекта, а не сами ссылки" |
|||
7
НЕА123
10.07.09
✎
17:37
|
+(4)но в 80 индексов вроде тоже нет.
|
|||
8
Лефмихалыч
10.07.09
✎
17:39
|
может заюзать xBase? там и индексы есть, и можно через ОЛЕДБ запросом свернуть
|
|||
9
GedKo
10.07.09
✎
17:39
|
или писать напрямую в какую-нить скл таблицу и доставать запросом
|
|||
10
eeyore
10.07.09
✎
17:41
|
(5) - в принципе вариант, я об этом думал, только это значительно усложняет наглядность кодо - т.е. я формирую не одну таблицу для нескольких расчетов, которую затем группирую под каждый вид расчета, а создаю отдельную таблицу для каждого расчета. Мне такой вариант не очень импонирует, но если лучше решения не найдется то придется идти по этому пути.
|
|||
11
НЕА123
10.07.09
✎
17:43
|
(0)
колонки, которые не участвуют в свернутой таблице нужны? если нет то и не добавлять, если нужны, то типизировать все. |
|||
12
eeyore
10.07.09
✎
17:45
|
(9) - идею понравилась, а как из 1с 8.0 напрямую с sql работать? Можешь ссылку дать или пример кода?
|
|||
13
НЕА123
10.07.09
✎
17:45
|
+(11) в 77 это сильно убыстряло.
|
|||
14
Живой Ископаемый
10.07.09
✎
17:46
|
а можно базу сконвертить в в81
|
|||
15
eeyore
10.07.09
✎
17:48
|
(8) - c xBase попробую, не понял второй части, а именно как "через ОЛЕДБ запросом свернуть"?
|
|||
16
Живой Ископаемый
10.07.09
✎
17:51
|
2(15) Записать таблицу с 200 т строк в Хбэйс, а ту которую тебе нужно - получить не сворачиванием и скл-запросм через ОЛЕДБ с уже нужными тебе группировками
|
|||
17
НЕА123
10.07.09
✎
17:51
|
(15)
интересно, а сколько отрабатывает после заполнения без свертки ТЗ = Неопределено; не пробовал? |
|||
18
eeyore
10.07.09
✎
17:52
|
(11) - все колонки нужны - т.к. по этой таблице строятся еще такие итоги
ТЗ.Свернуть("Счет, Субконто1, Субконто2, Субконто3", "СуммаЗатратНаВесПродукции"); но тут получается мало(~200)записей и такаое сворачиваение работает быстро - 20сек. Я не понял какой смысл типизировать колонки которые в сворачивании не учавствуют - они же все равно выбрасываются из таблица по теории? |
|||
19
eeyore
10.07.09
✎
17:56
|
(17) - не понял ни вопроса ни идеи.
|
|||
20
НЕА123
10.07.09
✎
17:57
|
(18) освобождение памяти при удалении. например, если тип число, ссылка на объект БД - ниче не проверяется. если СЗ, ТЗ - тоды да.
если не типизировано - всегда смотрит что там. в 77 эффект типизации был огромный. |
|||
21
eeyore
10.07.09
✎
17:58
|
(16) как из 1с работать с OLEDB - через какой объект?
|
|||
22
Живой Ископаемый
10.07.09
✎
17:59
|
2(21) э... через ОЛЕ... примеры искать в гугле.
|
|||
23
eeyore
10.07.09
✎
18:00
|
(20) - ок, с оптимизаций попробую, лишние колонки удалю, посмотрю что получится.
|
|||
24
eeyore
10.07.09
✎
18:00
|
(22) - спасибо за идею - поищу.
|
|||
25
vde69
10.07.09
✎
18:16
|
(0) у меня похожая шняга на 7.7 реализована поэтапным сворачиванием,
обьясню: обработка тянет данные из навижена по куче счетов, после каждого запроса и добавления полей в ТЗ я сворачиваю всю ТЗ, но это только в том случае если итоговая таблица будет не очень большая, в моем случае свертка 1 ляма строк до 50тыс идет примерно 3 минуты |
|||
26
eeyore
10.07.09
✎
18:34
|
(25) - а как в моем случаем можно сделать поэтапное сворачивание? если у меня на 200 000 исходных записей приходится 100 000 конечных? т.е. в среднем одинаковые записи всего в 2х экземлярах. Если бы их было много, то тогда еще понятно.
|
|||
27
Пеппи
10.07.09
✎
18:42
|
на заметку
|
|||
28
vde69
10.07.09
✎
18:57
|
(26) ну в твоем случае мой совет не пойдет
|
|||
29
Злопчинский
10.07.09
✎
19:08
|
Организовать заполнение тз таким образом (порядок исходной выборки данных) чтобы добавить запись в конец, а потом к ней суммировать...
|
|||
30
73
10.07.09
✎
19:09
|
Попробуй построителем.
Вот идея: ТЗ = Новый ТаблицаЗначений; ТЗ.Колонки.Добавить("Номер", Новый ОписаниеТипов("Число")); ТЗ.Колонки.Добавить("Кво", Новый ОписаниеТипов("Число")); ТЗ.Колонки.Добавить("Примечание", Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(20))); Для й=1 по 100000 цикл НовСтр = ТЗ.Добавить(); Новстр.Номер = й; Новстр.Кво = 100000-й; Новстр.Примечание = "Строка "+Цел(й/100); КонецЦикла; ТЗ.ВыбратьСтроку(); ИстДанных = Новый ОписаниеИсточникаДанных(ТЗ); ИстДанных.Колонки.Примечание.Измерение = Истина; ИстДанных.Колонки.Кво.Итог = "Сумма(Кво)" ; ИстДанных.Колонки.Номер.Итог = "Максимум(Номер)" ; ПостроительЗапроса = Новый ПостроительЗапроса; ПостроительЗапроса.ИсточникДанных = ИстДанных; Результат = ПостроительЗапроса.Результат; // отобранные строки типа РезультатЗапроса Выборка = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Примечание"); ТЗ.Очистить(); Пока Выборка.Следующий() Цикл ЗаполнитьЗначенияСвойств(ТЗ.Добавить(), Выборка); КонецЦикла; ТЗ.ВыбратьСтроку(); |
|||
31
Читатель
10.07.09
✎
19:10
|
Колонки типизировать не пробовал ?
|
|||
32
eeyore
13.07.09
✎
11:58
|
(29) - не представляю как это возможно - выборки из запроса нет, тз заполняется на внутреннем языке путем сложного распределения себестоимости используемых в производстве материалов на конечную продукцию.
|
|||
33
eeyore
13.07.09
✎
12:01
|
(31)(20)(13)(11) - типизировал все колонки, которые участвуют в сворачивании, лишнии удалил. Это ничего не дало вообще, как он час сворачивал так и сворачивает.
|
|||
34
eeyore
13.07.09
✎
12:03
|
(33)
ТЗ.Колонки.Добавить("Подразделение", Новый ОписаниеТипов("СправочникСсылка.Подразделения")); ТЗ.Колонки.Добавить("Продукция", Новый ОписаниеТипов("СправочникСсылка.Номенклатура")); ТЗ.Колонки.Добавить("КоличествоПродукции", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3))); ТЗ.Колонки.Добавить("СуммаЗатратНаВесПродукции", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2))); ТЗ.Колонки.Добавить("КоличествоМатериалаНаВесПродукции", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3))); ТЗ.Колонки.Добавить("Материал", Новый ОписаниеТипов("СправочникСсылка.Номенклатура")); ТЗ.Колонки.Добавить("ЭтоПолуфабрикат", Новый ОписаниеТипов("Булево")); ТЗ.Свернуть("Подразделение, Продукция, ЭтоПолуфабрикат, Материал, КоличествоПродукции", "КоличествоМатериалаНаВесПродукции, СуммаЗатратНаВесПродукции"); |
|||
35
eeyore
13.07.09
✎
16:23
|
(30) - спасибо - то что нужно! Запрос за 7 секунд отрабатывает! И еще за 80 секунд я этот запрос преобразовываю в ТЗ.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |