bsl-language-server
bsl-language-server copied to clipboard
[NEW] [Запросы] Использование логического "ИЛИ" в условиях соединения
Описание проблемы, ошибки, которую надо диагностировать
Не рекомендуется использовать логическое ИЛИ в условиях соединения, то есть в секции ПО запроса. Это так же может привести к выбору неоптимального плана и медленной работе запроса. Простого универсального способа переписать такой запрос без использования ИЛИ не существует. Следует проанализировать решаемую задачу и попытаться найти другой алгоритм ее решения.
В некоторых случаях возможно переписать запрос через ОБЪЕДИНИТЬ ВСЕ
Например, вместо
ВЫБРАТЬ Реализация.Ссылка
ИЗ Документ.Реализация.Товары КАК Реализация
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Товары КАК Товар
ПО Реализация.Товар = Товар.Ссылка
И (Товар.Артикул = "001" ИЛИ Товар.Цена = 100)
можно использовать
ВЫБРАТЬ Реализация.Ссылка
ИЗ Документ.Реализация.Товары КАК Реализация
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Товары КАК Товар
ПО Реализация.Товар = Товар.Ссылка
И Товар.Артикул = "001"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ Реализация.Ссылка
ИЗ Документ.Реализация.Товары КАК Реализация
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Товары КАК Товар
ПО Реализация.Товар = Товар.Ссылка
И Товар.Цена = 100
или
- сначала отобрать товары во временной таблице,
- а потом сделать соединение по этой временной таблице с простым условием
Ссылка на источник, подтверждающее нарушение либо обоснование наличия проблемы
- Стандарт - Эффективные условия запросов, п.2
- использование логического ИЛИ в условиях - Типичные причины неоптимальной работы запросов и методы оптимизации
Параметры диагностики
Тип Статья на русском
- [ ] :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 минут
Дополнительная информация
еще соседняя задача по условия соединения https://github.com/1c-syntax/bsl-language-server/issues/1303
Если мне не изменяет память, то "ИЛИ" опасно в том случае, если идет по разным полям запроса (сработает скан), в твоем же примере (Товар.Артикул = "001" ИЛИ Товар.Артикул = "002") идет по одному и тому же полю, что вероятнее всего на стороне SQL превратиться в IN, что не приведет к скану и сможет использовать индекс.
Обсуждал уже этот же момент с Олегом в рамках Пулевского плагина). Правило адекватное, пример на первый взгляд неудачный.
Да, пример я исправил + добавил еще рекомендацию про временные таблицы
сделаю этот ПР после завершения работы с https://github.com/1c-syntax/bsl-language-server/pull/1562 - похожие задачи
Мужчины, если разработка диагностики актуальна мог бы взять в работу.
@Levon444 актуальна :)
Мужчины, немного задержался с диагностикой. подскажите пожалуйста входит ли в рамки данной диагностики наличие оператора ИЛИ не внутри условия соединения, а между условиями.
Это конечно люто редкая штука, но всё же уточняю. Если считаете что контролировать не стоит, то в целом диагностика готова, могу с завтрашнего дня отправить пулл реквест
```
...ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СерииНоменклатуры КАК СерииНоменклатуры
ПО РеализацияТоваровУслугТовары.Серия = СерииНоменклатуры.Ссылка
ИЛИ РеализацияТоваровУслугТовары.КодТНВЭД = СерииНоменклатуры.Номер
ИЛИ РеализацияТоваровУслугТовары.КлючСвязи = СерииНоменклатуры.НомерКиЗГИСМ...