bsl-language-server icon indicating copy to clipboard operation
bsl-language-server copied to clipboard

[NEW] [Запросы] Использование логического "ИЛИ" в условиях соединения

Open artbear opened this issue 4 years ago • 7 comments

Описание проблемы, ошибки, которую надо диагностировать

Не рекомендуется использовать логическое ИЛИ в условиях соединения, то есть в секции ПО запроса. Это так же может привести к выбору неоптимального плана и медленной работе запроса. Простого универсального способа переписать такой запрос без использования ИЛИ не существует. Следует проанализировать решаемую задачу и попытаться найти другой алгоритм ее решения.

В некоторых случаях возможно переписать запрос через ОБЪЕДИНИТЬ ВСЕ Например, вместо

ВЫБРАТЬ Реализация.Ссылка
ИЗ Документ.Реализация.Товары КАК Реализация
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Товары КАК Товар
  ПО Реализация.Товар = Товар.Ссылка
  И (Товар.Артикул = "001" ИЛИ Товар.Цена = 100)

можно использовать

ВЫБРАТЬ Реализация.Ссылка
ИЗ Документ.Реализация.Товары КАК Реализация
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Товары КАК Товар
  ПО Реализация.Товар = Товар.Ссылка
  И Товар.Артикул = "001"

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

ВЫБРАТЬ Реализация.Ссылка
ИЗ Документ.Реализация.Товары КАК Реализация
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Товары КАК Товар
  ПО Реализация.Товар = Товар.Ссылка
  И Товар.Цена = 100

или

  • сначала отобрать товары во временной таблице,
  • а потом сделать соединение по этой временной таблице с простым условием

Ссылка на источник, подтверждающее нарушение либо обоснование наличия проблемы

Параметры диагностики

Тип Статья на русском

  • [ ] :ant: Ошибка
  • [ ] :cop: Уязвимость
  • [ ] :guardsman: Потенциальная уязвимость
  • [x] :poop: Качество кода
  • [ ] :trollface: Другое

Важность Статья на русском

  • [ ] :broken_heart: Блокирующая / Blocker
  • [ ] :heart: Критическая / Critical
  • [x] :yellow_heart: Важная / Major
  • [ ] :blue_heart: Незначительная / Minor
  • [ ] :green_heart: Информационная / Info
  • [ ] :revolving_hearts: Другое

Тэги Статья на русском

  • [ ] STANDARD - "Нарушение стандартов 1С"
  • [ ] LOCKINOS - "Не будет работать в другой ОС"
  • [x] SQL - "Проблема с запросом"
  • [x] PERFORMANCE - "Проблема производительности"
  • [ ] BRAINOVERLOAD - "Непонятный код"
  • [ ] BADPRACTICE - "Плохая практика программирования"
  • [ ] CLUMSY - "Излишние действия"
  • [ ] DESIGN - "Ошибка в проектировании"
  • [ ] SUSPICIOUS - "Подозрительный код"
  • [x] UNPREDICTABLE - "Непредсказуемо работающий код"
  • [ ] DEPRECATED - "Устаревшая функциональность"
  • [ ] ERROR - "Ошибочная конструкция"
  • [ ] LOCALIZE - "Проблемы локализации"

Время на исправление (минут)

15 минут

Дополнительная информация

artbear avatar Feb 22 '21 11:02 artbear

еще соседняя задача по условия соединения https://github.com/1c-syntax/bsl-language-server/issues/1303

artbear avatar Feb 22 '21 11:02 artbear

Если мне не изменяет память, то "ИЛИ" опасно в том случае, если идет по разным полям запроса (сработает скан), в твоем же примере (Товар.Артикул = "001" ИЛИ Товар.Артикул = "002") идет по одному и тому же полю, что вероятнее всего на стороне SQL превратиться в IN, что не приведет к скану и сможет использовать индекс.

Обсуждал уже этот же момент с Олегом в рамках Пулевского плагина). Правило адекватное, пример на первый взгляд неудачный.

ZlobinDV avatar Feb 22 '21 14:02 ZlobinDV

Да, пример я исправил + добавил еще рекомендацию про временные таблицы

artbear avatar Feb 22 '21 15:02 artbear

сделаю этот ПР после завершения работы с https://github.com/1c-syntax/bsl-language-server/pull/1562 - похожие задачи

artbear avatar Feb 22 '21 16:02 artbear

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

Levon444 avatar May 06 '25 08:05 Levon444

@Levon444 актуальна :)

nixel2007 avatar May 07 '25 19:05 nixel2007

Мужчины, немного задержался с диагностикой. подскажите пожалуйста входит ли в рамки данной диагностики наличие оператора ИЛИ не внутри условия соединения, а между условиями.

Это конечно люто редкая штука, но всё же уточняю. Если считаете что контролировать не стоит, то в целом диагностика готова, могу с завтрашнего дня отправить пулл реквест

```
...ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СерииНоменклатуры КАК СерииНоменклатуры
     		ПО РеализацияТоваровУслугТовары.Серия = СерииНоменклатуры.Ссылка
     			ИЛИ РеализацияТоваровУслугТовары.КодТНВЭД = СерииНоменклатуры.Номер
     			ИЛИ РеализацияТоваровУслугТовары.КлючСвязи = СерииНоменклатуры.НомерКиЗГИСМ...

Levon444 avatar May 14 '25 08:05 Levon444