SQL Flashcards
Что такое партиционирование таблиц в SQL, какие могут быть проблемы при выборе ключа (по какому алгоритму будут выбираться партиции и какому атрибуту), и доводилось ли вам с ними работать?
Теги: #ЛигаЦифровогоИнтернета
- Что такое партицироване: Это техника, которая позволяет разбить таблицу на несколько физических или логических разделов. Каждая такая разделенная часть называется партицией. Разделение может основываться на различных критериях или ключах, таких как диапазон значений столбца, хеш-значение, список значений и т. д. Существует два основных варианта партиционирования в SQL — горизонтальное и вертикальное. Хорошей практикой при выборе патриции является выбор колонки с высокой селективностью, чтобы данные равномерно распределялись по партициям.
Проблемы выбора ключа:
Партиционирование по дате
Плюсы:
* Простота понимания.
* Стабильное количество строк в партиции.
Минусы:
* Необходима регулярная поддержка (добавление новых партиций).
* Поиск по имени или ID сканирует все партиции.
Партиционирование по ID
Плюсы:
* Простота понимания.
* Стабильное количество строк в партиции.
Минусы:
* Требует добавления новых партиций.
* Поиск по имени или ID сканирует все партиции.
Партиционирование по первой букве имени
Плюсы:
* Простота понимания.
* Фиксированный набор партиций, не требует поддержки.
Минусы:
* Постоянный рост объема данных в партициях.
* Неровное распределение данных (некоторые буквы популярнее).
* Поиск по ID сканирует все партиции.
Какие существуют физические типы джойнов? Каковы их особенности
#ЛеруаМерлен #Yandex #wildberries #okko #ЛигаЦифровогоИнтернета #cобес
- Nested Loop:
o Когда использовать: Для небольших наборов данных, где одна таблица значительно меньше другой.
o Механизм работы:
1. Внешняя таблица (outer table): перебирается построчно.
2. Внутренняя таблица (inner table): для каждой строки из внешней таблицы выполняется проверка всех строк внутренней таблицы на соответствие условию соединения.
o Особенности:
1. Не использует оперативную память
2. Эффективен для малых объемов данных.
3. Медленный для больших таблиц. - Merge Join:
o Когда использовать: Для отсортированных данных или если сортировка может быть выполнена заранее.
o Механизм работы:
1. Оба набора данных должны быть отсортированы по ключам соединения. Далее два отсортированных потока данных «сливаются» (как в процессе слияния отсортированных списков):
2. Сравниваются текущие элементы обоих потоков.
3. Если значение из первой таблицы меньше, указатель первой таблицы сдвигается вперёд.
4. Если значение из второй таблицы меньше, сдвигается указатель второй таблицы.
5. Если значения равны — происходит соединение, и оба указателя сдвигаются вперёд.
o Особенности:
1. Эффективен для больших объемов данных, если они отсортированы.
2. Требует дополнительных затрат на сортировку, если данные не отсортированы.
- Hash Join:
o Когда использовать: Для больших наборов данных, особенно если одна из таблиц помещается в память.
o Механизм работы:
1. Выбирается меньшая таблица и загружается в память.
2. Строится хеш-таблица на основе ключевого столбца соединения.
3. Для каждой строки из второй таблицы выполняется поиск совпадений в хеш-таблице.
o Если совпадение найдено, строки объединяются.
o Особенности:
1. Быстрый для неотсортированных данных.
2. Требует выделения памяти для хеш-таблицы.
3. Неэффективен при ограничении ресурсов памяти.
Что такое ACID и почему это важно в контексте СУБД?
Теги: #SQL #cобес
- Atomicity (Атомарность): Транзакция либо выполняется полностью, либо не выполняется.
- Consistency (Согласованность): Данные переходят из одного непротиворечивого состояния в другое.
- Isolation (Изоляция): Результаты транзакций не влияют друг на друга до завершения.
- Durability (Надёжность): Изменения, зафиксированные транзакцией, сохраняются даже при сбоях.
Почему ACID важен в контексте СУБД?
Обеспечивает целостность данных – данные остаются корректными даже в условиях сбоев. Позволяет безопасно работать с параллельными транзакциями – критично для многопользовательских систем. Предотвращает повреждение данных – особенно важно для банковских, медицинских, финансовых и других критически важных систем. Обеспечивает восстановление данных – в случае сбоев данные остаются в целостном состоянии.
Какие существуют уровни изоляции транзакций в разных СУБД (PgSQL, Oracle, MS SQL) и в чем их суть ?
Теги: #SQL #Yandex #🐺 #cобес
READ UNCOMMITTED
* Самый низкий уровень изоляции.
* Допускаются «грязные» (не зафиксированные) чтения, а также все другие аномалии (non-repeatable read, phantom read).
READ COMMITTED
* Запрещены «грязные» чтения.
* Но по-прежнему возможны non-repeatable read и phantom read.
REPEATABLE READ
* Запрещены «грязные» чтения и non-repeatable read.
* Однако возможны «фантомные» чтения (появление новых строк при повторном запросе).
SERIALIZABLE
* Самый строгий уровень по стандарту.
* Исключены все три аномалии (нет dirty read, non-repeatable read, phantom read).
* Поведение эквивалентно последовательному (serial) выполнению транзакций.
- PostgreSQL: READ UNCOMMITTED (работает как READ COMMITTED), READ COMMITTED, REPEATABLE READ, SERIALIZABLE (SSI).
- Oracle: READ COMMITTED, SERIALIZABLE (плюс механизмы многоверсионности).
- MS SQL: READ UNCOMMITTED, READ COMMITTED (по умолчанию), REPEATABLE READ, SERIALIZABLE, а также SNAPSHOT ISOLATION.
Что такое индексы в SQL, чем отличаются «индексирование» и «индексация», и в каких случаях они применяются?
Теги: #SQL #ЛигаЦифровогоИнтернета #wildberries
- Что такое: Индекс в базе данных — это структура данных, которая хранит значения из одного или нескольких столбцов таблицы и указатели на соответствующие строки в исходной таблице, где данные фактически хранятся.
- Отличия «индексирование» и «индексация»: «Индексирование» — процесс создания/обновления индексов; «индексация» — более общий термин, связанный с использованием индексов.
В чём отличие JOIN от UNION?
Теги: #yandex #РСХБ #t1
- JOIN: Объединяет таблицы по столбцам (строки «достраиваются» дополнительными полями).
- UNION: Складывает результаты двух запросов (строки) друг за другом в общий набор.
В чём разница между UNION и UNION ALL?
Теги: #yandex #РСХБ
- UNION: Убирает дубликаты, требует дополнительной сортировки/сравнения.
- UNION ALL: Возвращает все строки (включая дубли), быстрее за счёт отсутствия «чистки» дубликатов.
В чём отличие между WHERE и HAVING в SQL?
Теги: #yandex
- WHERE: Фильтрует строки до группировки.
- HAVING: Фильтрует уже сформированные группы (используется вместе с GROUP BY).
В чём отличие GROUP BY и DISTINCT в SQL?
Теги: #yandex
- GROUP BY: Группирует строки по заданным столбцам, позволяя применять агрегатные функции к каждой группе.
- DISTINCT: Убирает точные дубликаты строк в результате, не выполняя при этом группировку с агрегатами.
Что такое GROUPING SETS в SQL и для чего они используются?
Теги: #yandex
- Что это: это механизм в SQL, который позволяет в одном запросе получить агрегации (итоговые данные) сразу по нескольким наборам группировок.
- Как это работает:
1. Вы указываете GROUP BY GROUPING SETS ((столбец1), (столбец2), (столбец1, столбец2)).
2. SQL в результате вернёт строки с агрегированными данными по каждому набору столбцов внутри скобок. - Для чего: Получать агрегированные результаты по разным комбинациям группировок (например, по годам, по месяцам, по обоим сразу) в одном запросе.
Каково поведение разных форм COUNT (COUNT(*), COUNT(1), COUNT(id), COUNT(‘id’), COUNT(NULL))?
Теги: #yandex
- COUNT(*) и COUNT(1): Считают все строки. Результат обычно одинаков.
- COUNT(id): Считает строки, где id не NULL.
- COUNT(‘id’): Зависит от СУБД, обычно эквивалентно COUNT(*), так как ‘id’ — строка, не NULL.
- COUNT(NULL): Всегда 0, поскольку NULL-значения не учитываются.
Какие инструменты вы используете (или использовали) для просмотра и анализа SQL-запросов?
Теги: #РСХБ
- PostgreSQL
1.1. EXPLAIN / EXPLAIN ANALYZE
* EXPLAIN показывает предполагаемый план запроса.
* EXPLAIN ANALYZE выполняет запрос и показывает реальный план с фактическим временем выполнения.
1.2. Графические клиенты
* pgAdmin
* DBeaver
* Любые другие клиенты, позволяющие просматривать план выполнения (через EXPLAIN) и статистику.
1.3. Системные представления и логи
* pg_stat_activity – можно увидеть активные запросы, их статус.
* Логи PostgreSQL (postgresql.log) – позволяют отследить долгие запросы при включённом логировании log_min_duration_statement.
1.4. Средства профилирования и мониторинга
* auto_explain (расширение PostgreSQL) – записывает планы запросов в лог.
* Сторонние инструменты:
o pgBadger – анализ логов.
o Prometheus + Grafana – метрики и дашборды по производительности. - Oracle
2.1. EXPLAIN PLAN / DBMS_XPLAN
* EXPLAIN PLAN FOR <запрос> – позволяет сформировать план выполнения. Результаты хранятся во временной таблице PLAN_TABLE.
* Пакет DBMS_XPLAN (например, DBMS_XPLAN.DISPLAY) – удобный способ посмотреть и отформатировать план.
2.2. Графические клиенты
* SQL Developer – позволяет получать графическое представление плана, профилировать SQL.
* DBeaver – также умеет работать с Oracle и показывать план выполнения.
2.3. Системные представления
* V$SQL, V$SQLAREA, V$SESSION – дают информацию по выполняющимся/выполнявшимся SQL-запросам, планам, статистике по использованию ресурсов.
* AWR (Automatic Workload Repository) и Statspack – отчёты по производительности и «горячим» запросам.
* OEM (Oracle Enterprise Manager) – веб-интерфейс для мониторинга, даёт доступ к подробной статистике по SQL.
2.4. Средства профилирования
* SQL Trace и TKPROF – инструменты для детального трейсинга и форматирования информации о выполнении запросов (показывают время выполнения, ожидания, использование ресурсов).</запрос> - Microsoft SQL Server
3.1. EXPLAIN (Display Estimated Execution Plan / Actual Execution Plan)
* В SSMS (SQL Server Management Studio) можно включить отображение Estimated Execution Plan (план оптимизатора) и Actual Execution Plan (реальный план по факту выполнения).
3.2. Графические клиенты
* SQL Server Management Studio (SSMS) – основной клиент.
* Azure Data Studio, DBeaver – альтернативные клиенты с просмотром плана.
3.3. Логи и системные представления
* system_health Extended Event – встроенный сбор базовых событий и ошибок.
* Просмотр долгих запросов через Extended Events или при помощи Profiler (хотя Profiler считается устаревающим).
* Dynamic Management Views (DMVs) (например, sys.dm_exec_query_stats, sys.dm_exec_sql_text) – позволяют анализировать планы, статистику использования CPU/памяти и т.д.
3.4. Средства профилирования и мониторинга
* SQL Profiler / SQL Trace – классический инструмент (хотя и рекомендуют переходить на Extended Events).
* Query Store (начиная с SQL Server 2016) – хранит историю выполнения запросов, планы, статистику по времени/ресурсам.
* Сторонние инструменты (Redgate, SolarWinds и т.д.) – для детального мониторинга производительности.
Напишите пример оконной функции в SQL (на ваше усмотрение).
Теги: #РСХБ
SELECT
employee_id,
salary,
SUM(salary) OVER (PARTITION BY department_id ORDER BY employee_id) AS running_total
FROM employees;
Какие основные параметры необходимы для подключения к базе данных
Теги: #РСХБ
- host (адрес сервера)
- port (порт подключения)
- user (пользователь)
- password (пароль)
- dbname (имя базы)
- (опционально: schema, sslmode и др.)
Что такое CTE (Common Table Expression) в SQL, каков его синтаксис и для чего применяется?
Теги: #РСХБ
Это виртуальная таблица создаваемая в памяти.
WITH cte_name AS (
SELECT …
)
SELECT …
FROM cte_name;
Для чего: Упрощает логику запросов, делает код чище, позволяет переиспользовать промежуточные результаты.
Есть две таблицы: tab1 (10 записей) и tab2 (100 записей). Какое минимальное и максимальное число строк может вернуть LEFT JOIN этих таблиц?
Теги: #РСХБ
- Минимум: 10 (если в tab2 нет совпадений для строк tab1).
- Максимум: 10 * 100 = 1000 (если каждая строка tab1 сопоставляется со 100 строками tab2).
Если отчёт в базе данных начал сильно тормозить, с чего вы начнёте диагностику как DBA?
Теги: #РСХБ
- Посмотреть план запроса (EXPLAIN, EXPLAIN ANALYZE).
- Проверить индексы, обновлённость статистики, наличие блокировок.
- Оценить нагрузку на ресурсы (CPU, RAM, диск).
- Проверить недавние изменения в базе (структура, индексы, конфигурация).
Каков порядок выполнения операторов в SQL
Теги: #Yandex #озон #т-банк
CTE
FROM/JOIN
WHERE
GROUP BY
HAVING
UNION / UNION ALL
SELECT (здесь же оконные функции)
ORDER BY
LIMIT/OFFSET
Для чего используются операторы SAVEPOINT, ROLLBACK TO SAVEPOINT
RELEASE SAVEPOINT, SET TRANSACTION, ROLLBACK и COMMIT в SQL?
Теги: #Yandex
- COMMIT – фиксирует изменения в БД, делая их постоянными.
- ROLLBACK – отменяет все изменения в текущей транзакции.
- SAVEPOINT – создает точку сохранения внутри транзакции.
- ROLLBACK TO SAVEPOINT – откатывает изменения до указанного SAVEPOINT.
- RELEASE SAVEPOINT – удаляет точку сохранения.
- SET TRANSACTION – устанавливает параметры транзакции (изоляция, доступ).
В чём отличие оконных функций (window functions) от группировки (GROUP BY)?
Теги: #Yandex #озон #ЛигаЦифровогоИнтернета
- Оконные функции: Позволяют вычислять агрегаты (и другие функции) «поверх» набора строк без коллапса строк в одну. Можно одновременно видеть и детальные, и агрегированные данные.
- GROUP BY: Объединяет строки в группы, каждая группа возвращает одну строку агрегированных значений (детальные данные теряются в результате).
Как вы обычно проводите оптимизацию SQL-запросов и в чём разница между EXPLAIN и EXPLAIN ANALYZE?
Теги: #t1
- Оптимизация:
1. Анализ плана (EXPLAIN).
2. Проверка статистики, индексов, актуальности планов.
3. Переписывание запроса (убираем лишние JOIN, используем правильные условия и т.д.).
4. EXPLAIN ANALYZE для замера фактического времени выполнения.
5. Индексы
6. Патриции
7. Контроль памяти
8. Контроль раздутия - EXPLAIN показывает предполагаемый план и оценки затрат.
- EXPLAIN ANALYZE запускает запрос реально и выводит фактическое время выполнения каждого шага.
- Создание и использование индексов.
- Переписывание запроса (оптимизация JOIN, WHERE, GROUP BY).
- Анализ и тюнинг плана (Nested Loop vs. Hash Join и т.д.).
- Партиционирование таблиц.
- Настройка параметров СУБД (buffers, cache).
- Материализованные представления (при необходимости).
Использовали ли вы хранимые процедуры и функции в SQL? Какие у них преимущества и недостатки?
Теги: #t1
Функции (Functions)
Использовались для выполнения вычислений и преобразований внутри SQL-запросов.
Скалярные функции Расчёт бизнес-метрик: fn_calc_ltv(customer_id), fn_get_churn_rate(period) Конвертация данных: fn_format_date(input_date, format_mask) Обработка строк: fn_normalize_text(input_text), fn_remove_special_chars(text) Табличные функции (RETURN TABLE) Разбор JSON: fn_parse_json_orders(json_column) Генерация временных диапазонов: fn_generate_date_series(start_date, end_date, interval) Обработка массивов: fn_split_string_to_table(input_string, delimiter) Функции для работы с аналитическими расчётами fn_calc_moving_average(metric, period) fn_rank_customers_by_revenue(year, region)
Процедуры (Procedures)
Использовались для модификации данных, администрирования и ETL-процессов.
Процедуры для массовых операций sp_update_customer_status() – массовое обновление статусов клиентов. sp_refresh_materialized_views() – обновление агрегированных данных. sp_archive_old_orders() – перемещение старых данных в архивные таблицы. Процедуры с транзакциями sp_transfer_funds(account_from, account_to, amount) – операция с проверкой баланса и откатом при ошибке. sp_bulk_insert_orders(data_batch) – загрузка данных с логированием ошибок. Процедуры для ETL sp_load_daily_sales_data() – загрузка ежедневных продаж из внешних источников. sp_clean_temp_tables() – очистка временных таблиц по расписанию. sp_log_etl_run(job_name, status, message) – запись статуса выполнения ETL-процесса. Процедуры для администрирования sp_rebuild_indexes() – перестроение индексов. sp_analyze_table_statistics() – обновление статистики для оптимизатора запросов. sp_manage_partitions() – автоматическое создание новых партиций.
Функции (Functions)
Преимущества:
1. Возвращают значение: Функции всегда возвращают одно значение (скалярное или табличное).
2. Использование в запросах: Можно вызывать в SELECT, WHERE, JOIN, ORDER BY.
3. Детерминированность: Чаще детерминированные (при одинаковом вводе — одинаковый результат).
4. Повторное использование: Отличный способ инкапсуляции повторяющейся логики.
5. Композиция: Функции можно вызывать внутри других функций.
Недостатки:
1. Ограниченный функционал: Нельзя изменять данные в БД (нет INSERT, UPDATE, DELETE).
2. Нет транзакций: Невозможно использовать COMMIT и ROLLBACK.
3. Производительность: Может быть медленнее процедур в сложных вычислениях.
4. Ограниченные побочные эффекты: Не может вызывать DDL-команды.
________________________________________
Процедуры (Procedures)
Преимущества:
1. Гибкость: Поддерживают DML (INSERT, UPDATE, DELETE) и DDL (в некоторых СУБД).
2. Транзакции: Можно использовать BEGIN TRANSACTION, COMMIT, ROLLBACK.
3. Несколько выходных параметров: Поддержка OUT и INOUT параметров.
4. Оптимизация логики: Удобны для сложных бизнес-правил и пакетной обработки данных.
Недостатки:
1. Нет возврата значений напрямую: Используются выходные параметры или курсоры.
2. Нельзя использовать в SELECT: Процедуру нельзя вызвать внутри SQL-запроса.
3. Менее читаемы в запросах: Сложнее интегрировать с простыми SQL-операциями.
4. Повышенная сложность: Более громоздкий синтаксис для простой логики.
Каким одним словом в SQL можно убрать дубликаты?
Теги: #t1
DISTINCT
На какой слой DWH (Data Warehouse) обычно загружаются инкрементальные данные ?
Теги: #t1
Обычно staging (промежуточный слой).