Борзенкова Анна

72
Рейтинг

azazana
Анна Борзенкова



  •   Регистрация: 15.08.2012 (11 лет назад)

  •   Был(а) на сайте: 10.02.2024

Друзья
  • Дмитрий Малышев
Подписчики 6

Группы

Профессиональный разработчик

Рейтинг 72

Кто круче: "ИЛИ" или "ОБЪЕДИНИТЬ ВСЕ" в запросе?

Статья Программист Платформа 1С v8.3 Сложные периодические расчеты Запросы 1С:Зарплата и Управление Персоналом 2.5 MySQL Абонемент ($m) Внешний отчет (ert,erf) HighLoad оптимизация

Реальный пример оптимизации запроса. Статья будет полезна людям, изучающим вопросы оптимизации запросов в 1С и для подготовки к экзамену "1С: Эксперт по технологическим вопросам", поскольку в статье описывается один их методов расследования причин неоптимальных запросов. UPD. Коллеги в комментариях заметили ошибку, она была исправлена и сейчас выложены данные с корректным решением.

1 стартмани

14.09.2019    10157    azazana    29       

20

Ловец дедлоков СУБД

Статья Системный администратор Программист Платформа 1С v8.3 Россия MS SQL Абонемент ($m) Архив с данными HighLoad оптимизация

Анализ простейшего дедлока СУБД в рабочей базе с использованием ЦУП (центра управления производительностью) и profiler MS SQL (Microsoft SQL Server). Эта статья будет полезна людям, изучающим вопросы оптимизации работы 1С, или тем, у кого возникают дедлоки в рабочей базе. UPD 09.07.2019 добавлено воспроизведение блокировки в случае установки управляемой блокировки перед чтением набора записей регистра сведений. UPD 10.07.2019 добавлена тестовая база с примером.

1 стартмани

08.07.2019    15690    4    azazana    80       

52

Комментарии

DevПример работы с диаграммой Ганта в 1С#6 06.09.23 10:05
(5) У меня такая же проблема. Удалось найти как изменить ширину?
HighLoadКто круче: "ИЛИ" или "ОБЪЕДИНИТЬ ВСЕ" в запросе?#27 12.10.19 20:09
(25) Добрый вечер!
Спасибо, это хороший совет. Я проверила - результат выполнения 2 секунды запроса, индекс используется.
Посмотрела план запроса, он очень похож на тот который получился при использовании ИЛИ.
HighLoadКто круче: "ИЛИ" или "ОБЪЕДИНИТЬ ВСЕ" в запросе?#26 12.10.19 19:28
Я попробовала. Результат 34 секунды. То же самое + индексирование в запросе по полю сотрудник выигрыша в скорости так же не дало.
HighLoadКто круче: "ИЛИ" или "ОБЪЕДИНИТЬ ВСЕ" в запросе?#23 20.09.19 18:27
(19) Боюсь, что "Выразить" в данном случае не поможет. У этот реквизит может быть как типом значения "сотрудник", так и "график".
Код
ВЫБРАТЬ
                Сотрудники.Сотрудник КАК Сотрудник
            ИЗ
                ВТСотрудники КАК Сотрудники
            ОБЪЕДИНИТЬ ВСЕ
            ВЫБРАТЬ
                ГрафикиРаботников.ГрафикРаботы
            ИЗ
                ВТГрафикиРаботников КАК ГрафикиРаботников
HighLoadКто круче: "ИЛИ" или "ОБЪЕДИНИТЬ ВСЕ" в запросе?#22 20.09.19 18:19
(3) Согласна. Исправила.
У меня почему-то в голове осталось, что "ОБЪЕДИНИТЬ ВСЕ" всегда лучше чем "ИЛИ"
Кстати, если переписать запрос вот так:
Код
ВЫБРАТЬ РАЗРЕШЕННЫЕ
   ГрафикиРаботыПоВидамВремени.ГрафикРаботы КАК ГрафикРаботы,
   ГрафикиРаботыПоВидамВремени.Дата КАК Дата,
   НАЧАЛОПЕРИОДА(ГрафикиРаботыПоВидамВремени.Дата, МЕСЯЦ) КАК ПериодРегистрации,
   ГрафикиРаботыПоВидамВремени.ОсновноеЗначение,
   ГрафикиРаботыПоВидамВремени.ВидУчетаВремени КАК ВидУчетаВремени,
   ГрафикиРаботыПоВидамВремени.Документ,
   ГрафикиРаботыПоВидамВремени.План КАК План

ПОМЕСТИТЬ ВТГрафикиРаботыПоВидамВремени

ИЗ
      РегистрСведений.ГрафикиРаботыПоВидамВремени КАК ГрафикиРаботыПоВидамВремени

ГДЕ
   ГрафикиРаботыПоВидамВремени.ГрафикРаботы В
      (ВЫБРАТЬ
      Сотрудники.Сотрудник
           ИЗ
                ВТСотрудники КАК Сотрудники)
   И ГрафикиРаботыПоВидамВремени.Дата МЕЖДУ &НачалоПериода И &КонецПериода
   И ГрафикиРаботыПоВидамВремени.ВидУчетаВремени <> ЗНАЧЕНИЕ(Перечисление.ВидыУчетаВремени.ПоДням)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   ГрафикиРаботыПоВидамВремени.ГрафикРаботы,
   ГрафикиРаботыПоВидамВремени.Дата,
   НАЧАЛОПЕРИОДА(ГрафикиРаботыПоВидамВремени.Дата, МЕСЯЦ),
   ГрафикиРаботыПоВидамВремени.ОсновноеЗначение,
   ГрафикиРаботыПоВидамВремени.ВидУчетаВремени,
   ГрафикиРаботыПоВидамВремени.Документ,
   ГрафикиРаботыПоВидамВремени.План

ИЗ

   РегистрСведений.ГрафикиРаботыПоВидамВремени КАК ГрафикиРаботыПоВидамВремени

ГДЕ
   ГрафикиРаботыПоВидамВремени.ГрафикРаботы В
      (ВЫБРАТЬ
           ГрафикиРаботников.ГрафикРаботы
       ИЗ
           ВТГрафикиРаботников КАК ГрафикиРаботников)
    И ГрафикиРаботыПоВидамВремени.Дата МЕЖДУ &НачалоПериода И &КонецПериода
    И ГрафикиРаботыПоВидамВремени.ВидУчетаВремени <> ЗНАЧЕНИЕ(Перечисление.ВидыУчетаВремени.ПоДням)


То тоже работает быстро. Так что не все "ОБЪЕДИНИТЬ ВСЕ" одинаково полезны.
HighLoadКто круче: "ИЛИ" или "ОБЪЕДИНИТЬ ВСЕ" в запросе?#21 18.09.19 15:35
(13) Проверила - выполняется так же долго.
HighLoadКто круче: "ИЛИ" или "ОБЪЕДИНИТЬ ВСЕ" в запросе?#18 16.09.19 12:56
(5) Спасибо большое за замечание, ошибка исправлена, новые результаты замера производительности и трассировки в статье.
HighLoadКто круче: "ИЛИ" или "ОБЪЕДИНИТЬ ВСЕ" в запросе?#17 16.09.19 12:55
(9) Выложила исправленное решение.
HighLoadКто круче: "ИЛИ" или "ОБЪЕДИНИТЬ ВСЕ" в запросе?#16 16.09.19 12:18
(5)
Цитата
судя структуре регистра, чтобы индекс был покрывающим нужно добавить еще условие по полю "план" и "месяц", также индекс не используется, если используется "НЕ" в условиях запрос
Если бы индекс был покрывающим, это было бы совсем идеально, но не всегда реализуемо. А в данном случае можно сделать так, чтобы индекс использовался хотя бы частично - по первому измерению, остальное, да, пришлось сканировать, но все равно выигрыш в скорости получился на порядок.