|
как оптимизировать запрос 1с 8 | ☑ | ||
---|---|---|---|---|
0
Anabella
08.04.15
✎
10:24
|
Есть вот такой запрос. И он здорово тормозит отчет. Как его оптимизировать? Спасибо.
ВЫБРАТЬ ВЫБОР КОГДА ЗаказыКлиентовОбороты.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг ТОГДА ЗаказыКлиентовОбороты.СуммаОборот * -1 ИНАЧЕ ЗаказыКлиентовОбороты.СуммаОборот КОНЕЦ КАК СуммаОборот, ЗаказыКлиентовОбороты.Номенклатура, ВТ.ГруппыТоваров ИЗ РегистрНакопления.ЗаказыКлиентов.Обороты(, , Регистратор, ) КАК ЗаказыКлиентовОбороты ЛЕВОЕ СОЕДИНЕНИЕ ВТ КАК ВТ ПО ЗаказыКлиентовОбороты.Номенклатура = ВТ.Ссылка ГДЕ ЗаказыКлиентовОбороты.Регистратор = &Регистратор |
|||
14
Anabella
08.04.15
✎
10:45
|
(13) Насколько я знаю всегда быстрее отчет работает если обращаться к виртуальным таблицам, а не к самому регистру.
|
|||
15
Anabella
08.04.15
✎
10:45
|
(13) или это не так ?
|
|||
16
vi0
08.04.15
✎
10:52
|
(0) какую задачу решаешь запросом?
может быть анализировать приход/расход и не задействовать регистратор? |
|||
17
ViSo76
08.04.15
✎
10:52
|
(15) Это было бы так если бы было обращение к остаткам, а обороты будет строиться из РегистрНакопления.ЗаказыКлиентов применяя группировку по , Регистратор, и выбранные измерения в ВЫБРАТЬ.
В вашем случае вы вытаскиваете все движения по регистру накопления за все время, они группируются по правилу выше, потом ( если это MS SQL ) режется по ГДЕ и потом делается ЛЕВОЕ СОЕДИНЕНИЕ, если файловая то левое соединение будет первым потом урезка по ГДЕ ( вроде так ) |
|||
18
Гёдза
08.04.15
✎
10:53
|
тут таблица оборотов и не нужна
|
|||
19
vi0
08.04.15
✎
10:54
|
(0) попробуй проиндексировать ВТ по Номенклатура
|
|||
20
Anabella
08.04.15
✎
10:58
|
(16) задача следующая: "покажи мне какая номенклатура была оплачена!" мне приходится собирать все документы оплаты, а потом по каждому документу оплаты проверять документ-основание (реализация или заказ), и сумму оплаты разносить по всем позициям номенклатуры этого документа.
|
|||
21
Anabella
08.04.15
✎
10:59
|
(7) Сделала так: РегистрНакопления.ЗаказыКлиентов.Обороты(&МоментВремени, &МоментВремени, , )
не прокатило, по моменту времени он ничего не находит. |
|||
22
Anabella
08.04.15
✎
11:00
|
(17) спасибо за объяснение, сейчас попробую
|
|||
23
vi0
08.04.15
✎
11:00
|
(20) а ЗаказыКлиентов двигают документы оплаты?
|
|||
24
vi0
08.04.15
✎
11:00
|
в регистр ЗаказыКлиентов пишут документы оплаты?
|
|||
25
AndreyBarmaley
08.04.15
✎
11:00
|
Добавь в параметру виртуальной таблицы отбор по номенклатуре из ВТ
ИЗ РегистрНакопления.ЗаказыКлиентов.Обороты( , Номенклатура В (ВЫБРАТЬ ВТ.Ссылка ИЗ ВТ КАК ВТ) , Регистратор, ) КАК ЗаказыКлиентовОборот |
|||
26
Anabella
08.04.15
✎
11:02
|
(23) нет, сначала я из другого регистра достаю документы оплаты и документ-основание, а потом по документ-основание делаю запрос, который вы и видите выше. я пыталась реализовать это в одном запросе, но, честно говоря, такая ерунда получилась...
|
|||
27
vi0
08.04.15
✎
11:06
|
(26) у вас в одном документе реализации только одна номенклатура? если нет, то вы уверены что задача методически верна сама по себе?
|
|||
28
vi0
08.04.15
✎
11:07
|
(25) тут надо понять что именно содержит ВТ
а то, теоритически, такое условие может наоборот замедлить запроса |
|||
29
Anabella
08.04.15
✎
11:11
|
(27)Нет, не одна. Но отчет выдает правильный результат. Методически это решение кажется мне наиболее правильным, но я, конечно, могу ошибаться.
Насчет ВТ. Начальник пожелал чтобы номенклатура была разбита на 6 разделов в отчете - инвентарь, оборудование итп. Проще всего было реализовать это, просто разместив её по 6 нужным папкам. Но "менеджеры привыкли к текущей схеме, менять нельзя"! Пришлось пойти обходным путем. Вот запрос ВТ: ВЫБРАТЬ | Номенклатура.Ссылка КАК Ссылка, | ВЫБОР | КОГДА Номенклатура.Наименование ПОДОБНО ""Дизайн-проект%"" | ТОГДА ""Дизайн-проект"" | КОГДА Номенклатура.Ссылка В ИЕРАРХИИ | (ВЫБРАТЬ | Номенклатура.Ссылка | ИЗ | Справочник.Номенклатура КАК Номенклатура | ГДЕ | (Номенклатура.Наименование ПОДОБНО ""Видеонаблюдение"" | ИЛИ Номенклатура.Наименование ПОДОБНО ""Запчасти"" | ИЛИ Номенклатура.Наименование ПОДОБНО ""запасные части"" | ИЛИ Номенклатура.Наименование ПОДОБНО ""Оборудование"")) | ТОГДА ""Оборудование"" | КОГДА Номенклатура.Ссылка В ИЕРАРХИИ | (ВЫБРАТЬ | Номенклатура.Ссылка | ИЗ | Справочник.Номенклатура КАК Номенклатура | ГДЕ | (Номенклатура.Наименование ПОДОБНО ""Кухонная посуда"" | ИЛИ Номенклатура.Наименование ПОДОБНО ""Сервировка"" | ИЛИ Номенклатура.Наименование ПОДОБНО ""Скатерти, салфетки"" | ИЛИ Номенклатура.Наименование ПОДОБНО ""Скатерти, салфетки одноразовые"" | ИЛИ Номенклатура.Наименование ПОДОБНО ""Скатерти, салфетки тканевые"" | ИЛИ Номенклатура.Наименование ПОДОБНО ""Стекло барное"" | ИЛИ Номенклатура.Наименование ПОДОБНО ""Фарфор, керамика"")) | ТОГДА ""Посуда"" | КОГДА Номенклатура.Ссылка В ИЕРАРХИИ | (ВЫБРАТЬ | Номенклатура.Ссылка | ИЗ | Справочник.Номенклатура КАК Номенклатура | ГДЕ | Номенклатура.Наименование ПОДОБНО ""Столовые приборы"") | ТОГДА ""Столовые приборы"" | КОГДА Номенклатура.Ссылка В ИЕРАРХИИ | (ВЫБРАТЬ | Номенклатура.Ссылка | ИЗ | Справочник.Номенклатура КАК Номенклатура | ГДЕ | (Номенклатура.Наименование ПОДОБНО ""Барный инвентарь"" | ИЛИ Номенклатура.Наименование ПОДОБНО ""Инвентарь для пищевых цехов"" | ИЛИ Номенклатура.Наименование ПОДОБНО ""Инвентарь для фаст-фуда"" | ИЛИ Номенклатура.Наименование ПОДОБНО ""Кондитерский инвентарь"" | ИЛИ Номенклатура.Наименование ПОДОБНО ""Поварской инвентарь"" | ИЛИ Номенклатура.Наименование ПОДОБНО ""Спецодежда"" | ИЛИ Номенклатура.Наименование ПОДОБНО ""Ритейл"" | ИЛИ Номенклатура.Наименование ПОДОБНО ""Кухонный инвентарь"" | ИЛИ Номенклатура.Наименование ПОДОБНО ""Хозтовары"")) | ТОГДА ""Инвентарь"" | КОГДА Номенклатура.Ссылка В ИЕРАРХИИ | (ВЫБРАТЬ | Номенклатура.Ссылка | ИЗ | Справочник.Номенклатура КАК Номенклатура | ГДЕ | Номенклатура.Наименование ПОДОБНО ""Мебель"") | ТОГДА ""Мебель"" | КОГДА Номенклатура.Ссылка В ИЕРАРХИИ | (ВЫБРАТЬ | Номенклатура.Ссылка | ИЗ | Справочник.Номенклатура КАК Номенклатура | ГДЕ | Номенклатура.Наименование ПОДОБНО ""Проекты"") | И Номенклатура.Наименование ПОДОБНО ""%проект%"" | ТОГДА ""Проекты"" | КОГДА Номенклатура.Ссылка В ИЕРАРХИИ | (ВЫБРАТЬ | Номенклатура.Ссылка | ИЗ | Справочник.Номенклатура КАК Номенклатура | ГДЕ | Номенклатура.Наименование ПОДОБНО ""Фирменный стиль"") | ТОГДА ""Фирменный стиль"" | ИНАЧЕ """" | КОНЕЦ КАК ГруппыТоваров |ПОМЕСТИТЬ ВТ |ИЗ | Справочник.Номенклатура КАК Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Ссылка" |
|||
30
МихаилМ
08.04.15
✎
11:12
|
(0)
условия лучше указывать в условиях виртуальной таблицы ВЫБОР КОГДА ЗаказыКлиентовОбороты.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг ТОГДА ЗаказыКлиентовОбороты.СуммаОборот * -1 ИНАЧЕ ЗаказыКлиентовОбороты.СуммаОборот это действие относится не к выботке данных а к представлению данных. соответственно обрабатывайте не на субд. |
|||
31
Anabella
08.04.15
✎
11:15
|
(30) спасибо!
|
|||
32
vi0
08.04.15
✎
11:17
|
(30) это не факт
если важна скорость то нужно замеры делать, где будет быстрее на сервере или клиенте |
|||
33
vi0
08.04.15
✎
11:18
|
(29) вы же понимаете, что такой хардкодинг потенциально неустойчивый?
|
|||
34
ViSo76
08.04.15
✎
11:19
|
К стати ЗаказыКлиентовОбороты.СуммаОборот * -1 достаточно заменить на -ЗаказыКлиентовОбороты.СуммаОборот перемножения не будет
|
|||
35
AndreyBarmaley
08.04.15
✎
11:19
|
Я бы в ВТ еще бы оплаченные заказы клиента добавил:
ВЫБРАТЬ ЗаказыКлиентовОбороты.Номенклатура, ЗаказыКлиентовОбороты.ЗаказаноПриход - ЗаказыКлиентовОбороты.ЗаказаноРасход КАК Оборот ИЗ РегистрНакопления.ЗаказыКлиентов.Обороты( , , Авто, (ЗаказКлиента, Номенклатура) В (ВЫБРАТЬ РАЗЛИЧНЫЕ ВТ_ЗК.ЗаказКлиента, ВТ_ЗК.Номенклатура ИЗ ВТ_ЗК КАК ВТ_ЗК)) КАК ЗаказыКлиентовОбороты |
|||
36
vi0
08.04.15
✎
11:19
|
(29) тогда совет в (25) точно не нужен
|
|||
37
D_E_S_131
08.04.15
✎
11:20
|
Если нужно получить движения документа по регистру "ЗаказыКлиентов" с условием по номенклатуре, то быстрее будет обращаться к реальной таблице и ее данные соединять с номенклатурой из ВТ.
|
|||
38
ViSo76
08.04.15
✎
11:23
|
(29) Вам нужно вместо
ВЫБОР ... КОГДА Номенклатура.Ссылка В ИЕРАРХИИ лучше сделать отборы с условием В ИЕРАРХИИ И потом эти оборы ОБЪЕДИНИТЬ ВСЕ я думаю это будет быстрее значительно. |
|||
39
D_E_S_131
08.04.15
✎
11:24
|
Пока писал коммент по регистру не успел увидеть запрос выборки номенклатуры. Вот где дикая дичь! Построитель плана запроса "сойдет с ума" от такого точно.
Все предопределенные папки выносите в массивы и передавайте как параметр, а уже потом только используйте "В ИЕРАРХИИ(&НаборПапок1)", "В ИЕРАРХИИ(&НаборПапок2)"... |
|||
40
Anabella
08.04.15
✎
11:24
|
(39) Спасибо! Знаю, что топорно, а как грамотно сделать не знала. Попробую по-вашему.
|
|||
41
D_E_S_131
08.04.15
✎
11:25
|
+ к (38), разнести куски по подзапросам, меняя условия вхождения в иерархию.
|
|||
42
ViSo76
08.04.15
✎
11:26
|
(39) Нахуа так делать? В начале вытащить на клиента, потом отправить на сервер... Всё в одном запросе через виртуальную таблицу, просто запрос написать нормально.
|
|||
43
ViSo76
08.04.15
✎
11:28
|
В запросах у неё всё плохо, но глаза шикарные :)
|
|||
44
D_E_S_131
08.04.15
✎
11:32
|
(42) С чего взял, что что-то передается между кл и серв? Откуда вообще мы знаем, что это все в УП происходит?
А время на формирование ВТ, индексирование ее полей учитываешь? И конструкция "В ИЕРАРХИИ(Выбрать ПапкаСсылка ИЗ..)" будет медленнее работать чем "В ИЕРАРХИИ(&ВыбПапки)" — х.з. из-за чего, но экспериментально быстрее получается. |
|||
45
МихаилМ
08.04.15
✎
11:36
|
(29) бред редкостный. но 25 лет я писал также.
у Вас тяжелай форма болезни одинесника: путать получение данных с представлением данных. методически Ваше решение плохое, тк будет требовать постоянной доработки отчета, для добавления удаления групп . замените ваш список на бд РС либо справочник. Альтернативное видение иерархий, группировок, фильтров - это нормальная часть бизнес процессов. но периодически требует секвестирования. в вашем Запросе нужно отказаться от обработки представления в субд. Считать справочник и построить иерархию не клиенте. |
|||
46
vi0
08.04.15
✎
11:43
|
(45) чувак, тебя читать так же сложно, как в (29) запрос )
|
|||
47
AndreyBarmaley
08.04.15
✎
11:50
|
(29) если справочник небольшой то прокатит... , но я бы через доп. свойство сделал. Всеравно новые папки будут создаваться и придется отчет переделывать.
|
|||
48
D_E_S_131
08.04.15
✎
11:55
|
(47) "если справочник небольшой то прокатит" — из-за подобного подхода было загублено не мало ИБ. Когда "специалист" пишет запрос, все вроде бы быстро работает, а через год у людей "таймауты" начинают "валиться".
|
|||
49
ViSo76
08.04.15
✎
11:57
|
(44) Все предопределенные папки выносите в массивы и передавайте как параметр, а уже потом только используйте "В ИЕРАРХИИ(&НаборПапок1)", "В ИЕРАРХИИ(&НаборПапок2)"...
Подразумевается что номенклатуру в начале ты выберешь несколькими запросами на клиента, затем передашь на сервер в качестве параметров и не важно что толстый клиент там тоже виртуальный сервер. А если сервер не виртуальный то сетевые накладки будут выше чем даже запись виртуальной таблицы, если вообще будет запись вместо курсора... |
|||
50
piter3
08.04.15
✎
11:58
|
(45) +100
|
|||
51
AlexITGround
08.04.15
✎
12:15
|
(29) А что это такое?
|
|||
52
AndreyBarmaley
08.04.15
✎
12:37
|
(48) на ошибках учаться.
(29) "красивей" (39) по крайней мере все в одном запросе... |
|||
53
AndreyBarmaley
08.04.15
✎
12:38
|
учатся
|
|||
54
Anabella
08.04.15
✎
14:34
|
Начала пробовать предложенные варианты.
(17) переделала в запрос: "ВЫБРАТЬ | ВТ.ГруппыТоваров, | ЗаказыКлиентов.Номенклатура, | ВЫБОР | КОГДА ЗаказыКлиентов.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг | ТОГДА -ЗаказыКлиентов.Сумма | ИНАЧЕ ЗаказыКлиентов.Сумма | КОНЕЦ КАК СуммаОборот |ИЗ | РегистрНакопления.ЗаказыКлиентов КАК ЗаказыКлиентов | ЛЕВОЕ СОЕДИНЕНИЕ ВТ КАК ВТ | ПО ЗаказыКлиентов.Номенклатура = ВТ.Ссылка |ГДЕ | ЗаказыКлиентов.Регистратор = &Регистратор"; Стало выполняться дольше на 10 секунд( или можно как-то из ГДЕ переместить условие на регистратор? |
|||
55
D_E_S_131
08.04.15
✎
14:40
|
(54) Соединение ВНУТРЕННЕЕ надо, тебе же строго позии номенклатуры из ВТ нужны. Ну и условие можно в условия связи перенести.
|
|||
56
Anabella
08.04.15
✎
14:48
|
(55)
Нет, в ВТ я вытаскиваю только Группы номенклатуры. Саму номенклатуру тяну из ЗаказКлиентов |
|||
57
ViSo76
08.04.15
✎
14:50
|
(54) Попробуй сделать так:
"ВЫБРАТЬ | ВТ.ГруппыТоваров, | ЗаказыКлиентов.Номенклатура, | ЗаказыКлиентов.СуммаОборот |ИЗ | ( ВЫБРАТЬ | Номенклатура, | ВЫБОР | КОГДА Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг | ТОГДА -Сумма | ИНАЧЕ Сумма | КОНЕЦ КАК СуммаОборот | ИЗ | РегистрНакопления.ЗаказыКлиентов | ГДЕ | Регистратор = &Регистратор" ) КАК ЗаказыКлиентов | | ЛЕВОЕ СОЕДИНЕНИЕ ВТ КАК ВТ | ПО ЗаказыКлиентов.Номенклатура = ВТ.Ссылка |
|||
58
D_E_S_131
08.04.15
✎
14:52
|
(49) Вы уже просто "загнались" с этими "Клиентами" и "Серверами".
(56) Ну и зря. |
|||
59
D_E_S_131
08.04.15
✎
14:52
|
|
|||
60
AndreyBarmaley
08.04.15
✎
14:54
|
(56) сделай ВТ из заказов клиентов далее (35)
Виртуальная таблица быстрей, регистр не нужен... (59) очень криво |
|||
61
D_E_S_131
08.04.15
✎
14:59
|
(60) Что именно?
|
|||
62
ViSo76
08.04.15
✎
14:59
|
(59) 1. Цикле отбор номенклатур на клиенте, всё это можно сделать и в 1 запросе.
2. ЛЕВОЕ СОЕДИНЕНИЕ вместо: ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ЗаказыПокупателей КАК ЗаказыПокупателей 3. И почему ты уверен что нужно отбрасывать некоторые позиции заказ если они не входят в эти группы? |
|||
63
AlexSmirnov272
08.04.15
✎
15:02
|
(57) избавьтесь от условия ГДЕ, Вам писали уже)
|
|||
64
D_E_S_131
08.04.15
✎
15:03
|
(62) Возьми консоль запросов с инструментом замера времени выполнения запроса и посмотри сколько займет время сделать "одним запросом" и "передать как параметр". Совсем недавно делал нечто подобное и был удивлен, что условие "В" компилятор запроса формирует не так как "В (Выбрать...)". И раза в 3 быстрее сделал (но тут от кол-ва данных будет зависеть ускорение).
|
|||
65
Anabella
08.04.15
✎
15:07
|
(59) Ничего себе... пошла пробовать.
|
|||
66
ViSo76
08.04.15
✎
15:09
|
(64) Ты чушь пишешь. Я не предлагал писать В ( ВЫБРАТЬ ... ИЗ ). Если у тебя понимания не хватает я тебе его рихтовать не буду. И я понимаю что "один запрос" это всего лишь один текст, но возможно несколько запросов к базе.
|
|||
67
D_E_S_131
08.04.15
✎
15:09
|
+ к (64) При чем "построитель плана запроса" с третьего или четвертого раза вывел "В (Выбрать...)" на скорость выполнения такую как у "В(&Парам)". Проделывалось на MS SQL 2008 R2.
|
|||
68
D_E_S_131
08.04.15
✎
15:10
|
(66) А ты не кипятись и просто свой вариант покажи. А уж я не поленюсь и прогоню его через замер скорости выполнения и профайлер.
|
|||
69
AndreyBarmaley
08.04.15
✎
15:16
|
(61) Время запросов в цикле учитывал?
СпрСсылка = Справочники.Номенклатура.НайтиПоНаименованию(ТекСтр); |
|||
70
Anabella
08.04.15
✎
15:19
|
Господа, хорош спорить. У меня еще другой запрос к той же ВТ обращается, но тормозит именно тот который ЗаказКлиента
|
|||
71
Anabella
08.04.15
✎
15:20
|
Номенклатуру-то я конечно переделаю по группам товаров чтоб грамотно-красиво, но проблема не в ней.
|
|||
72
vi0
08.04.15
✎
15:21
|
(57) нехороший совет
будет только хуже |
|||
73
Anabella
08.04.15
✎
15:22
|
(57) на секунду дольше выполняется
|
|||
74
vi0
08.04.15
✎
15:22
|
(59) Для каждого ТекСтр Из ГруппыПосуда Цикл
СпрСсылка = Справочники.Номенклатура.НайтиПоНаименованию(ТекСтр); ... КонецЦикла; это называется запрос в цикле |
|||
75
D_E_S_131
08.04.15
✎
15:22
|
(69) Когда свой случай решал — да. Найти десяток элементов по индексированному полю это было быстрее даже чем получить эти же элементы одним запросом и поместить их в ВТ. При чем исходил из того, что передавая массив в условие "В", система так же сформирует временную таблицу в tempdb и будет выборкой в ней проверять условия. Оказалось, что ничего подобного.
|
|||
76
D_E_S_131
08.04.15
✎
15:25
|
(70) А как долго у тебя выполняется просто выборка записей РН с условием по &Регистратор?
(74) Для нескольких элементов это оправдывается выигрышем в скорости выполнения в дальнейшем (в моем случае было всего 5 таких папок). |
|||
77
AndreyBarmaley
08.04.15
✎
15:26
|
(75) ок... может быть
(73) (35) пробовала? |
|||
78
ViSo76
08.04.15
✎
15:29
|
(68) Сравнивай
ГруппыМебель = Новый Массив; ГруппыМебель.Добавить("Столы"); ГруппыМебель.Добавить("Стулья"); ГруппыМебель.Добавить("Диваны"); ГруппыПосуда = Новый Массив; ГруппыПосуда.Добавить("Тарелки"); ГруппыПосуда.Добавить("Вилки"); ГруппыПосуда.Добавить("Стаканы"); Запрос = Новый Запрос( "ВЫБРАТЬ | Ссылка |ПОМЕСТИТЬ ВТ_ГруппаМебель |ИЗ | Справочник.Номенклатура |ГДЕ | Наименование В ( &ГруппаМебель ) |; |ВЫБРАТЬ | Ссылка |ПОМЕСТИТЬ ВТ_ГруппаПосуда |ИЗ | Справочник.Номенклатура |ГДЕ | Наименование В ( &ГруппаПосуда ) |; |ВЫБРАТЬ | ""Мебель"" КАК Группа, | Номенклатура.Ссылка КАК НомСсылка |ПОМЕСТИТЬ ВТ_Товары |ИЗ | Справочник.Номенклатура КАК Номенклатура |ГДЕ | Номенклатура.Ссылка В ИЕРАРХИИ( ВЫБРАТЬ Ссылка ИЗ ВТ_ГруппаМебель ) | И Номенклатура.ЭтоГруппа = Ложь | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | ""Посуда"" КАК Группа, | Номенклатура.Ссылка |ИЗ | Справочник.Номенклатура КАК Номенклатура |ГДЕ | Номенклатура.Ссылка В ИЕРАРХИИ( ВЫБРАТЬ Ссылка ИЗ ВТ_ГруппаПосуда ) | И Номенклатура.ЭтоГруппа = Ложь |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВТ_Товары.НомСсылка, | ЗаказыПокупателей.Количество |ИЗ | ВТ_Товары КАК ВТ_Товары | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗаказыПокупателей КАК ЗаказыПокупателей | ПО ВТ_Товары.НомСсылка = ЗаказыПокупателей.Номенклатура | И (ЗаказыПокупателей.Регистратор = &ДокРегистратор)" ); Запрос.УстановитьПараметр( "ГруппаМебель", ГруппыМебель ); Запрос.УстановитьПараметр( "ГруппаПосуда", ГруппыПосуда ); Запрос.УстановитьПараметр( "ДокРегистратор", ВыбДокумент ); |
|||
79
ViSo76
08.04.15
✎
15:29
|
(78) Код не проверял, не знаю что за конфа если что подправишь огрехи
|
|||
80
ViSo76
08.04.15
✎
15:31
|
Да подмени не заметил
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗаказыПокупателей КАК ЗаказыПокупателей | ПО ЗаказыПокупателей.Регистратор = &ДокРегистратор | И ВТ_Товары.НомСсылка = ЗаказыПокупателей.Номенклатура" ); |
|||
81
AndreyBarmaley
08.04.15
✎
15:38
|
(0) покажи весь запрос с документами оплаты
УТ11? |
|||
82
Anabella
08.04.15
✎
15:41
|
(81)да. Я сейчас как раз втыкаю смысл в (35). У вас там обращение к ВТ, в которой и номенклатура и заказ клиента. У меня в ВТ исключительно номенклатура, запрос к справочнику номенклатуры. Предлагаете создать ВТ с заказами и соединить её с запросом в котором заказы? Зачем? Я соединяю, чтобы отдельно разбивались по группам и не портило основной запрос. А зачем запрос с заказами соединять с ВТ с запросом с заказами как-то не улавливаю.
|
|||
83
AndreyBarmaley
08.04.15
✎
15:45
|
(82) Я бы в справочник номенклатура лез после того как определил какие именно заказы оплатили...
|
|||
84
Anabella
08.04.15
✎
15:53
|
(83)Думала-думала, решила лучше спросить. Технически как это сделать?) сначала один запрос, потом второй, или как ?)
|
|||
85
D_E_S_131
08.04.15
✎
15:55
|
(79) Ну и вот результат:
1. Твой изначальный вариант — первый запуск 852 мс, далее 440 мс. 2. Изменяю твой вариант и вместо поиска по наименованию "подсовываю" сразу массив с папками — результат колеблется около 330 мс. 3. Не использую ВТ вообще и сразу двумя подзапросами выбираю номенклатуру по переданным группам — результат 250-260 мс. Тут даже особо другого результата и не ожидалось. При большой выборке данных зачастую не дооценивают время формирования всех этих ВТ. Более того, выбирая элементы справочника в ВТ, на них накладывается оптимистическая блокировка и пока моя ВТ что-то там тянет из записей РН, никто не сможет что-то записать в справочник номенклатуры. Выбирая же просто папки и сравнивая с папками я никаким образом не блокирую обычные элементы справочника. |
|||
86
AndreyBarmaley
08.04.15
✎
15:56
|
(84) какая конфигурация?
|
|||
87
vi0
08.04.15
✎
15:59
|
(85) > выбирая элементы справочника в ВТ, на них накладывается оптимистическая блокировка
блокировка накладывается если читаешь в транзакции |
|||
88
D_E_S_131
08.04.15
✎
16:01
|
(87) Разницу между пессимистичной и оптимистичной блокировкой ощущаешь?
|
|||
89
Anabella
08.04.15
✎
16:02
|
(86) УТ 11
|
|||
90
vi0
08.04.15
✎
16:02
|
(88) и к чему вопрос?
там не будет блокировки |
|||
91
Anabella
08.04.15
✎
16:03
|
(85) Вот спасибо, буду знать!
|
|||
92
Fragster
гуру
08.04.15
✎
16:04
|
(91) в (85) фигня, есличо
|
|||
93
D_E_S_131
08.04.15
✎
16:05
|
(92) Консоль запросов врет?
|
|||
94
H A D G E H O G s
08.04.15
✎
16:08
|
(93) У тебя похоже, особая консоль
|
|||
95
D_E_S_131
08.04.15
✎
16:08
|
(90) Хочешь сказать, что если мы читаем данные из Спр.Номенклатура, помещаем их в ВТ, потом используем эту ВТ дальше, то кто-то в это время может удалить один или несколько элементов Спр.Номенклатура?
|
|||
96
D_E_S_131
08.04.15
✎
16:09
|
(94) Возможно. Но пока с "тормозами" в базе успешно помогала справляться.
|
|||
97
H A D G E H O G s
08.04.15
✎
16:12
|
(95) Читаем вне транзакции - да.
Читаем в транзакции - по разному. |
|||
98
vi0
08.04.15
✎
16:12
|
(95) честно скажу, именно удалить не пробовал
ты выше пишешь не про удаление, а про изменение нормальная схема, когда удалением занимается администратор, а не так запросто в течение работы пользователей |
|||
99
D_E_S_131
08.04.15
✎
16:19
|
(97) Можно пример того как мы прочитаем данные из справочника вообще без блокировок?
(98) Для блокировок какая разница удалить или изменить? |
|||
100
AndreyBarmaley
08.04.15
✎
16:20
|
(91)
ВЫБРАТЬ РасчетыСКлиентамиОбороты.ЗаказКлиента, РасчетыСКлиентамиОбороты.Регистратор, РасчетыСКлиентамиОбороты.КОплатеРасход ПОМЕСТИТЬ ВТ_Оплаты ИЗ РегистрНакопления.РасчетыСКлиентами.Обороты(&НП, &КП, Авто, ) КАК РасчетыСКлиентамиОбороты ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ЗаказыКлиентовОбороты.ЗаказКлиента, ЗаказыКлиентовОбороты.Номенклатура, ЗаказыКлиентовОбороты.СуммаПриход ПОМЕСТИТЬ ВТ_Заказы ИЗ РегистрНакопления.ЗаказыКлиентов.Обороты( , , Авто, ЗаказКлиента В (ВЫБРАТЬ РАЗЛИЧНЫЕ ВТ_Оплаты.ЗаказКлиента ИЗ ВТ_Оплаты КАК ВТ_Оплаты)) КАК ЗаказыКлиентовОбороты ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Номенклатура.Ссылка, Номенклатура.Артикул, Номенклатура.Вес, Номенклатура.Объем ИЗ Справочник.Номенклатура КАК Номенклатура ГДЕ Номенклатура.Ссылка В (ВЫБРАТЬ РАЗЛИЧНЫЕ ВТ_Заказы.Номенклатура ИЗ ВТ_Заказы КАК ВТ_Заказы) |
|||
101
H A D G E H O G s
08.04.15
✎
16:21
|
(99)
ВЫБРАТЬ Номенклатура.Наименование ИЗ Справочник.Номенклатура КАК Номенклатура |
|||
102
disk-2008
08.04.15
✎
16:21
|
(0)Делай две ВТ - заказов и номенклатуры.
|
|||
103
vi0
08.04.15
✎
16:22
|
(99) значит не будет блокировки
можешь проверить |
|||
104
ViSo76
08.04.15
✎
16:25
|
(85) Ты всё посчитал, вместе с твоими обращениями за ссылками папок в базу? Или только запросы сравнил?
|
|||
105
ViSo76
08.04.15
✎
16:30
|
Часто лучше сделать чуть дольше но с гарантированным планом исполнения. В нашем случае 2 ВТ по группам лучше сразу пихать В ( ВЫБРАТЬ ... )
|
|||
106
ViSo76
08.04.15
✎
16:32
|
Да и чем больше текста в запросе тем больше по времени он в начале парсится
|
|||
107
ViSo76
08.04.15
✎
16:33
|
И ещё нужно на холодных данных проверять твой и мой запрос после опускания базы. Так как мой запрос мог в начале в кэш данные загнать а твой их от туда достать из физической их подгрузки
|
|||
108
D_E_S_131
08.04.15
✎
16:37
|
(104) 3 мс на поиск по наименованию тратится и делаем 6 раз. И я специально запускал запрос несколько раз и привожу минимальные значения.
(101) Вот тут я конечно "прогнал". Если только добавить конструкцию транзакции (автоматические блокировки), то получим WITH(REPEATABLEREAD), а просто всегда WITH(nolock) выходит. :( |
|||
109
ViSo76
08.04.15
✎
16:42
|
(108) А на остальной код 1С сколько тратится?
|
|||
110
H A D G E H O G s
08.04.15
✎
16:42
|
(108) Ты даже не представляешь, насколько там все сложнее.
|
|||
111
D_E_S_131
08.04.15
✎
16:52
|
(110) Представляю. Просто я со своими таймаутами и блокировками загнался так, что смешал все с нетранзакционным чтением данных.
|
|||
112
D_E_S_131
08.04.15
✎
16:56
|
(109) http://hkar.ru/Admr
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |