Как оптимизировать SQL-запрос в 1С и улучшить его производительность?

База знаний Одина — Одинэсника Форумы ODIN — Форум по 1С Предприятию Как оптимизировать SQL-запрос в 1С и улучшить его производительность?

Просмотр 1 ветки ответов
  • Автор
    Сообщения
    • #37251
      Фото аватараOdineski
      Участник

        ВЫБРАТЬ
        ЗаказПредварительныйТовары.Ссылка КАК Ссылка,
        ЗаказПредварительныйТовары.Ссылка.ДатаПоставки КАК ДатаПоставки,
        ЗаказПредварительныйТовары.Ссылка.ДатаПоставкиПоставщика КАК ДатаПоставкиПоставщика,
        ЗаказПредварительныйТовары.Ссылка.СквознаяНумерацияПоставщика КАК СквознаяНумерацияПоставщика,
        ЗаказПредварительныйТовары.Ссылка.Номер КАК Номер,
        ЗаказПредварительныйТовары.Номенклатура КАК Номенклатура,
        ЗаказПредварительныйТовары.Количество КАК Количество,
        ЗаказПредварительныйТовары.КоличествоСобрано КАК КоличествоСобрано,
        ЗаказПредварительныйТовары.Ссылка.НомерЗаказаКонтрагента КАК НомерЗаказаКонтрагента,
        ЗаказПредварительныйТовары.Ссылка.НомерТорг12 КАК НомерТорг12,
        ЗаказПредварительныйТовары.Номенклатура.Код КАК НоменклатураКод,
        ЗаказПредварительныйТовары.Ссылка.Филиал КАК Филиал,
        ЗаказПредварительныйСопоставление.ОсновнойЗаказ.НомерТорг12 КАК ОсновнойЗаказНомерТорг12
        ИЗ
        Документ.ЗаказПредварительный.Товары КАК ЗаказПредварительныйТовары
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗаказПредварительныйСопоставление КАК ЗаказПредварительныйСопоставление
        ПО ЗаказПредварительныйТовары.Ссылка = ЗаказПредварительныйСопоставление.ЗаказПредварительный
        ГДЕ
        ЗаказПредварительныйТовары.Ссылка.ДатаПоставки МЕЖДУ &ДатаПоставкиС И &ДатаПоставкиПо
        И ЗаказПредварительныйТовары.Ссылка.Поставщик = &Поставщик
        И ЗаказПредварительныйТовары.Номенклатура = &Номенклатура

        СГРУППИРОВАТЬ ПО
        ЗаказПредварительныйТовары.Ссылка,
        ЗаказПредварительныйТовары.Ссылка.ДатаПоставки,
        ЗаказПредварительныйТовары.Ссылка.ДатаПоставкиПоставщика,
        ЗаказПредварительныйТовары.Ссылка.СквознаяНумерацияПоставщика,
        ЗаказПредварительныйТовары.Ссылка.Номер,
        ЗаказПредварительныйТовары.Номенклатура,
        ЗаказПредварительныйТовары.Количество,
        ЗаказПредварительныйТовары.КоличествоСобрано,
        ЗаказПредварительныйТовары.Ссылка.НомерЗаказаКонтрагента,
        ЗаказПредварительныйТовары.Ссылка.НомерТорг12,
        ЗаказПредварительныйТовары.Номенклатура.Код,
        ЗаказПредварительныйТовары.Ссылка.Филиал,
        ЗаказПредварительныйСопоставление.ОсновнойЗаказ.НомерТорг12″}

      • #37252
        bot_avaOdin — Одинэсник
        Участник

          Оптимизация запроса по 1С:

          1. Убрать лишний GROUP BY, если нет агрегатных функций. В вашем запросе нет агрегатных функций (SUM, COUNT и т.п.), а группировка по всем полям фактически не нужна. Можно просто убрать GROUP BY.

          2. Если нужны уникальные записи, используйте DISTINCT вместо GROUP BY.

          3. Упростить выборку полей из ссылки. Вместо повторного обращения к ЗаказПредварительныйТовары.Ссылка.Поле лучше сделать отдельный JOIN с Документом.ЗаказПредварительный, чтобы не дублировать обращения.

          4. Проверить индексы по полям фильтра: ДатаПоставки, Поставщик, Номенклатура. Если их нет — добавить.

          5. Если в регистре ЗаказПредварительныйСопоставление много записей, убедитесь, что по полю ЗаказПредварительный есть индекс.

          6. Если нужно получить только последние данные по Заказу, можно добавить фильтр по дате или статусу.

          Переписанный запрос с учетом:

          |ВЫБРАТЬ
          | ЗПТовары.Ссылка КАК Ссылка,
          | ЗП.ДатаПоставки,
          | ЗП.ДатаПоставкиПоставщика,
          | ЗП.СквознаяНумерацияПоставщика,
          | ЗП.Номер,
          | ЗПТовары.Номенклатура,
          | ЗПТовары.Количество,
          | ЗПТовары.КоличествоСобрано,
          | ЗП.НомерЗаказаКонтрагента,
          | ЗП.НомерТорг12,
          | ЗПТовары.Номенклатура.Код КАК НоменклатураКод,
          | ЗП.Филиал,
          | ЗПС.ОсновнойЗаказ.НомерТорг12 КАК ОсновнойЗаказНомерТорг12
          |ИЗ
          | Документ.ЗаказПредварительный.Товары КАК ЗПТовары
          | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЗаказПредварительный КАК ЗП
          | ПО ЗПТовары.Ссылка = ЗП.Ссылка
          | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗаказПредварительныйСопоставление КАК ЗПС
          | ПО ЗПТовары.Ссылка = ЗПС.ЗаказПредварительный
          |ГДЕ
          | ЗП.ДатаПоставки МЕЖДУ &ДатаПоставкиС И &ДатаПоставкиПо
          | И ЗП.Поставщик = &Поставщик
          | И ЗПТовары.Номенклатура = &Номенклатура

          Если уникальность нужна — добавьте DISTINCT после ВЫБРАТЬ.

          Такой запрос:

          — Убирает GROUP BY, т.к. он не нужен без агрегатов.

          — Делает явное соединение с документом ЗаказПредварительный для доступа к полям ссылки.

          — Сохраняет соединение с регистром сопоставления.

          — Упрощает чтение и потенциально улучшает производительность.

          Рекомендую проверить индексы по полям фильтра и соединениям.

          Если в базе много данных, можно дополнительно ограничить выборку по дате или статусу.

          Если нужна помощь с индексами — могу подсказать.

      Просмотр 1 ветки ответов
      • Для ответа в этой теме необходимо авторизоваться.
      База знаний 1С