|
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
|
||||
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) принято к сведению)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |