|
Как оптимизировать такой код? | ☑ | ||
---|---|---|---|---|
0
SherifSP
26.12.13
✎
12:36
|
Нужно по каждому контрагенту, для каждого товара вычислить тип цены, чтобы в дальнейшем высчитать скидку на товар контрагенту. Запросы выполняются в считанные секунды, но поиск по выборке очень долго потому как в первом цикле 84 контрагента, а во втором цикле 1800 позиций товара, как можно оптимизировать такой код, тз все индексированы.
Процедура КнопкаВыполнитьНажатие(Кнопка) ТаблицаТП = СформироватьДанныеТП(); ТаблицаНом = СформироватьНоменклатуру(ТаблицаТП); ОтклонениеНом = ОтклоненияПоНоменклатуре(); ОтклонениеБренд = ОтклоненияПоБрендам(); ОтклонениеПроизв = ОтклоненияПоПроизводителю(); ЦеныКонтрагентов = ЦеныКонтрагентовТП(); ТЗ = Новый ТаблицаЗначений; ТЗ.Колонки.Добавить("ТП"); ТЗ.Колонки.Добавить("Контрагент"); ТЗ.Колонки.Добавить("ТорговаяТочка"); ТЗ.Колонки.Добавить("Номенклатура"); ТЗ.Колонки.Добавить("ТипЦены"); ТЗ.Колонки.Добавить("ФиксированнаяЦена"); Для Каждого СтрокаТП Из ТаблицаТП Цикл Для Каждого СтрокаНом Из ТаблицаНом Цикл СтрокаТЗ = ТЗ.Добавить(); СтрокаТЗ.ТП = СтрокаТП.ТорговыйПредставитель; СтрокаТЗ.Контрагент = СтрокаТП.Контрагент; СтрокаТЗ.ТорговаяТочка = СтрокаТП.ТорговаяТочка; СтрокаТЗ.Номенклатура = СтрокаНом.Номенклатура; ИскомаяСтрока = ПоискДанныхТЗ(СтрокаТП,СтрокаНом,ЦеныКонтрагентов); Если ИскомаяСтрока.Количество() > 0 Тогда // Если Фиксированная цена найдена, отклонения не ищем СтрокаТЗ.ТипЦены = ИскомаяСтрока[0].ТипЦен; СтрокаТЗ.ФиксированнаяЦена = ИскомаяСтрока[0].ФиксированнаяЦена; Иначе // Фиксированная цена явно не найдена, продолжаем поиски ИскомаяСтрока = ПоискДанныхТЗ(СтрокаТП,СтрокаНом,ОтклонениеНом); Если ИскомаяСтрока.Количество() > 0 Тогда //Меняем тип цены для расчета прайсовой цены СтрокаТЗ.ТипЦены = ИскомаяСтрока[0].ТипЦен; Иначе // Отклонение по номенклатуре не найдено продолжаем ИскомаяСтрока = ПоискДанныхТЗ(СтрокаТП,СтрокаНом,ОтклонениеБренд); Если ИскомаяСтрока.Количество() > 0 Тогда СтрокаТЗ.ТипЦены = ИскомаяСтрока[0].ТипЦен; Иначе // Отклонение по бренду не найдено продолжаем ИскомаяСтрока = ПоискДанныхТЗ(СтрокаТП,СтрокаНом,ОтклонениеБренд); Если ИскомаяСтрока.Количество() > 0 Тогда СтрокаТЗ.ТипЦены = ИскомаяСтрока[0].ТипЦен; КонецЕсли; КонецЕсли; КонецЕсли; КонецЕсли; КонецЦикла; КонецЦикла; КонецПроцедуры Функция ПоискДанныхТЗ(СтрокаТП,СтрокаНом,ТЗ) Отбор = Новый Структура; Отбор.Вставить("Контрагент",СтрокаТП.Контрагент); Отбор.Вставить("Номенклатура",СтрокаНом.Номенклатура); Возврат ТЗ.НайтиСтроки(Отбор); КонецФункции |
|||
1
Fragster
гуру
26.12.13
✎
12:37
|
одним запросом все сделать
|
|||
2
SherifSP
26.12.13
✎
12:38
|
(1) Был такой запрос, очень долго отрабатывал, потому взялся переделывать весь механизм формирования
|
|||
3
Fragster
гуру
26.12.13
✎
12:40
|
(2) видимо, такой запрос был...
|
|||
4
SherifSP
26.12.13
✎
12:40
|
+(0) Сформированные данные записываются в xml и выгружаются на сервер агент+
|
|||
5
Alex S D
26.12.13
✎
12:40
|
сделать все одним НОРМАЛЬНЫМ запросом
|
|||
6
SherifSP
26.12.13
✎
12:40
|
Сейчас кину запрос
|
|||
7
SherifSP
26.12.13
✎
12:43
|
ТекстЗапроса = "ВЫБРАТЬ
| Отклонения.Контрагент, | Отклонения.Товар, | ВЫБОР | КОГДА ЕСТЬNULL(СоответствиеТиповЦен.ТипЦены, 0) = 0 | ТОГДА Отклонения.ТипЦены | ИНАЧЕ СоответствиеТиповЦен.ТипЦены | КОНЕЦ КАК ТипЦены, | Отклонения.ИтоговоеОтклонение КАК Отклонение |ПОМЕСТИТЬ ОтклоненияПокупателя |ИЗ | (ВЫБРАТЬ | ТоварыПоПокупателям.Контрагент КАК Контрагент, | ТоварыПоПокупателям.Номенклатура КАК Товар, | ОтклоненияПоНоменклатуре.ТипЦены КАК ТоварТипЦены, | ОтклоненияПоНоменклатуре.Отклонение КАК ТоварОтклонение, | ТоварыПоПокупателям.Бренд КАК Бренд, | ОтклоненияПоБрендам.ТипЦены КАК БрендТипЦены, | ОтклоненияПоБрендам.Отклонение КАК БрендОтклонение, | ТоварыПоПокупателям.Производитель КАК Производитель, | ОтклоненияПоПроизводителям.ТипЦены КАК ПроизводительТипЦены, | ОтклоненияПоПроизводителям.Отклонение КАК ПроизводительОтклонение, | ОтклоненияОбщие.Отклонение КАК Отклонение, | ВЫБОР | КОГДА ЕСТЬNULL(ОтклоненияПоНоменклатуре.ТипЦены, 0) <> 0 | ТОГДА ОтклоненияПоНоменклатуре.ТипЦены | КОГДА ЕСТЬNULL(ОтклоненияПоБрендам.ТипЦены, 0) <> 0 | ТОГДА ОтклоненияПоБрендам.ТипЦены | КОГДА ЕСТЬNULL(ОтклоненияПоПроизводителям.ТипЦены, 0) <> 0 | ТОГДА ОтклоненияПоПроизводителям.ТипЦены | ИНАЧЕ ТоварыПоПокупателям.ТипЦены | КОНЕЦ КАК ТипЦены, | ВЫБОР | КОГДА ЕСТЬNULL(ОтклоненияПоНоменклатуре.ТипЦены, 0) <> 0 | ТОГДА ОтклоненияПоНоменклатуре.Отклонение | КОГДА ЕСТЬNULL(ОтклоненияПоБрендам.ТипЦены, 0) <> 0 | ТОГДА ОтклоненияПоБрендам.Отклонение | КОГДА ЕСТЬNULL(ОтклоненияПоПроизводителям.ТипЦены, 0) <> 0 | ТОГДА ОтклоненияПоПроизводителям.Отклонение | ИНАЧЕ ЕСТЬNULL(ОтклоненияОбщие.Отклонение, 0) | КОНЕЦ КАК ИтоговоеОтклонение | ИЗ | (ВЫБРАТЬ | Покупатели.Контрагент КАК Контрагент, | ТоварыТП.Номенклатура КАК Номенклатура, | СпрНоменклатура.Производитель КАК Производитель, | СпрНоменклатура.Бренд КАК Бренд, | Покупатели.ТипЦены КАК ТипЦены | ИЗ | ТоварыТП КАК ТоварыТП | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СпрНоменклатура | ПО ТоварыТП.Номенклатура = СпрНоменклатура.Ссылка | ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ РАЗЛИЧНЫЕ | МаршрутыТП.Контрагент КАК Контрагент, | МаршрутыТП.ТипЦены КАК ТипЦены | ИЗ | МаршрутыТП КАК МаршрутыТП | ГДЕ | МаршрутыТП.ТорговыйПредставитель = &ТорговыйПредставитель | ) КАК Покупатели | ПО (1 = 1) | ГДЕ | (НЕ СпрНоменклатура.ЭтоГруппа)) КАК ТоварыПоПокупателям | ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ | ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.Контрагент КАК Контрагент, | ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.Договор КАК Договор, | ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.Номенклатура КАК Номенклатура, | ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.ТипЦены КАК ТипЦены, | ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.Отклонение КАК Отклонение | ИЗ | РегистрСведений.ОтклоненияЦенНоменклатурыКонтрагентов.СрезПоследних(&ДатаВыгрузки, ) КАК ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних | ГДЕ | (ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.СрокДействия >= &ДатаВыгрузки | ИЛИ ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.СрокДействия = ДАТАВРЕМЯ(1, 1, 1)) | И ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.Номенклатура ССЫЛКА Справочник.Номенклатура) КАК ОтклоненияПоНоменклатуре | ПО ТоварыПоПокупателям.Номенклатура = ОтклоненияПоНоменклатуре.Номенклатура | И ТоварыПоПокупателям.Контрагент = ОтклоненияПоНоменклатуре.Контрагент | ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ | ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.Контрагент КАК Контрагент, | ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.Договор КАК Договор, | ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.Номенклатура КАК Номенклатура, | ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.ТипЦены КАК ТипЦены, | ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.Отклонение КАК Отклонение | ИЗ | РегистрСведений.ОтклоненияЦенНоменклатурыКонтрагентов.СрезПоследних(&ДатаВыгрузки, ) КАК ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних | ГДЕ | (ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.СрокДействия >= &ДатаВыгрузки | ИЛИ ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.СрокДействия = ДАТАВРЕМЯ(1, 1, 1)) | И ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.Номенклатура ССЫЛКА Справочник.Бренды) КАК ОтклоненияПоБрендам | ПО ТоварыПоПокупателям.Бренд = ОтклоненияПоБрендам.Номенклатура | И ТоварыПоПокупателям.Контрагент = ОтклоненияПоБрендам.Контрагент | ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ | ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.Контрагент КАК Контрагент, | ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.Договор КАК Договор, | ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.Номенклатура КАК Номенклатура, | ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.ТипЦены КАК ТипЦены, | ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.Отклонение КАК Отклонение | ИЗ | РегистрСведений.ОтклоненияЦенНоменклатурыКонтрагентов.СрезПоследних(&ДатаВыгрузки, ) КАК ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних | ГДЕ | (ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.СрокДействия >= &ДатаВыгрузки | ИЛИ ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.СрокДействия = ДАТАВРЕМЯ(1, 1, 1)) | И ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.Номенклатура ССЫЛКА Справочник.Производители | И ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.Номенклатура <> ЗНАЧЕНИЕ(Справочник.Производители.ПустаяСсылка)) КАК ОтклоненияПоПроизводителям | ПО ТоварыПоПокупателям.Производитель = ОтклоненияПоПроизводителям.Номенклатура | И ТоварыПоПокупателям.Контрагент = ОтклоненияПоПроизводителям.Контрагент | ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ | &БазовыйТипЦен КАК ТипЦеныНоменклатуры, | ТипыЦенНоменклатурыКонтрагентовТипыЦенНоменклатуры.Ссылка.Владелец КАК Производитель, | ТипыЦенНоменклатурыКонтрагентовТипыЦенНоменклатуры.Ссылка КАК ТипЦеныПроизводителя | ИЗ | Справочник.ТипыЦенНоменклатурыКонтрагентов.ТипыЦенНоменклатуры КАК ТипыЦенНоменклатурыКонтрагентовТипыЦенНоменклатуры | ГДЕ | ТипыЦенНоменклатурыКонтрагентовТипыЦенНоменклатуры.ТипЦены = &БазовыйТипЦен) КАК БазовыйТипЦены | ПО ТоварыПоПокупателям.Производитель = БазовыйТипЦены.Производитель | ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ | ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.Контрагент КАК Контрагент, | ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.Договор КАК Договор, | ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.Отклонение КАК Отклонение | ИЗ | РегистрСведений.ОтклоненияЦенНоменклатурыКонтрагентов.СрезПоследних(&ДатаВыгрузки, ) КАК ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних | ГДЕ | ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.Номенклатура = НЕОПРЕДЕЛЕНО) КАК ОтклоненияОбщие | ПО ТоварыПоПокупателям.Контрагент = ОтклоненияОбщие.Контрагент) КАК Отклонения | ЛЕВОЕ СОЕДИНЕНИЕ СоответствиеТиповЦен КАК СоответствиеТиповЦен | ПО Отклонения.ТипЦены = СоответствиеТиповЦен.ТипЦеныКонтрагента |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ЦеныНоменклатурыКонтрагентовСрезПоследних.Номенклатура, | ЦеныНоменклатурыКонтрагентовСрезПоследних.ТипЦен КАК ТипЦены, | ЦеныНоменклатурыКонтрагентовСрезПоследних.Цена КАК ФиксированнаяЦена |ПОМЕСТИТЬ ФиксированныеЦены |ИЗ | ОтклоненияПокупателя КАК ОтклоненияПокупателя | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатурыКонтрагентов.СрезПоследних( | &ДатаВыгрузки, | СрокДействия >= &ДатаВыгрузки | ИЛИ СрокДействия = ДАТАВРЕМЯ(1, 1, 1)) КАК ЦеныНоменклатурыКонтрагентовСрезПоследних | ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ | МАКСИМУМ(ЦеныНоменклатурыКонтрагентовСрезПоследних.Период) КАК Период, | ЦеныНоменклатурыКонтрагентовСрезПоследних.ТипЦен КАК ТипЦен, | ЦеныНоменклатурыКонтрагентовСрезПоследних.Номенклатура КАК Номенклатура, | ЦеныНоменклатурыКонтрагентовСрезПоследних.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры | ИЗ | РегистрСведений.ЦеныНоменклатурыКонтрагентов.СрезПоследних( | &ДатаВыгрузки, | СрокДействия >= &ДатаВыгрузки | ИЛИ СрокДействия = ДАТАВРЕМЯ(1, 1, 1)) КАК ЦеныНоменклатурыКонтрагентовСрезПоследних | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТоварыТП КАК ТоварыТП | ПО ЦеныНоменклатурыКонтрагентовСрезПоследних.Номенклатура = ТоварыТП.Номенклатура | | СГРУППИРОВАТЬ ПО | ЦеныНоменклатурыКонтрагентовСрезПоследних.ТипЦен, | ЦеныНоменклатурыКонтрагентовСрезПоследних.Номенклатура, | ЦеныНоменклатурыКонтрагентовСрезПоследних.ХарактеристикаНоменклатуры) КАК ПоследниеЦены | ПО ЦеныНоменклатурыКонтрагентовСрезПоследних.ТипЦен = ПоследниеЦены.ТипЦен | И ЦеныНоменклатурыКонтрагентовСрезПоследних.Номенклатура = ПоследниеЦены.Номенклатура | И ЦеныНоменклатурыКонтрагентовСрезПоследних.ХарактеристикаНоменклатуры = ПоследниеЦены.ХарактеристикаНоменклатуры | И ЦеныНоменклатурыКонтрагентовСрезПоследних.Период = ПоследниеЦены.Период | ПО ОтклоненияПокупателя.Контрагент = ЦеныНоменклатурыКонтрагентовСрезПоследних.ТипЦен.Владелец | И ОтклоненияПокупателя.Товар = ЦеныНоменклатурыКонтрагентовСрезПоследних.Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ОтклоненияПокупателя.Контрагент КАК Контрагент, | ОтклоненияПокупателя.Товар.Родитель КАК Группа, | ОтклоненияПокупателя.Товар КАК Товар, | ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка) КАК Характеристика, | ВЫРАЗИТЬ(ЕстьNull(ЦеныНоменклатуры.Цена,0) + ЕстьNull(ЦеныНоменклатуры.Цена,0) * ОтклоненияПокупателя.Отклонение / 100 КАК ЧИСЛО(12, 2)) КАК Цена, | ВЫБОР | КОГДА ШкалаМинимальныхЦенНаАлкогольнуюПродукциюСрезПоследних.МетодикаРасчета = ЗНАЧЕНИЕ(Перечисление.МетодикиРасчетаМинимальнойЦены.ФиксированнаяЦена) | ТОГДА ШкалаМинимальныхЦенНаАлкогольнуюПродукциюСрезПоследних.ЦенаРозница | КОГДА ШкалаМинимальныхЦенНаАлкогольнуюПродукциюСрезПоследних.МетодикаРасчета = ЗНАЧЕНИЕ(Перечисление.МетодикиРасчетаМинимальнойЦены.ЦенаЗа1Литр100Спирта) | ТОГДА ШкалаМинимальныхЦенНаАлкогольнуюПродукциюСрезПоследних.ЦенаРозница * ЕСТЬNULL(ОтклоненияПокупателя.Товар.ЕдиницаХраненияОстатков.Объем, 0) * ЕСТЬNULL(ОтклоненияПокупателя.Товар.СодержаниеСпирта, 0) / 100 | КОГДА ШкалаМинимальныхЦенНаАлкогольнуюПродукциюСрезПоследних.МетодикаРасчета = ЗНАЧЕНИЕ(Перечисление.МетодикиРасчетаМинимальнойЦены.ЦенаЗаЕмкостьСКратностью07) | ТОГДА ШкалаМинимальныхЦенНаАлкогольнуюПродукциюСрезПоследних.ЦенаРозница * ЕСТЬNULL(ОтклоненияПокупателя.Товар.ЕдиницаХраненияОстатков.Объем, 0) / 0.7 | ИНАЧЕ 0 | КОНЕЦ КАК МинимальнаяЦенаРозница, | ОтклоненияПокупателя.ТипЦены, | ОтклоненияПокупателя.Отклонение, | ЦеныНоменклатуры.Цена КАК ЦенаПоПрайсу, | ВЫРАЗИТЬ(ЕстьNull(ФиксированныеЦены.ФиксированнаяЦена,0) КАК ЧИСЛО(12, 2)) КАК ФиксированнаяЦена, | ЕСТЬNULL(ВЫРАЗИТЬ(ВидыУпаковки.ЦенаСНДС КАК ЧИСЛО(12, 2)), 0) КАК ЦенаТарыСНДС, | ЕСТЬNULL(ВЫРАЗИТЬ(ВидыУпаковки.ЦенаБезНДС КАК ЧИСЛО(12, 2)), 0) КАК ЦенаТарыБезНДС, | ВЫБОР | КОГДА ШкалаМинимальныхЦенНаАлкогольнуюПродукциюСрезПоследних.МетодикаРасчета = ЗНАЧЕНИЕ(Перечисление.МетодикиРасчетаМинимальнойЦены.ФиксированнаяЦена) | ТОГДА ШкалаМинимальныхЦенНаАлкогольнуюПродукциюСрезПоследних.ЦенаОпт | КОГДА ШкалаМинимальныхЦенНаАлкогольнуюПродукциюСрезПоследних.МетодикаРасчета = ЗНАЧЕНИЕ(Перечисление.МетодикиРасчетаМинимальнойЦены.ЦенаЗа1Литр100Спирта) | ТОГДА ШкалаМинимальныхЦенНаАлкогольнуюПродукциюСрезПоследних.ЦенаОпт * ЕСТЬNULL(ОтклоненияПокупателя.Товар.ЕдиницаХраненияОстатков.Объем, 0) * ЕСТЬNULL(ОтклоненияПокупателя.Товар.СодержаниеСпирта, 0) / 100 | КОГДА ШкалаМинимальныхЦенНаАлкогольнуюПродукциюСрезПоследних.МетодикаРасчета = ЗНАЧЕНИЕ(Перечисление.МетодикиРасчетаМинимальнойЦены.ЦенаЗаЕмкостьСКратностью07) | ТОГДА ШкалаМинимальныхЦенНаАлкогольнуюПродукциюСрезПоследних.ЦенаОпт * ЕСТЬNULL(ОтклоненияПокупателя.Товар.ЕдиницаХраненияОстатков.Объем, 0) / 0.7 | ИНАЧЕ 0 | КОНЕЦ КАК МинимальнаяЦенаОпт |ИЗ | ОтклоненияПокупателя КАК ОтклоненияПокупателя | ЛЕВОЕ СОЕДИНЕНИЕ ЦеныНоменклатуры КАК ЦеныНоменклатуры | ПО ОтклоненияПокупателя.Товар = ЦеныНоменклатуры.Номенклатура | И ОтклоненияПокупателя.ТипЦены = ЦеныНоменклатуры.ТипЦены | ЛЕВОЕ СОЕДИНЕНИЕ ФиксированныеЦены КАК ФиксированныеЦены | ПО ОтклоненияПокупателя.Товар = ФиксированныеЦены.Номенклатура | ЛЕВОЕ СОЕДИНЕНИЕ ВидыУпаковки КАК ВидыУпаковки | ПО ОтклоненияПокупателя.Товар.ВидУпаковки = ВидыУпаковки.ВидУпаковки, | РегистрСведений.ШкалаМинимальныхЦенНаАлкогольнуюПродукцию.СрезПоследних КАК ШкалаМинимальныхЦенНаАлкогольнуюПродукциюСрезПоследних |ИТОГИ |ПО | ОтклоненияПокупателя.Товар,ОтклоненияПокупателя.Контрагент |"; //ТекстЗапроса = ТекстЗапросаДляВыгрузкиЦен(); Возврат ТекстЗапроса; |
|||
8
Fragster
гуру
26.12.13
✎
12:43
|
кстати, не раскрыта тема функций формирования ТЗ в начале. Они не тормозят?
|
|||
9
Fragster
гуру
26.12.13
✎
12:45
|
(7) все виртуальные таблицы во временные + отборы на них, это как минимум. + индексы по колонкам соединения
|
|||
10
SherifSP
26.12.13
✎
12:45
|
(8) Все данные по тз выбираются за 05 секунд, основная нагрузка по времени идет на поиск типа цены
|
|||
11
Fragster
гуру
26.12.13
✎
12:46
|
(9)+ подробнее смотреть влом
|
|||
12
Maxus43
26.12.13
✎
12:46
|
(9) все вложенные ты хотел сказать?
|
|||
13
SherifSP
26.12.13
✎
12:46
|
Запрос в итоге возвращает 1800000 строк
|
|||
14
SherifSP
26.12.13
✎
12:47
|
(13) это к (7) отрабатывает 6 минут с копейками
|
|||
15
Fragster
гуру
26.12.13
✎
12:47
|
(12) начать можно с виртуальных
(13) почему не 84*1800? |
|||
16
Maxus43
26.12.13
✎
12:48
|
(14) для 1800000 строк - более менее ещё, ускоришь индексами и т.д., но не сильно. Объём сам по себе большой
|
|||
17
Fragster
гуру
26.12.13
✎
12:49
|
(16) у автора должно в итоге получиться минимум в 10 раз меньше
|
|||
18
Alex S D
26.12.13
✎
12:49
|
очевидно что там чето лишнее, не хватает отборо/соединений
|
|||
19
SherifSP
26.12.13
✎
12:49
|
(15) Хз не сильно разбирался, разбил запрос на тз, думал может так будит быстрее, но скорость на 5% увеличилась
|
|||
20
SherifSP
26.12.13
✎
12:51
|
+(19) думаю где то лишняя выборка данных
|
|||
21
SherifSP
26.12.13
✎
12:52
|
(16) Индексы на соединяемые поля в запросе?
|
|||
22
Пеппи
26.12.13
✎
12:54
|
(20) естественно, почему отбор ведется только по датам и типу цены? мельком глянула запрос
|
|||
23
Пеппи
26.12.13
✎
12:55
|
вижу- у вас только регисты сведений используются. Там так много данных?
|
|||
24
SherifSP
26.12.13
✎
12:55
|
(22) Поля контрагент и номенклатура не индексированы, если по ним делать отбор, только хуже будит, проверял
|
|||
25
SherifSP
26.12.13
✎
12:56
|
(23) Да
|
|||
26
Пеппи
26.12.13
✎
12:57
|
(24) ГДЕ убрать в параметры, быстрее будет
|
|||
27
SherifSP
26.12.13
✎
13:01
|
(26) Сейчас уберу
|
|||
28
SherifSP
26.12.13
✎
13:06
|
Метод найти строки дольше всего отрабатывает, как думаете метод найти с указанием искомой колонки быстрее отработал бы?
|
|||
29
Пеппи
26.12.13
✎
13:06
|
(28) Найтистроки находит массив строк, а найти первую попавшуюся
|
|||
30
SherifSP
26.12.13
✎
13:08
|
(29) Дублирующих строк не будит, так как используется срез последних
|
|||
31
bolobol
26.12.13
✎
13:16
|
Всегда удивляюсь - проверить-то не быстрее, чем писать сам вопрос в форум?
И задачу вообще не понял: "Нужно по каждому контрагенту, для каждого товара вычислить тип цены". Тип цены как бы не цифра, чтобы её вычислить, значит есть какой-то алгоритм вычисления через некие показатели. И о них ни слова, ни о входящих данных ни слова, лишь о конечных: Контрагент, Товар, ВычисленныйТипЦены. Как решать-то такую задачу? 00 |
|||
32
MM
26.12.13
✎
13:17
|
(0) В таблицах значений есть возможность создавать индексы. Но лучше всё же оптимизировать оригинальный запрос.
|
|||
33
Полотенчик
26.12.13
✎
13:24
|
(7) фу. блеванул
|
|||
34
Леха Дум
26.12.13
✎
13:29
|
(33) аналогично...
4 раза выборка РегистрСведений.ОтклоненияЦенНоменклатурыКонтрагентов.СрезПоследних |
|||
35
Kvestin
26.12.13
✎
13:40
|
(7) Уберите все вложенные запросы во временные таблицы с индексацией по полям соединения как все тут и пишут. Это единственно верное решение (сами удивитесь насколько станет быстрее).
Если этого не сделать, то скуль будет строить неоптимальный план выполнения запроса. Я только удивляюсь, почему сама 1С в своих конфигурациях активно использует эту выборку из вложенных. При этом везде говорится, что это зло. |
|||
36
Fragster
гуру
26.12.13
✎
14:07
|
(35) потому что в 8.0 не было временных таблиц
|
|||
37
Kvestin
26.12.13
✎
14:17
|
(36) И я с вами бы согласился (и сам так думал).
Пока не нашел в УПП 1.3 точно такой же запрос по партиям (с условием на вхождение во вложенный запрос), как в старенькой УТ 10.3. |
|||
38
Kvestin
26.12.13
✎
14:18
|
При этом в БУ 1.6 написано все достаточно грамотно (все на что натыкался).
|
|||
39
Fragster
гуру
26.12.13
✎
14:19
|
(37) это потому что "работает - не чини"!
|
|||
40
Kvestin
26.12.13
✎
14:21
|
(39) :) Это конечно основная парадигма программирования - согласен с ней. Но я все-таки решил починить. Отчеты о розничных продажах стали проводиться бодрее раз в 60.
|
|||
41
Fragster
гуру
26.12.13
✎
14:26
|
(40) я знаю. я раз сто переписывал этот запрос.
|
|||
42
SherifSP
26.12.13
✎
14:29
|
Добился результата в 30 раз быстрее запроса выполняется код, поставил условие на таблицы по контрагенту и номенклатуре, данных вместо 8000 строк получается до 100, но на пол секунды дольше запросы выполняются
|
|||
43
SherifSP
26.12.13
✎
14:30
|
Так что не в оптимизации кода было дело, а в количестве данных
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |