1. Набираем команду codeby webinar. Набираем команду для организации и проведения вебинаров. Подробнее ...

    Скрыть объявление
  2. Требуются разработчики и тестеры для проекта codebyOS. Требования для участия в проекте: Знание принципов работы ОС на базе Linux; Знание Bash; Крайне желательное знание CPP, Python, Lua; Навыки системного администрирования. Подробнее ...

    Скрыть объявление
  3. Получи 30.000 рублей. Для получения денег необходимо принять участие в конкурсе авторов codeby. С условиями и призами можно ознакомиться на этой странице ...

    Внимание! Регистрация авторов на конкурс закрыта.

    Скрыть объявление

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

Тема в разделе "Базы данных и администрирование", создана пользователем Hryv, 20 окт 2011.

  1. Hryv

    Hryv Гость

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

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

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

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

    замер показал, что тормозит этот цикл
     
  2. unknown181538

    unknown181538 НеГуру

    Репутация:
    0
    Регистрация:
    28 дек 2008
    Сообщения:
    1.417
    Симпатии:
    0
    Можно код посмотреть хоть?
     
  3. Hryv

    Hryv Гость

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


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

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

    unknown181538 НеГуру

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

    Hryv Гость

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

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

    Сейчас буду тестить
     
  6. unknown181538

    unknown181538 НеГуру

    Репутация:
    0
    Регистрация:
    28 дек 2008
    Сообщения:
    1.417
    Симпатии:
    0
    таак...
    попробую примеры
    Товар дата Приход ПерваяТЗ ТЗ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 не удаляем, а переписываем из вспомогательных колонок в основные.
     
  7. Hryv

    Hryv Гость

    Репутация:
    0
    Похоже что так сработало бы

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

    puh14 Well-Known Member

    Репутация:
    0
    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    Одним запросом вестимо лучше. А так - разсруктуры ТЗ одинаковые, сам бог велел Тз.свернуть()
     
  9. Allexei

    Allexei Well-Known Member

    Репутация:
    0
    Регистрация:
    2 май 2008
    Сообщения:
    322
    Симпатии:
    1
    В одном запросе сделать выборку двух таблиц. Сдал ать "индексное поле" Товар+Цена+День. Далее сделать объединение по этому полю с суммированием прихода и расхода.

    .....
    Ой.Извеняюсь. Не увидел что 7.7.
     
Загрузка...

Поделиться этой страницей