Вы сделали регистронезависимый JOIN по email как LOWER(u.email) = LOWER(s.email), и запрос стал заметно медленнее. Какое объяснение наиболее вероятно на базовом уровне и что обычно делают в аналитических витринах?
A
LOWER делает сравнение «случайным», поэтому результаты плавают; надо заменить на UPPER.B
JOIN всегда медленный, и ускорить его нельзя.CПроблема в том, что
LOWER меняет тип на int; нужно вернуть text через ::text.DФункция над колонкой усложняет использование индекса/оптимизаций; часто хранят отдельное нормализованное поле (например,
email_lower) и соединяют уже по нему.Правильный ответ. Функции в условии соединения могут делать запрос тяжелее; нормализацию часто выносят в отдельное поле.
Разбор
Нормализовать строки в запросе удобно, но это добавляет вычисления и может ухудшать использование оптимизаций при соединениях. Типичный практичный подход — хранить нормализованное значение (например, email в нижнем регистре) в витрине или материализованном слое и использовать его в JOIN и фильтрах.
Проверь себя · 1/3разбор после ответа
В таблице
products категория хранится как Books, books, BOOKS. Вы хотите отфильтровать все варианты категории «books» в одном запросе. Какое условие в WHERE наиболее надежно?Ещё вопросы по теме «Строки и приведение типов»
- У вас есть таблицы `users(email)` и `marketing_signups(email)`. В одной системе email сохраняется как `Ivan@Example.com`, в другой — `ivan@example.com`. Какой подход в `JOIN` чаще всего решает проблему без изменения данных в таблицах?
- В таблице `products` категория хранится как `Books`, `books`, `BOOKS`. Вы хотите отфильтровать все варианты категории «books» в одном запросе. Какое условие в `WHERE` наиболее надежно?
- В отчёте по городам вы делаете агрегацию по `city`, но видите две строки: `Moscow` и `Moscow ` (с пробелом в конце). Как исправить это прямо в запросе?
- Поле `price_text` хранит цены как текст, например `2`, `10`, `100`. Аналитик написал фильтр `WHERE price_text > '10'` и получил странные результаты. Что нужно поменять, если сравнение должно быть числовым?
- В `amount_text` суммы записаны как текст, но иногда встречается пустая строка `''`. Запрос `SUM(CAST(amount_text AS int))` падает. Какое выражение чаще всего решает проблему, превращая пустые строки в `NULL` перед кастом?
- Все вопросы по «Строки и приведение типов» →