Последний раз про срез последних (на каждую дату в запросе)
Срез последних на каждую дату в запросе. Известные факты о задаче:
часто встречается на испытаниях соискателей на работу программистом 1с,
постоянно провоцирует споры об оптимальном решении.
В данном тексте приводятся замеры производительности различных вариантов решения задачи.
- Описание
- Подробнее
Описание
На проведение данного исследования меня натолкнула статья «Срез на даты за период. Шаблон запроса» с комментариями. Суть статьи: автор привел два варианта решения известной задачи — традиционный и свой собственный («интервальный»). В комментариях оба варианта подверглись резкой критике за сложность — большой объем текста, временные таблицы. Цитирую критиков:
«давно уже подобную задачу решают одним запросом (без всяких временных таблиц) с двумя левыми соединениями»
«Не вникал в смысл задачи, но срез на дату чего-либо по периоду делается простым 1 запросом без всяких ВТ.»
Комментаторы оказались людьми слова и дела, предложили два своих варианта, без временных таблиц, в один запрос.
Изначально, я был сторонником традиционного способа — он давно известен, интуитивно понятен (но это не точно) и более-менее оптимальный по производительности (это тоже не точно). Вариант автора — тоже интересный, мне такая идея в голову не приходила, но, почему-то, он мне показался менее производительным.
Оба варианта из комментариев — короткие, лаконичные, но затратные по ресурсам, на мой взгляд.
Но вообще, интересно провести исследование, и цифрами показать, какой из вариантов лучше и на сколько.
Почти год я собирался с мыслями. Потом провел эксперимент. Еще почти год созревал изложить это в виде статьи. Наконец, созрел 🙂
По ходу изучения темы, мне попался еще один вариант в статье «Минимализмы» п.4. Тоже в один запрос, довольно диковинное решение, вряд ли применимое на практике, но интересное.
Итого получилось 5 вариантов.
На мой взгляд, все такие задачи в реальности примерно одного типа. Возьмем самую типичную:
- организация продает товары (документ Реализация товаров);
- их цена хранится в регистре (периодический регистр сведений Цены) и меняется во времени;
- продавец может устанавливать скидку в момент продажи, но не более некоторого процентного значения;
- в какой-то момент времени нужно проверить, что все скидки действительно не превышали этого порога;
- если превышали, то где, когда, на сколько;
- значения скидок в документах не хранятся (или хранятся, но мы им не доверяем), а считаем отношение цены из документа продажи к значению цены их регистра на дату.