Пишете ли вы JOIN-запросы вручную
Что проверяют
Не спрятались ли вы целиком за ORM. В питон-бэкенде почти все запросы уходят через ORM, и вопрос проверяет, понимаете ли вы, во что она разворачивается и что делать с медленным отчётом.
Как отвечать
Скажите, что пишете, и уточните когда: отчёты, разовые выборки, всё, что в ORM выглядит нечитаемо. Что стоит показать:
- разницу видов соединения и то, что условие на присоединяемую таблицу живёт в
ON, а не вWHERE; - кратность связи: соединение один ко многим размножает строки левой таблицы, и сумма по ней считается неверно;
- агрегацию подзапросом или подсчёт уникальных значений вместо надежды на
distinct; - чтение плана запроса и индекс на колонку соединения.
Со стороны ORM полезно назвать соответствие: один способ предзагрузки превращается в соединение, другой делает второй запрос и склеивает результат уже в Python. Первый дешевле для связи многие к одному, второй спасает от размножения строк на связи многие ко многим. Отдельно скажите, как ловите лишние запросы: логирование SQL или панель отладки.
Где спотыкаются
Ставят условие на присоединённую таблицу в WHERE при левом соединении. Строки без пары отфильтровываются, соединение молча превращается во внутреннее, и из отчёта пропадают ровно те записи, ради которых он писался.
Лечат задвоение через distinct. Дубли исчезают из списка, но сумма уже посчитана по размноженным строкам, а если строки различаются хоть одной колонкой, не исчезают и они. Разбираться надо с кратностью связи.
Не смотрят план. Соединение по неиндексированной колонке или по выражению вроде приведения к нижнему регистру даёт полный проход по таблице, а в коде на ORM это одна безобидная строка, и замечают проблему уже на проде.