SQL
Как вы оптимизируете SQL-запросы для повышения производительности?
Я оптимизирую SQL запросы следующими методами:
-
Использование индексов:
-
Создание индексов на столбцах, используемых в условиях WHERE, JOIN и ORDER BY.
-
Оптимизация запросов за счет уменьшения количества прочитанных строк.
-
-
Избегание полного сканирования таблиц:
-
Использование условий WHERE для фильтрации данных.
-
Оптимизация запросов путем уменьшения объема обрабатываемых данных.
-
-
Оптимизация JOIN операций:
-
Использование подходящих типов JOIN (INNER, LEFT, RIGHT, FULL).
-
Убедитесь, что столбцы, используемые для соединений, проиндексированы.
-
-
Избегание подзапросов:
- Переписывание подзапроса в JOIN проверяйте по плану и измерениям: оптимизатор может строить одинаковый план, а наивная замена может изменить число строк.
-
Нормализация данных:
- Разделение данных на связанные таблицы для уменьшения избыточности и повышения целостности данных.
-
Профилирование и анализ запросов:
-
Использование EXPLAIN для анализа планов выполнения запросов.
-
Определение узких мест и оптимизация проблемных запросов.
-
Ссылки для изучения
Примеры хороших ответов из реальных собеседований
- Интервью Senior Python Developer · 1:03:47–1:06:17Собеседование · Ответ кандидата
Кандидат объясняет, почему добавления индекса недостаточно: нужно измерить результат и посмотреть план через EXPLAIN. Разбирает стоимость индекса и случаи, когда планировщик выбирает полное сканирование.
Какие методы нормализации данных вы используете и почему?
Я использовал следующиме методы нормализации данных:
-
Первая нормальная форма (
1NF):-
Обеспечение атомарности данных (каждое значение — неделимый элемент).
-
Удаление повторяющихся групп и создание отдельной таблицы для каждого набора связанных данных.
-
-
Вторая нормальная форма (
2NF):-
Устранение частичной зависимости (каждое неключевое поле зависит от всего первичного ключа).
-
Разделение таблиц для обеспечения полной функциональной зависимости.
-
-
Третья нормальная форма (
3NF):-
Устранение транзитивной зависимости (каждое неключевое поле зависит только от первичного ключа).
-
Разделение таблиц для обеспечения независимости данных.
-
Ссылки для изучения
Объясните различия между JOIN операциями в SQL.
Основные различия между разными видами джоинов:
-
INNER JOIN:-
Возвращает только те строки, которые имеют соответствующие значения в обеих соединяемых таблицах.
-
Пример:
SELECT a.*, b.* FROM tableA a INNER JOIN tableB b ON a.id = b.a_id
-
-
LEFT JOIN(LEFT OUTER JOIN):-
Возвращает все строки из левой таблицы и соответствующие строки из правой таблицы. Если соответствующих строк нет, возвращает NULL.
-
Пример:
SELECT a.*, b.* FROM tableA a LEFT JOIN tableB b ON a.id = b.a_id
-
-
RIGHT JOIN(RIGHT OUTER JOIN):-
Возвращает все строки из правой таблицы и соответствующие строки из левой таблицы. Если соответствующих строк нет, возвращает NULL.
-
Пример:
SELECT a.*, b.* FROM tableA a RIGHT JOIN tableB b ON a.id = b.a_id
-
-
FULL JOIN(FULL OUTER JOIN):-
Возвращает все строки, когда есть совпадения в одной из таблиц. Если соответствующих строк нет, возвращает NULL.
-
Пример:
SELECT a.*, b.* FROM tableA a FULL JOIN tableB b ON a.id = b.a_id
-
Ссылки для изучения
Эквивалентны ли CROSS JOIN с WHERE и INNER JOIN ON?
Для inner join FROM a CROSS JOIN b WHERE a.id = b.id реляционно эквивалентен FROM a INNER JOIN b ON a.id = b.id, и зрелый оптимизатор обычно строит одинаковый план. Вторая запись яснее отделяет условие соединения от фильтра результата. Для outer joins перенос условия между ON и WHERE меняет семантику, потому что WHERE может удалить строки, дополненные NULL. Формулировку проверяют для конкретного SQL-диалекта, типа join и плана выбранной версии СУБД.
Ссылки для изучения





