как ускорить срез последних на каждую дату #688153


#0 by Холодильник
Проблема - долго выполняется запрос. самое узкое место - где получают таблицу актуальных данных из РС. на входе в пакетный запрос таблица : в регистре(РС, периодический, день) хранятся данные в таком разрезе: Измерения: Товар Ресурсы: Ресурс итого по каждому товару в РС хранится 100500 записей на каждую дату с различными значениями ресурса. нужно получить самое позднее значения на дату товара из входной таблицы. Классическая схема решения - входящую таблицу связываем с РС по условию Товар=Товар и дата>=период. Группируем по макс дате, помещаем во временную табл, затем её связываем вновь с РС по товар = Товар и Датамакс = период. но это выполняется оч долго - если входящая таблица имеет 100 строк, а на каждый товар в РС имеется более 10000 записей(Период<Дата), то получае 1000000 строк в таблице, которую группируем. Нет ли более быстрых схем решения?
#1 by 1dvd
Запроос покажи. В частности Левое соединение .... ПО ...
#2 by Холодильник
а что там показывать      |ВЫБРАТЬ                    |    ВТ_Входная.Период,
#3 by butterbean
если все это критично и постоянно используется - храните таблицу на каждый день
#4 by bolobol
Проиндексируйте
#5 by Холодильник
#6 by Classic
Индексируй ВТ здесь поиск по индексу используется и в соединении и в группировке
#7 by Холодильник
т.е. правое соединение
#8 by Холодильник
по какому полю индексировать?
#9 by Classic
По товару и периоду. В принципе можно и просто по товару, но в группировке тогда его первым поставь.
#10 by К_Дач
СКД. Связь наборов данных. Аналогично получению курсов валют на дату
#11 by К_Дач
Явно будет быстрее, чем твое: "ВТ_Входная.Период >= МойРС.Период"
#12 by H A D G E H O G s
У тебя кривой запрос.
#13 by H A D G E H O G s
В
#14 by Classic
Он потом написал, что правое :)
#15 by Classic
Правда связь надо не по периоду, а по макспериоду делать
#16 by H A D G E H O G s
|            И МойРС.Период = Связь_ПериодРС.Макспериод
#17 by Sorm
+ Проиндексировать однако...
#18 by Холодильник
да-да.. это я для примера писал
#19 by H A D G E H O G s
Я бы в ВТ отобрал бы Регистр с отбором по Товару и периоду, чебынет.
#20 by H A D G E H O G s
попробовал бы.
#21 by H A D G E H O G s
Че вам это индексирование втемяшилось то...
#22 by H A D G E H O G s
если входящая таблица имеет 100 строк... в первом пакете имеем сто строк максимум, че вы тут индексировать собрались?
#23 by andew
гы-гы
#24 by Холодильник
это как? задать условия для РС?
#25 by H A D G E H O G s
2 раза ползают по таблице регистра, вот тут цимес.
#26 by H A D G E H O G s
счаст попробую написать
#27 by К_Дач
"итого по каждому товару в РС хранится 100500 записей на каждую дату с различными значениями ресурса. нужно получить самое позднее значения на дату товара из входной таблицы. " так при таком раскладе, если у тебя на дату 100500 значений ресурса для товара - ты их все и получишь. Или я чет не понял?
#28 by Холодильник
мне нужно - самое позднее на дату из входной таблицы
#29 by andew
+1
#30 by Classic
ВЫБРАТЬ       И РС.Период В       (ВЫБРАТЬ ПЕРВЫЕ 1       УПОРЯДОЧИТЬ ПО РС1.Период УБЫВ       )
#31 by Холодильник
к первому подзапросу добавил |ИНДЕКСИРОВАТЬ ПО                    |    Период, теперь запрос выполнился за 122сек, вместо прежних 121
#32 by H A D G E H O G s
А ты догадайся почему.
#33 by К_Дач
У тебя периодичность "в пределах секунды" что ли?
#34 by Холодильник
а хз.. с индексацией раньше не работал в днях, написал ж
#35 by H A D G E H O G s
Это что за покемон?
#36 by Fragster
ВЫБРАТЬ ВЫБРАТЬ ВЫБРАТЬ                 (ВЫБРАТЬ ПЕРВЫЕ 1                     ДанныеУсловие.Период                 ИЗ
#37 by Fragster
главное в скуле индекс подшаманить по Данные.Значение + Данные.Период Убыв
#38 by К_Дач
Тогда я не понимаю тебя, фраза: "самое позднее на дату из входной таблицы" Таблица: Самовар 10.05 РС: 10.05 Самовар 26,75 10.05 Самовар 32,56 10.05 Самовар 98,47 10.05 Самовар 77,84 Теперь объясни мне, какое значение из приведенного примера ты хочешь получить.
#39 by Fragster
+ или выбирать во временную таблицу РазностьДат(КонецДня, Период) и сортировать по возрастанию и юзать стандартные индексы 1с
#40 by Sorm
Сколько раз выполнится "ВЫБРАТЬ ПЕРВЫЕ 1                     ДанныеУсловие.Период                 ИЗ                     Данные КАК ДанныеУсловие
#41 by К_Дач
+38 и как вообще такая ситуация может быть в регистре сведений
#42 by Холодильник
чувак, в периодическом (день) регистре ты не сможешь внести несколько записей с 10.05 Самовар РС тебе такого не позволит сделать, записи должны быть уникальны
#43 by Fragster
я план запроса не смотрел этой штуки, если честно :) с выделением  максимумов в пределах каждого дня и соединением по = работает быстрее, да
#44 by Ненавижу 1С
#45 by К_Дач
так я про тоже! А ты написал в что у тебя на КАЖДУЮ дату 100500 записей.
#46 by Fragster
наверное по количеству строк основной таблицы
#47 by Холодильник
ок, не на каждую.. вобщем - это тот же РС Курсы валют
#48 by К_Дач
ну наконец-то, тогда вот тебе пример: Набор1: Набор2:     КурсыВалютСрезПоследних.Курс КАК КурсДоллара
#49 by H A D G E H O G s
ВЫБРАТЬ ИЗ
#50 by К_Дач
Работать будет сто процентов быстрее, чем твой запрос ко всему регистру с проверкой, больше ли период входящего или нет.
#51 by ILM
А что там СРЕЗПОСЛЕДНИХ уже не кошерно?
#52 by К_Дач
#53 by Fragster
лучше сделать СрезПоследних(минимальнаяДата) Объединить все ФизическаяТаблица где период > минимальная дата и <=Максимальная дата
#54 by Classic
Всегда считал, что коррзапрос медленнее. Но мои проверки показали, что разницы особой нет, если упорядочивание идет по индексу
#55 by К_Дач
И ВТ1.ДатаОперации >= КурсыВалют.Период СГРУППИРОВАТЬ ПО ВТ1.ДатаОперации, ВТ1.ВалютаОперации ИНДЕКСИРОВАТЬ ПО ПериодДляСвязи ВТ2.ДатаОперации, ВТ2.ВалютаОперации, КурсыВалют.Курс ИЗ ВТ2 КАК ВТ2
#56 by Classic
А разве СрезПоследних не тот же подзапрос?
#57 by Fragster
просто потом соединять меньше
#58 by х86
эта бня на больших объёмах отъедает стотыщ питсот гигов памяти и падает
#59 by К_Дач
Кароче, ребята - Хадгехогс уже все написал. Я в своем примере описал альтернативы. Лично мой опыт (я тестировал оба варианта - и запрос и СКД, показал, что скорость фактически одинаковая)
#60 by H A D G E H O G s
Первый пакетный запрос - он тупо как пример. 2 пакетный получает claster scan потому что селективности мало, счаст попробую ограничить 1 пакетный и глянуть. В остальном - ждем Холодильника.
#61 by К_Дач
с чего вдруг? по сути то это одно и то же, соединение наборов в итоге - это неявное левое соединение. Ты проверял? откуда такие заявления
#62 by х86
да, правда года полтора назад ) мошт релиз кривой был
#63 by Classic
Да, наверное
#64 by Холодильник
классический, времы выполнения 0,031 ВЫБРАТЬ     &Валюта1 КАК Валюта, ОБЪЕДИНИТЬ ВЫБРАТЬ ОБЪЕДИНИТЬ ВЫБРАТЬ ВЫБРАТЬ исправленный(по твоей схеме) = 0,046 ВЫБРАТЬ ОБЪЕДИНИТЬ ВЫБРАТЬ ОБЪЕДИНИТЬ ВЫБРАТЬ ВЫБРАТЬ
#65 by H A D G E H O G s
теперь запрос выполнился за 122сек, вместо прежних 121 давай в секундах
#66 by Холодильник
косяк, в последнем соединяться не с РС, а с ТаблицаВалютаПериод ..ща
#67 by К_Дач
Индексировать не по Период, а по ПериодМакс
#68 by Холодильник
в 64 - время в секундах. стандартная БП, консоль Чистова
#69 by H A D G E H O G s
А раньше?
#70 by Холодильник
в 64: третий = 0,063. текст третьего: ОБЪЕДИНИТЬ ВЫБРАТЬ
#71 by Холодильник
120с - это общий запрос в отчете. я хочу протестировать чистый пример на примере курсов валют
#72 by H A D G E H O G s
Ты охеренно тестируешь с разницей в десяток миллисекунд.
#73 by К_Дач
добавь "индексировать по ПериодМакс" перед последним левым соединением
#74 by Холодильник
запускаю раз 10, показывает одно и тоже время выполнения с погрешностью в 1мс
#75 by Холодильник
не особо изменилось. Ок, попробую на основном РС, на 120с. Отпишусь о результатах
#76 by kiruha
Есть алгоритм существенно быстрее , но который использует неявное знание структуры назначений ресурсов регистра суть алгоритма 1) Выбираются валюты и даты , но не все а большие(!) ДатаНач и по ДатаКон где ДатаНач  меньше требуемой на месяц. Если курс найден - валюта исключается из анализа Таких должно быть 90% 2) ДатаНач сдвигается в прошлое еще на 5 месяцев Ищется курс оставшихся валют Если курс найден валюта исключается из анализа 3)Классич алгоритм без ограничений дата начальной для оставшихся валют (древних ?) Количество сдвигов и шаг можно подбирать исходя из практической потребности задачи   Поиск основан на использовании основного индекса Период + [Измерение1 + ...] (Кластерный)
#77 by К_Дач
ну че там, мне интересно
#78 by Холодильник
завтра.. рабочий день почти закончился, лень
#79 by H A D G E H O G s
Холодильник, давай нажал волшебную комбинацию и меряем. Все напряженно ждут.
#80 by К_Дач
Вообще, в рамках твоей задачи, если есть возможность определить из входящей таблицы самую младшую дату - можно попробовать ограничить выборку ресурсов из регистра, как подсказывает
#81 by Холодильник
а откуда я знаю, какие были последние записи в РС. может Тунисский динар последний раз загружали 2 года назад, а я такой возьму и обрежу выборку на 2 послед месяца.
#82 by kiruha
Рубль Доллар Евро Тунниский динар 10 лет записей 1) Выборка за последний месяц Рубль 1, Доллар 30, Евро 40, Туннисий динар - неопределено просмотрено записей 30*4 против 30*4*12*10 полной выборки Получены курсы Рубль, Доллар Динар помещен во врем таблицу 2) Выборка за последние полгода - только по Динару. Значение неопределено Помещен во врем табл 30*1*6 3) Выборка по всему периоду по Динару - определен курс динара 30*1*6*10 Итого примерно 30*1*6*10 против 30*4*6*10 классического алгоритма Индекс Период+Валюта
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям