• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Оптимизация Работы С Тз

  • Автор темы Hryv
  • Дата начала
H

Hryv

Есть две ТЗ с одинаковыми колонками: Товар, Цена, День, НачО, КонО, Приход, Расход

Если в ТЗ1 и в ТЗ2 есть строки с совпадающими Товар, Цена, День, то надо
ТЗ1.Приход = ТЗ1.Приход+ТЗ2.Приход;
ТЗ1.Расход = ТЗ1.Расход+ТЗ2.Расход;

а если в ТЗ2 есть строка с такими Товар, Цена, День, которых нет в ТЗ1, то в ТЗ1 надо добавить строку

Я сделал вложенный цикл, все работает правильно
Однако если делать за 10 дней, то время выполнения еще терпимое, но как правило будут делать за месяц
Через 8 минут по секундомеру я прервал отчет

замер показал, что тормозит этот цикл
 
H

Hryv

unknown181538, я специально не выкладывал
чтобы не вести ваши мысли в одном направлении
вдруг кто-то предложит радикально иной эффективный подход


кстати больше всего весит конкретно одна строка
Если (ТЗ1.Товар=ТЗ2.Товар) и (ТЗ1.Цена = ТЗ2.Цена) и (ТЗ1.День = ТЗ2.День) Тогда

за 5 дней - 15%
за 15 дней - 28% (более 3 млн. вызовов) - это уже первая строка во всем отчете
 
U

unknown181538

Идея такая:
В ТЗ1 добавить колонку "ПерваяТЗ" типа "число", заполнить ее единицей.
Перегнать данные всех строк 2-й ТЗ в первую по колонкам "Товар","День","Цена","Приход","Расход"
ТЗ1.Свернуть("Товар,День,Цена","Приход,Расход,ПерваяТЗ").
Строки, где ПерваяТЗ = 0 удалить.
 
H

Hryv

unknown181538, или я не понял идею или она не правильная, так как я не вижу как нужные остатки из ТЗ2 попадут в ТЗ1

Но в любом случае вопрос снимается
Я решил копнуть глубже
Обе ТЗ формируются запросами
Вроде уже вижу как одним запросом сразу получить одну ТЗ со всеми нужными данными

Сейчас буду тестить
 
U

unknown181538

unknown181538, или я не понял идею или она не правильная, так как я не вижу как нужные остатки из ТЗ2 попадут в ТЗ1
таак...
попробую примеры
Товар дата Приход ПерваяТЗ ТЗ2. Товар Дата Приход ПерваяТЗ
Товар1 01.01.2011 10 1 Товар1 01.01.2011 15 0
Товар1 02.01.2011 10 0

После объединения
Товар дата Приход ПерваяТЗ
Товар1 01.01.2011 10 1
Товар1 01.01.2011 15 0
Товар1 02.01.2011 10 0

ТЗ1 после свертки:
Товар дата Приход ПерваяТЗ
Товар1 01.01.2011 25 1
Товар1 02.01.2011 10 0

После удаления:
Товар дата Приход ПерваяТЗ
Товар1 01.01.2011 25 1


А... стоп.. надо подумать. Условия не четко прочитал.

Добавлено: Фразу про остатки упустил.
Но, если все записи в ТЗ2 уникальны, то в ТЗ1 добавляем колонку НачОстИзТЗ2, и в конце циклов, если ПерваяТЗ=0 не удаляем, а переписываем из вспомогательных колонок в основные.
 
H

Hryv

Но, если все записи в ТЗ2 уникальны, то в ТЗ1 добавляем колонку НачОстИзТЗ2, и в конце циклов, если ПерваяТЗ=0 не удаляем, а переписываем из вспомогательных колонок в основные.

Похоже что так сработало бы

Возьму на заметку, но проверять уже не буду, так как замена двух запросов на один решила проблему
Теперь за месяц отрабатывает быстрее 1 минуты
 
P

puh14

Одним запросом вестимо лучше. А так - разсруктуры ТЗ одинаковые, сам бог велел Тз.свернуть()
 
A

Allexei

В одном запросе сделать выборку двух таблиц. Сдал ать "индексное поле" Товар+Цена+День. Далее сделать объединение по этому полю с суммированием прихода и расхода.

.....
Ой.Извеняюсь. Не увидел что 7.7.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!