Имя: Пароль:
1C
1C 7.7
v7: Группировка Индексированной ТЗ на dbf и sql
,
0 Dolly_EV
 
21.12.12
15:05
Переписал отчет по движению товаров на ПрямойЗапрос. Стал сравнивать dbf и sql. Вот результат:

1. dbf (локально, Win7x64, i7+18ГбРАМ+SSD)
Время формирования запроса: 3 секунд, 852 миллисекунд
Время группировки итз: 4 секунд, 883 миллисекунд
Время вывода в таблицу: 26 секунд, 674 миллисекунд

2. dbf+trm (терм. сервер)
Время формирования запроса: 6 секунд, 659 миллисекунд
Время группировки итз: 9 секунд, 301 миллисекунд
Время вывода в таблицу: 57 секунд, 364 миллисекунд

3. sql-trm (тот же сервер что и в 2, sql-сервер - отдельный)
Время формирования запроса: 3 секунд, 582 миллисекунд
Время группировки итз: 4 минут, 22 секунд, 281 миллисекунд
Время вывода в таблицу: 4 минут, 5 секунд, 196 миллисекунд


4. sql+trm (другой сервер терм., sql - физически на нем же)
Время формирования запроса: 7 секунд, 237 миллисекунд
Время группировки итз: 1 минут, 17 секунд, 156 миллисекунд
Время вывода в таблицу: 2 минут, 1 секунд, 938 миллисекунд

разрыв по времени вывода в моксель понятен - там местами идет обращение к реквизитам метаданных из итз

НЕ понятен большой разрыв по группировке ИТЗ для dbf и sql формата:

если трм и скл - разнесены, в 43 (!!!) раза медленнее (хотя тут грешу на криво настроенный SQL-сервер+TRM, в двух вирт.машинах на одной физической железке)

если скл - там же где и каталог ИБ - в 8 раз медленнее ???
Чем отличается группировка ИТЗ для скль и дбф? они же в обоих случаях делаются на клиенте??
1 Dolly_EV
 
21.12.12
15:27
Ап! или уже пятницО? :-(
2 Mikeware
 
21.12.12
15:34
группировка - по иерархии?
3 Dolly_EV
 
21.12.12
15:36
(2) нет, без Групп
"индСкл:Скл;индТовар:Товар;индД:Д" ну и Сумм 4 - 12 штук
4 leshikkam
 
21.12.12
15:39
"индСкл:*Скл;индТовар:*Товар;индД:Д"
а вот так?
5 Dolly_EV
 
21.12.12
15:46
(4) ДА! ДА!ДА!ДА! вместо 1-4 минуты стало 303 мс для sql и 166 мс для dbf! но я не все равно не понимаю - почему при группировке НЕ по внутр. представлению - такой разрыв между форматами?? :-(((
6 Ёпрст
 
21.12.12
15:53
лезет в базу для получения нужного представления
7 Dolly_EV
 
21.12.12
15:56
(6) угу, проясняется... еще момент: когда группировка без "*" - почему агрегатные объекты (Скл,Товар) отсортированы все же не по представлению (и там и там "Наименование")
8 leshikkam
 
21.12.12
15:57
потому что индекс без указания направления сортировки не является сортированным
9 leshikkam
 
21.12.12
15:57
"индСкл:+Скл;индТовар:+Товар;индД:+Д"
10 Dolly_EV
 
21.12.12
16:01
(9) блин, а я всегда думал, что отсутствие "+" означает все же "+" для ИТЗ :-(
leshikkam и Ёпрст4 (как всегда)) СПАСИБО!!
11 leshikkam
 
21.12.12
16:04
(10) не за что - настоятельно рекомендую получать наименование в запросе и там же его сортировать. Тогда можно индексировать по внутреннему представлению (ID) быстро а вывод будет идти в том порядке как Индексированная таблица получена из запроса.
12 Dolly_EV
 
21.12.12
16:05
(11) угу, это я уже понял.
13 leshikkam
 
21.12.12
16:06
(12) Ну давай еще и текст запроса - глянуть может и там есть что поправить.
14 Dolly_EV
 
21.12.12
16:14
ТексЗапросаОстатки

ВЫБРАТЬ
   РегПартОО.Склад КАК [Скл $Справочник.МестаХранения]
   ,РегПартОО.Товар КАК [Товар $Справочник.Номенклатура]
   ,СУММА(РегПартОО.КоличествоНачальныйОстаток) КАК [КоличествоНачОстБазЕд $Число.19.4]
   ,СУММА(РегПартОО.КоличествоКонечныйОстаток) КАК [КоличествоКонОстБазЕд $Число.19.4]
   ,СУММА(РегПартОО.КоличествоНачальныйОстаток/$СпрОснЕд.Коэффициент) КАК [КоличествоНачОстОснЕд $Число.19.4]
   ,СУММА(РегПартОО.КоличествоКонечныйОстаток/$СпрОснЕд.Коэффициент) КАК [КоличествоКонОстОснЕд $Число.19.4]
   ,СУММА(РегПартОО.КоличествоНачальныйОстаток*$СпрБазЕд.Вес) КАК [КоличествоНачОстВес $Число.19.4]
   ,СУММА(РегПартОО.КоличествоКонечныйОстаток*$СпрБазЕд.Вес) КАК [КоличествоКонОстВес $Число.19.4]
   ,СУММА(РегПартОО.КоличествоНачальныйОстаток*$СпрАлк.Емкость/10) КАК [КоличествоНачОстДал $Число.19.4]
   ,СУММА(РегПартОО.КоличествоКонечныйОстаток*$СпрАлк.Емкость/10) КАК [КоличествоКонОстДал $Число.19.4]
ИЗ
   $РегистрОстаткиОбороты.ПартииТоваров(:лНачДата,:лКонДата~,ПЕРИОД,
                                       ,(Товар В (ВЫБРАТЬ val ИЗ #глУсловие2) И 3=3 И Фирма В (ВЫБРАТЬ val ИЗ #глУсловие1) И 4=4)
                                       ,(Товар,Склад,Фирма)
                                       ,(Количество)) КАК РегПартОО
ЛЕВОЕ СОЕДИНЕНИЕ
   Справочник.Номенклатура КАК СпрНом $nolock
ПО
   $СпрНом.ТекущийЭлемент = РегПартОО.Товар И $СпрНом.ТекущийЭлемент В (ВЫБРАТЬ val ИЗ #глУсловие2)
ЛЕВОЕ СОЕДИНЕНИЕ
   Справочник.Единицы КАК СпрОснЕд $nolock
ПО
   $СпрОснЕд.Владелец = $СпрНом.ТекущийЭлемент И $СпрОснЕд.Коэффициент<>0 И $СпрОснЕд.ТекущийЭлемент=$СпрНом.ОсновнаяЕдиница
ЛЕВОЕ СОЕДИНЕНИЕ
   Справочник.Единицы КАК СпрБазЕд $nolock
ПО
   $СпрБазЕд.Владелец = $СпрНом.ТекущийЭлемент И $СпрБазЕд.Коэффициент<>0 И $СпрБазЕд.ТекущийЭлемент=$СпрНом.БазоваяЕдиница
ЛЕВОЕ СОЕДИНЕНИЕ
   Справочник.АлкНоменклатура КАК СпрАлк $nolock
ПО
   $СпрАлк.Товар = $СпрНом.ТекущийЭлемент
СГРУППИРОВАТЬ
   РегПартОО.Склад,РегПартОО.Товар


далее ТекстЗапросаОбороты:


ВЫБРАТЬ
   РегПартОО.Склад КАК [Скл $Справочник.МестаХранения]
   ,РегПартОО.Товар КАК [Товар $Справочник.Номенклатура]
   ,РегПартОО.ТекущийДокумент КАК [Д $Документ]
   ,МАКСИМУМ(РегПартОО.ВидДокумента) КАК [Д_вид]
--    ,МАКСИМУМ($СпрЕд.Наименование) КАК ОснЕд
--    ,МАКСИМУМ($СпрЕд.Коэффициент) КАК ОснЕдКоэфф
   ,СУММА(РегПартОО.КоличествоПриход) КАК [КоличествоПриходБазЕд $Число.19.4]
   ,СУММА(РегПартОО.КоличествоРасход) КАК [КоличествоРасходБазЕд $Число.19.4]
   ,СУММА(РегПартОО.КоличествоПриход/$СпрОснЕд.Коэффициент) КАК [КоличествоПриходОснЕд $Число.19.4]
   ,СУММА(РегПартОО.КоличествоРасход/$СпрОснЕд.Коэффициент) КАК [КоличествоРасходОснЕд $Число.19.4]
   ,СУММА(РегПартОО.КоличествоПриход*$СпрБазЕд.Вес) КАК [КоличествоПриходВес $Число.19.4]
   ,СУММА(РегПартОО.КоличествоРасход*$СпрБазЕд.Вес) КАК [КоличествоРасходВес $Число.19.4]
   ,СУММА(РегПартОО.КоличествоПриход*$СпрАлк.Емкость/10) КАК [КоличествоПриходДал $Число.19.4]
   ,СУММА(РегПартОО.КоличествоРасход*$СпрАлк.Емкость/10) КАК [КоличествоРасходДал $Число.19.4]
ИЗ
   $РегистрОбороты.ПартииТоваров(:лНачДата,:лКонДата~,ДОКУМЕНТ
                                       ,(Товар В (ВЫБРАТЬ val ИЗ #глУсловие2) И 3=3 И Фирма В (ВЫБРАТЬ val ИЗ #глУсловие1) И 4=4)
                                       ,(Товар,Склад,Фирма)
                                       ,(Количество)) КАК РегПартОО
ЛЕВОЕ СОЕДИНЕНИЕ
   Справочник.Номенклатура КАК СпрНом $nolock
ПО
   $СпрНом.ТекущийЭлемент = РегПартОО.Товар И $СпрНом.ТекущийЭлемент В (ВЫБРАТЬ val ИЗ #глУсловие2)
ЛЕВОЕ СОЕДИНЕНИЕ
   Справочник.Единицы КАК СпрОснЕд $nolock
ПО
   $СпрОснЕд.Владелец = $СпрНом.ТекущийЭлемент И $СпрОснЕд.Коэффициент<>0 И $СпрОснЕд.ТекущийЭлемент=$СпрНом.ОсновнаяЕдиница
ЛЕВОЕ СОЕДИНЕНИЕ
   Справочник.Единицы КАК СпрБазЕд $nolock
ПО
   $СпрБазЕд.Владелец = $СпрНом.ТекущийЭлемент И $СпрБазЕд.Коэффициент<>0 И $СпрБазЕд.ТекущийЭлемент=$СпрНом.БазоваяЕдиница
ЛЕВОЕ СОЕДИНЕНИЕ
   Справочник.АлкНоменклатура КАК СпрАлк $nolock
ПО
   $СпрАлк.Товар = $СпрНом.ТекущийЭлемент
--ГДЕ
--    РегПартОО.ТекущийДокумент<>:ПустойИД13 И 5=5
СГРУППИРОВАТЬ
   РегПартОО.Склад,РегПартОО.Товар,РегПартОО.ТекущийДокумент


далее тзОст.Объединить(тзДвиж) и Группировать
Сильно не пинайте, "я еще только учусь" :-(

Хотя, по скорости приемлемо вполне, к тому же запрос написан под формат отчета, которому сто лет, и который (формат) не охота переделывать (хотя стоит)
15 Dolly_EV
 
21.12.12
16:16
(14) Блин, не читабельно (( он (запрос) по множеству условий кусками собирается, и это класс "ПрямойЗапрос"
16 Mikeware
 
21.12.12
16:18
(15) ну и соединяй оба - по остаткам и по оборотам,
получай свои сальдо...
17 Mikeware
 
21.12.12
16:18
и выкинь фирму из списка измерений - получишь сразу сгруппированииый, не надо будет группировку
18 Mikeware
 
21.12.12
16:19
и вслед - сортируй  сразу по складу, товару, виду
19 Ёпрст
 
21.12.12
16:22
(14) выкини измерение фильтра из скобочек измерений в ВТ+
можно заменить на 2 запроса к ВТ Останки через юнион, будет быстрее, чем через ОстаниИОбороты.

+ непонятно, если потом обороты, то почему отдельно ?

в общем, моя твоя непонимат
20 Ёпрст
 
21.12.12
16:23
ну и тзОст.Объединить(тзДвиж) ..это ни разу не быстро, как и группировать
21 Dolly_EV
 
21.12.12
16:23
(16) поподробнее? в ЗапросОстатков навтыкать "0 КАК [Приход]"
и UNION ALL с ЗапросДвижений (куда навтыкать "0 КАК [Остаток])?
(17) ну как бы есть вариант, что несколько фирм
(18) это уже уяснил из вышенаписанного
22 Ёпрст
 
21.12.12
16:25
Короче, тут нужен один запрос к останкамиоборотам и привет.
23 Dolly_EV
 
21.12.12
16:27
(19) изначально пытался вообще одну ВТ ОстанкиОбороты, но с группировкой по докам (и одновременно с останками) - не выходит каменный цветок
2 запроса к ВТ останки через юнион - это понятно, просто пока не переписал (из изначального проще было ТекстЗапроса=СтрЗаменить(ТекстЗапроса,"ОстанкиОбороты","Останки")
(22) группировка Документы
Прямой запрос (1Sqlite) отсутствует ВидДокумента
24 Dolly_EV
 
21.12.12
16:28
Ладно, всем спасибо, у нас уже сильно "конец света"!! (22:25)
25 Dolly_EV
 
21.12.12
16:31
(17)(19) - это да, про Фирму, забыл... просто у меня на форме вилка показывать/не показывать Склады (если не показывать - то вместо Скл идет Фирма)... в измерениях надо тоже вилку
26 ADirks
 
21.12.12
17:52
(7) Потому что при указании "*" группировка (и сортировка соотв.) выполняется по внутреннему представлению, т.е. по ID. А вовсе не потому что (8) тебе написал.

А вообще, нафиг тебе ИТ, если ты данные запросом получаешь? В запросе и отсортируй как надо.
27 Salimbek
 
21.12.12
18:00
(5) А если еще воспользуешься этим:
--------------
http://www.1cpp.ru/docum/icpp/html/IndexedTable.html#group

Если в таблице есть колонка с именем '<ИмяКолонкиСправочника>_Родитель', то родитель для элемента будет браться из этой колонки - это уменьшает количество обращений к базе, и заметно увеличивает производительность.
--------------
то скорость еще поднимется
28 ADirks
 
21.12.12
18:05
(27) так у него же без иерархии группировка
29 Dolly_EV
 
22.12.12
10:44
(26) а без указания модификаторов для агрегатного объекта и без указания направления (+/-) сортировка все же как осуществляется?
(27) Товар в зависимости от настроек на форме м.б. с иерархией или без, естественно использую "&"
30 ADirks
 
22.12.12
14:09
По умолчанию: по представлению, по возрастанию, без иерархии
Если с иерархией, то родителя будет оч. полезно вытащить
31 Mikeware
 
22.12.12
14:53
+(30) благо вытащить родителя - практически ничего не стОит. ну и добавить в выборку как наименование (скорее всего представление по наименованию). Неоптимально в смысле памяти, но ускорит группировки.
хотя все-таки лучше собирать данные в запросе, группировку использовать только для построения иерархии и итогов по ней
32 Dolly_EV
 
23.12.12
07:39
(30)(31) принято к сведению)
Закон Брукера: Даже маленькая практика стоит большой теории.