0% нашли этот документ полезным (0 голосов)
5 просмотров17 страниц

SQL

Документ содержит обширную информацию о SQL, включая основные понятия, такие как реляционные и нереляционные базы данных, СУБД и SQL, а также различные команды и операции, такие как DDL, DML, TCL и DCL. Также рассматриваются join-ы, индексы, транзакции, нормализация и оптимизация запросов, а также методы работы с данными, такие как хранимые процедуры и временные таблицы. В документе также обсуждаются ограничения, селективность и использование индексов для повышения производительности баз данных.

Загружено:

saburoverbek
Авторское право
© All Rights Reserved
Мы серьезно относимся к защите прав на контент. Если вы подозреваете, что это ваш контент, заявите об этом здесь.
Доступные форматы
Скачать в формате DOCX, PDF, TXT или читать онлайн в Scribd
0% нашли этот документ полезным (0 голосов)
5 просмотров17 страниц

SQL

Документ содержит обширную информацию о SQL, включая основные понятия, такие как реляционные и нереляционные базы данных, СУБД и SQL, а также различные команды и операции, такие как DDL, DML, TCL и DCL. Также рассматриваются join-ы, индексы, транзакции, нормализация и оптимизация запросов, а также методы работы с данными, такие как хранимые процедуры и временные таблицы. В документе также обсуждаются ограничения, селективность и использование индексов для повышения производительности баз данных.

Загружено:

saburoverbek
Авторское право
© All Rights Reserved
Мы серьезно относимся к защите прав на контент. Если вы подозреваете, что это ваш контент, заявите об этом здесь.
Доступные форматы
Скачать в формате DOCX, PDF, TXT или читать онлайн в Scribd

SQL

Основные понятия:
● Что такое реляционная база данных?
● Что такое не реляционная база данных?
● Что такое СУБД?
● Что такое SQL?
● Что такое DDL? Какие операции в него входят?
● Что такое DML? Какие операции в него входят?
● Что такое TCL? Какие операции в него входят?
● Что такое DCL? Какие операции в него входят?

Join-ы:
● Что такое Join?
● Что лучше использовать join или подзапросы? Почему?

Основные команды:
● Что делает UNION?
● Чем TRUNCATE отличается от DELETE?
● Что такое TIMESTAMP?
● Чем WHERE отличается от HAVING?
● Что такое GROUP BY?
● Что такое ORDER BY?
● Что такое DISTINCT?
● Что такое LIMIT?
● Что такое EXISTS?
● Что такое EXTRACT?
● Расскажите про операторы IN, BETWEEN, LIKE
● Как работать с NULL в SQL. Как проверить поле на NULL?
● Какие агрегирующие функции вы знаете?
● В каком порядке пишутся операции в SQL?

Constraints:
● Что такое ограничения (constraints)? Какие вы знаете?
● Как создать constraint если таблица уже создана?
● Какими двумя свойствами обладает PRIMARY KEY?
● Что такое суррогатные ключи?

Индексы:
● Что такое индексы? Как создавать индекс?
● Какая структура данных используется при работе с индексами?
● Расскажи про Bitmap индексы
● Расскажи про индекс hashmap
● Какие два вида Индексов существуют?
● Когда не следует использовать индексы?
● Как проверить, какие индексы существуют в таблице?
● Что такое селективность?
● На какие поля лучше ставить индексы?

EXPLAIN:
● Расскажи про EXPLAIN
● Расскажи про Cost, Rows, Width
● Что такое Seq Scan и когда он используется?
● Что такое Nested Loop в плане выполнения запроса?
● Расскажи про EXPLAIN ANALYZE
● Методы сканирования таблиц

Хранимые процедуры, временные таблицы, представления:


● Что такое хранимые процедуры? Для чего они нужны?
● Что такое временные таблицы? Для чего они нужны?
● Что такое представления (VIEW)? Для чего они нужны?

Транзакции:
● Что такое транзакции?
● Что нужно сделать в первую очередь для запуска транзакции?
● Расскажите про принципы ACID
● Расскажите про уровни изолированности транзакций

Нормализация, шардирование, триггер:


● Что такое нормализация и денормализация?
● Расскажите про 3 нормальные формы?
● Расскажи про шардирование баз данных
● Что такое триггер?
● В каком порядке пишутся операции в SQL?

Оптимизация:
● Как снизить нагрузку на БД?
● Какие методы используются для оптимизации запросов?
● Расскажи про репликацию и партиционирование БД
● Всегда ли будет использоваться индекс?
● Что такое оптимизатор запросов?
● Что делать если база данных плохо работает при чтении?
● Что делать если база данных плохо работает при записи?
● Сделали контроллер и он тормозит что делать?
● Расскажи про пакетную загрузку в БД?

—--------------------------------------------------------------------------
-----------

Что такое реляционная база данных?


Это база данных в которой данные представлены в виде таблиц. Таблицы
могут быть связаны между собой с помощью ключей, устанавливая
отношения между данными. Реляционные базы данных используют SQL для
управления данными.

Что такое не реляционная база данных?


Нереляционные базы данных (NoSQL), отличается от реляционных тем, что
они хранят данные не в виде таблиц, а в форматах, таких как
документы, ключ-значение, JSON, графы и все это не структурировано,
нет транзакций. Не используют SQL. Нереляционные базы данных
используются для больших объемов данных.

Что такое СУБД?


СУБД (система управления базами данных) - включает в себя механизмы
для создания, модификации и удаления данных. Также СУБД контролирует
доступ к данным и выполняет оптимизацию запросов.
Что такое SQL?
Structured Query Language - это язык запросов к БД.

Что такое DDL? Какие операции в него входят?


DDL (Data Definition Language) - это SQL-команды, используемые для
создания, изменения и удаления структур данных в базе данных.

Операции DDL включают:


● CREATE: Создание новых объектов базы данных, таких как таблицы,
схемы, индексы.
● ALTER: Изменение структуры объектов базы данных, таких как
добавление столбцов таблицы.
● DROP: Удаление объектов базы данных, таких как таблицы или
схемы.
● TRUNCATE: Удаление всех записей из таблицы.

Что такое DML? Какие операции в него входят?


DML (Data Manipulation Language) - это SQL-команды, используемые для
добавления, изменения и удаления данных в базе данных.

Операции DML включают:


● SELECT: Извлечение данных из таблицы.
● INSERT: Добавление новых записей в таблицу.
● UPDATE: Изменение существующих записей в таблице.
● DELETE: Удаление записей из таблицы.

Что такое TCL? Какие операции в него входят?


TCL (Transaction Control Language) - это SQL-команды, используемые
для управления транзакциями в базе данных.

Операции TCL включают:


● BEGIN: начало транзакции.
● COMMIT: Фиксация изменений в текущей транзакции.
● ROLLBACK: Отмена изменений в текущей транзакции.
● SAVEPOINT: Создание точки сохранения, чтобы можно было
откатиться к ней в случае необходимости.

Что такое DCL? Какие операции в него входят?


DCL (Data Control Language) - это SQL-команды, используемые для
управления правами доступа и безопасностью в базе данных.

Операции DCL включают:


● GRANT: Предоставление определенных прав доступа.
● REVOKE: Ограничение прав доступа.

Как работать с NULL в SQL. Как проверить поле на NULL?


Проверка поля на NULL производится с помощью операторов IS NULL и IS
NOT NULL.

В SQL логическое выражение NULL != NULL возвращает NULL. SQL


рассматривает каждый NULL как уникальное значение, которое не равно
ничему, включая NULL.
Что такое Join? Виды join-ов?
JOIN - это операция, которая объединяет данные из двух и более
таблиц.

Виды join:
● INNER JOIN: выбирает записи, имеющие совпадения в обеих
таблицах.
● LEFT (OUTER) JOIN: выбирает все записи из левой таблицы и
совпадающие записи из правой таблицы. Если совпадений нет,
результат будет содержать NULL с правой стороны.
● RIGHT (OUTER) JOIN: выбирает все записи из правой таблицы и
совпадающие записи из левой таблицы. Если совпадений нет,
результат будет содержать NULL с левой стороны.
● FULL (OUTER) JOIN: выбирает записи, когда есть совпадение в
одной из таблиц, и возвращает NULL в тех местах, где совпадения
нет.
● CROSS JOIN: создает декартово произведение, то есть комбинирует
каждую запись одной таблицы с каждой записью другой таблицы.

Что лучше использовать join или подзапросы? Почему?


Лучше использовать JOIN, он более понятен и оптимизируется СУБД.

Что делает UNION?


UNION объединяет результаты двух или более SELECT-запросов в единый
набор строк, удаляя дубликаты. UNIONALL не удаляя дубликаты.

Чем TRUNCATE отличается от DELETE?


● TRUNCATE используется для удаления всех записей из таблицы.
● DELETE используется для удаления одной или нескольких записей из
таблицы.

Что такое TIMESTAMP?


Это тип данных, который используется для хранения даты(год, месяц,
день) и времени(часы, минуты, секунды, миллисекунды или
микросекунды).

Чем WHERE отличается от HAVING?


● WHERE применяется для фильтрации строк на основе условий.
● HAVING используется совместно с оператором GROUP BY для фильтрации
данных после группировки.

Что такое GROUP BY?


GROUP BY используется для группировки. Также может использовать
агрегатные функции.

Что такое ORDER BY?


ORDER BY используется для сортировки результатов запроса. Он может
быть указан в порядке возрастания (ASC) или убывания (DESC).

Что такое DISTINCT?


DISTINCT используется для выбора уникальных значений из столбца.
Что такое LIMIT?
LIMIT используется для ограничения количества возвращаемых строк.

Что такое EXISTS?


EXISTS используется для проверки наличия результатов запроса. Он
возвращает TRUE, если запрос возвращает хотя бы одну строку, и FALSE
в противном случае.

Расскажите про операторы IN, BETWEEN, LIKE


● IN: используется для фильтрации строк, которые соответствуют любому
значению из заданного списка.

Например: SELECT * FROM таблица WHERE столбец IN (значение1,


значение2).

● BETWEEN: используется для фильтрации строк, значения которых


находятся в заданном диапазоне, включая граничные значения.

Например: SELECT * FROM таблица WHERE столбец BETWEEN начало AND


конец.

● LIKE: LIKE используется для поиска строк, которые соответствуют


заданному шаблону. Используется с символами подстановки (% для любого
количества символов и _ для одного символа).

Например: SELECT * FROM таблица WHERE столбец LIKE 'текст%'.

Что такое EXTRACT?


EXTRACT используется для извлечения части из даты или времени.

EXTRACT(field FROM source)

Синтаксис функции EXTRACT:


● YEAR: год
● MONTH: месяц
● DAY: день
● HOUR: час
● MINUTE: минута
● SECOND: секунда
● QUARTER: квартал
● DOW: день недели (0 = воскресенье, 1 = понедельник, и так
далее)
● DOY: день года
● WEEK: номер недели в году
● DECADE: десятилетие
● CENTURY: столетие
● MILLENNIUM: тысячелетие

Какие агрегирующие функции вы знаете?


● COUNT: подсчет количества строк.
● SUM: сумма значений столбца
● AVG: среднее значение столбца.
● MIN: минимальное значение столбца.
● MAX: максимальное значение столбца.

Что такое ограничения (constraints)? Какие вы знаете?


Ограничения (constraints) — это правила, применяемые к данным в
таблицах для обеспечения целостности и корректности данных.

Основные типы ограничений:


○ PRIMARY KEY: уникально идентифицирует каждую запись в таблице.
(index)
○ FOREIGN KEY: обеспечивает связь между данными двух таблиц.
○ UNIQUE: гарантирует, что все значения в столбце уникальны.
Может содержать null. При создании создается index.
○ NOT NULL: указывает, что столбец не может иметь значение NULL.
○ CHECK: позволяет задать условие, которому должны
соответствовать значения.
○ DEFAULT: устанавливает значение по умолчанию для столбца.

Как создать constraint если таблица уже создана?


Чтобы создать ограничение (constraint) на уже существующей таблице,
используйте команду ALTER TABLE. Например, чтобы добавить уникальное
ограничение на столбец name в таблице students, выполните следующий
SQL-запрос:

● ALTER TABLE students ADD CONSTRAINT name_constraint UNIQUE


(name);

Какими двумя свойствами обладает PRIMARY KEY?


NOT NULL, UNIQUE. Когда мы создаем первичный ключ, то автоматически
формируется индекс для него.

Что такое суррогатные ключи?


Суррогатные ключи — это искусственно созданные уникальные
идентификаторы для каждой записи в таблице. Они не имеют бизнес-
значения и используются только для идентификации записей. Обычно это
автоинкрементные числа.

Что такое индексы? Как создавать индекс?


Это структура данных, которая улучшает скорость выполнения запросов к
базе данных. Индексы позволяют быстрее находить и извлекать строки из
таблицы.

CREATE INDEX название_индекса ON таблица (столбец);

Преимущества:
● Ускорение выполнения запросов.
● Улучшение производительности.

Недостатки:
● Занимают дополнительное место.
● Замедляют операции вставки, обновления и удаления данных, так
как индексы нужно обновлять.

Какая структура данных используется при работе с индексами?


При работе с индексами обычно используются структуры данных типа B-
деревьев (B-trees). B-trees не работает с null.

B-tree эффективен когда:


● Много строк
● В столбце который содержит индекс много уникальных значений

Расскажи про Bitmap индексы


Bitmap индексы эффективны для столбцов, которые содержат небольшое
количество уникальных значений. Для столбцов с большим количеством
уникальных значений битовые массивы могут стать очень большими и
неэффективными.

Bitmap индекс представляет собой массив битов (0 и 1), где каждый бит
соответствует строке в таблице. Для каждого уникального значения в
столбце создается отдельный битовый массив.

Пример: Допустим, у нас есть столбец gender с двумя значениями: Male


и Female. Для этого столбца создаются два битовых массива: один для
Male, устанавливается в 1, другой для Female, устанавливается в 0.

В PostgreSQL нет прямой поддержки bitmap индексов. PostgreSQL


использует bitmap сканирование индексов (bitmap index scan) как часть
стратегии выполнения запросов.

Это метод выполнения запросов, при котором PostgreSQL использует


обычные B-tree индексы для создания битовых карт во время выполнения
запроса.

Расскажи про индекс hashmap


Индекс на основе HashMap (хеш-индекс) используется для быстрого
поиска данных по ключу. В отличие от B-дерева, хеш-индекс использует
хеш-функцию для вычисления позиции ключа, что позволяет выполнять
операции поиска, вставки и удаления за постоянное время (O(1)) в
среднем случае. Однако хеш-индексы не поддерживают диапазонные
запросы, что ограничивает их применение.

Какие два вида Индексов существуют?


● Кластерный индекс: Определяет физический порядок хранения данных в
таблице. В таблице может быть только один кластерный индекс.
● Некластерный индекс: Создает отдельную структуру, которая указывает
на физическое расположение данных. В таблице может быть множество
некластерных индексов.

Кластерный индекс сортирует данные в таблице, а некластерный индекс —


нет.

Когда не следует использовать индексы?


● например, булевые столбцы.
● В таблицах с частыми операциями вставки, обновления и удаления, если
производительность этих операций критична.
● Для очень маленьких таблиц, где выгода от индексации незначительна.

Как проверить, какие индексы существуют в таблице?


SELECT indexname, indexdef FROM pg_indexes WHERE tablename =
'your_table_name';

Вот как это работает:


● pg_indexes — это системная таблица в PostgreSQL, которая
содержит информацию обо всех индексах в базе данных.
● indexname — имя индекса.
● indexdef — определение индекса, которое показывает, как индекс
был создан.
● tablename = 'your_table_name' — условие, которое фильтрует
индексы для конкретной таблицы.

Что такое селективность?


Селективность – это отношение количества уникальных элементов к кол-
ву записей. Оценка селективности важна для оптимизации запросов.

На какие поля лучше ставить индексы?


● Часто используются в условиях поиска (WHERE): Это ускоряет выполнение
запросов.
● Часто используются для сортировки (ORDER BY) и группировки (GROUP
BY): Это улучшает производительность этих операций.
● Часто используются в соединениях таблиц (JOIN): Это ускоряет
выполнение соединений.

Из них лучше выбирать поля с высокой селективностью. Однако, следует


избегать индексации полей с высокой изменчивостью и небольших таблиц,
так как это может замедлить операции вставки и обновления данных.

Расскажи про EXPLAIN


EXPLAIN используется для анализа SQL-запросов и оценки его условной
стоимости без его фактического выполнения. Он показывает план
выполнения запроса, который помогает понять, как СУБД будет его
выполнять. EXPLAIN помогает выявить неэффективные части запроса,
такие как отсутствие индексов или неоптимальные соединения.

Пример: EXPLAIN SELECT * FROM users WHERE age > 30;

Sort (cost=27.74..27.75 rows=1 width=238)


-- Сортировка результатов по фамилии разработчика (d.last_name)
Sort Key: d.last_name
-> GroupAggregate (cost=27.69..27.73 rows=1 width=238)
-- Группировка результатов по идентификатору разработчика ([Link]) и
агрегация данных
Group Key: [Link]
Filter: (sum(t.story_points) < 5)
-- Фильтрация групп, у которых сумма story_points меньше 5
- >
Sort (cost=27.69..27.69 rows=2 width=230)
-- Сортировка результатов по идентификатору разработчика ([Link])
Sort Key: [Link]
->_
Nested Loop (cost=14.67..27.68 rows=2 width=230)
-- Вложенный цикл для соединения результатов
->
Hash Join (cost=14.53..26.74 rows=2 width=234)
-- Хеш-соединение таблиц developers (d) и tasks (t)
Hash Cond: ([Link] = t.developer_id)
-- Условие соединения: идентификатор разработчика в таблице
developers должен совпадать с developer_id в таблице tasks
-> Seq Scan on developers d (cost=0.00..11.60 rows=160 width=226)
-- Последовательное сканирование таблицы developers
->
Hash (cost=14.50..14.50 rows=2 width=12)
-- Создание хеша для таблицы tasks
Seq Scan on tasks t (cost=0.00..14.50 rows=2 width=12)
-- Последовательное сканирование таблицы tasks
Filter: (EXTRACT(month FROM created_at) = '1'::numeric)
-- Фильтрация задач, созданных в январе (месяц = 1)
Index Only Scan using specialties_pkey on specialties s
(cost=0.15..0.46 rows=1 width=4)
-- Индексное сканирование таблицы specialties по первичному ключу
Index Cond: (id = d.specialty_id)
-- Условие индекса: идентификатор специальности в таблице specialties
должен совпадать с specialty_id в таблице developers

имеет оценочную стоимость от 27.74 до 27.75, ожидается, что будет


возвращена одна строка, и каждая строка будет занимать в среднем 238
байтов.

Расскажи про Cost, Rows, Width


● Cost (стоимость): Это оценка ресурсов, необходимых для выполнения
запроса. Обычно включает начальную стоимость (startup cost) и общую
стоимость (total cost). Начальная стоимость — это ресурсы,
необходимые для начала выполнения, а общая — для завершения всего
запроса. Чем ниже стоимость, тем эффективнее запрос.
● Rows (строки): Это приблизительное количество строк, которое СУБД
ожидает обработать на каждом этапе выполнения запроса. Помогает
понять, насколько большой объем данных будет затронут.
● Width (ширина): Это средний размер одной строки в байтах. Ширина
помогает оценить объем данных, который будет передаваться и
обрабатываться.

Расскажи про EXPLAIN ANALYZE


EXPLAIN ANALYZE используется для более детального анализа. В отличие
от просто EXPLAIN, она не только показывает план выполнения запроса,
но и фактически выполняет его, предоставляя реальные данные о
производительности.

EXPLAIN ANALYZE отображает:


● Фактическое время выполнения каждого шага.
● Фактическое количество строк, обработанных на каждом этапе.
● Сравнение фактических данных с оценками.
● Информацию о буферизации (сколько данных было прочитано из
памяти).

Методы сканирования таблиц


● Полное сканирование таблицы (Full Scan): При полном сканировании
таблицы, каждая строка таблицы проверяется для выполнения условий
запроса.
● Индексное сканирование (Index Scan): При индексном сканировании,
используется индекс для быстрого поиска и доступа к данным.

Что такое хранимые процедуры? Для чего они нужны?


Хранимая процедура — это заранее скомпилированный набор SQL-запросов,
который хранится в базе данных и может быть выполнен по вызову.

CREATE PROCEDURE GetEmployeeById(IN emp_id INT)


BEGIN
SELECT * FROM employees WHERE id = emp_id;
END;

Пример вызова процедуры: CALL GetEmployeeById(1);

Пример: если нужно часто выполнять сложный запрос, можно создать


хранимую процедуру, которая будет выполнять этот запрос, и вызывать
её по мере необходимости.

Что такое временные таблицы? Для чего они нужны?


Временная таблица — это таблица, которая создается временно для
хранения промежуточных данных и автоматически удаляется после
завершения сеанса. Она используется для упрощения хранения
промежуточных результатов.

-- Создание временной таблицы


CREATE TEMPORARY TABLE temp_orders (
id INT,
customer_name VARCHAR(50),
total_amount DECIMAL(10, 2)
);

-- Вставка данных во временную таблицу


INSERT INTO temp_orders (id, customer_name, total_amount)
VALUES (1, 'John Doe', 100.50),
(2, 'Jane Smith', 75.20),
(3, 'Mike Johnson', 150.00);

-- Выполнение запроса с использованием временной таблицы


SELECT customer_name, total_amount
FROM temp_orders
WHERE total_amount > 100.00;
Пример: если нужно выполнить несколько сложных операций над данными,
можно сначала сохранить промежуточные результаты во временной
таблице, а затем использовать их для дальнейших вычислений.

Что такое представления (VIEW)? Для чего они нужны?


Представления - это возможность сохранить часть сложного запроса в
виде представления, чтобы не писать каждый раз сложный запрос. Но это
не сама таблица в БД, добавлять или удалять данные из нее нельзя, под
капотом это не таблица, а запрос.

-- Создание представления
CREATE VIEW high_salary_employees AS
SELECT name, salary
FROM employees
WHERE salary > 5000;

Пример: если часто требуется сложный запрос для получения отчета,


можно создать представление, которое будет выполнять этот запрос, и
затем обращаться к этому представлению как к обычной таблице.

Что такое транзакции?


Транзакции - это механизм, который обеспечивает целостность и
надежность выполнения операций в базе данных. Они позволяют
группировать несколько операций в одну логическую единицу работы,
которая либо выполняется полностью, либо откатывается в случае
ошибки.

Что нужно сделать в первую очередь для запуска транзакции?


Transaction begin

Расскажите про принципы ACID


Принципы ACID - это принципы, обеспечивающие надежность транзакций,
каждая транзакция должна обладать этими свойствами:
● Атомарность (Atomicity): Транзакция либо выполняется полностью,
либо не выполняется вообще.
● Согласованность (Consistency): Транзакция должна переводить
базу данных из одного согласованного состояния в другое.
● Изолированность (Isolation): Транзакции должны быть изолированы
друг от друга, чтобы предотвратить конфликты.
● Долговечность (Durability): Результаты завершенной транзакции
должны быть сохранены даже в случае сбоя системы.

Расскажите про уровни изолированности транзакций


Уровни изолированности определяют, насколько транзакции защищены друг
от друга.

● Lost updates (потерянные обновления) — это проблема, которая


возникает, когда два пользователя одновременно пытаются обновить одни
и те же данные в базе данных. В результате одно из обновлений будет
потеряно, так как последнее изменение перезаписывает предыдущее. Эта
проблема решается с помощью уровня read uncommitted.

Пример:
● Пользователь A читает значение X из базы данных.
● Пользователь B читает то же значение X.
● Пользователь A обновляет значение X и сохраняет его в базе
данных.
● Пользователь B обновляет значение X и сохраняет его в базе
данных, перезаписывая изменения, сделанные пользователем A.

● Dirty reads (грязные чтения) — это проблема, которая возникает, когда


один пользователь читает данные, которые были изменены другим
пользователем, но еще не подтверждены (не зафиксированы) в базе
данных. Если транзакция, сделавшая изменения, откатывается, то
данные, прочитанные первым пользователем, оказываются
недействительными или "грязными". Эта проблема решается с помощью
уровня read committed.

Пример:
● Пользователь A начинает транзакцию и изменяет значение X.
● Пользователь B читает измененное значение X до того, как
пользователь A завершит (зафиксирует) транзакцию.
● Пользователь A откатывает свою транзакцию, и значение X
возвращается к исходному состоянию.

● Non-repeatable reads (неповторяемые чтения) — это проблема, которая


возникает, когда один пользователь читает одни и те же данные дважды
в рамках одной транзакции и получает разные результаты. Это
происходит потому, что другой пользователь изменил и зафиксировал
данные между двумя чтениями. Эта проблема решается с помощью уровня
repeatable read.

Пример:
● Пользователь A читает значение X.
● Пользователь B изменяет значение X и фиксирует свою транзакцию.
● Пользователь A снова читает значение X и видит, что оно
изменилось.

● Phantoms (фантомные чтения) — это проблема, которая возникает, когда


один пользователь выполняет два одинаковых запроса в рамках одной
транзакции и получает разные наборы строк. Это происходит потому, что
другой пользователь добавил, изменил или удалил строки, между двумя
чтениями. Эта проблема решается с помощью уровня serializable.

Пример:
● Пользователь A выполняет запрос, чтобы получить все записи.
● Пользователь B добавляет новую запись.
● Пользователь A снова выполняет тот же запрос и видит новую
запись, которой не было в первом результате.
Что такое нормализация и денормализация?
● Нормализация - это процесс разделения данных на отдельные таблицы для
устранения избыточности и обеспечения целостности данных.

● Денормализация - это процесс объединения данных из разных таблиц в


одну для повышения производительности чтения данных.

Расскажите про 3 нормальные формы?


● Первая нормальная форма (1NF) требует, чтобы все столбцы таблицы
содержали только атомарные (неделимые) значения, и каждая запись в
таблице была уникальной. Это значит, что в каждой ячейке таблицы
должно быть одно значение, а не список или массив значений.

Пример таблицы, нарушающей 1NF: столбец "Phone Numbers" содержит


несколько значений.

| ID | Name | Phone Numbers |


|----|-------|---------------------|
| 1 | Alice | 123-4567, 234-5678 |
| 2 | Bob | 345-6789 |

Нормализованная таблица: Теперь каждый столбец содержит только одно


значение.

| ID | Name | Phone Number |


|----|-------|--------------|
| 1 | Alice | 123-4567 |
| 1 | Alice | 234-5678 |
| 2 | Bob | 345-6789 |

● Вторая нормальная форма (2NF) требует, чтобы таблица находилась в


первой нормальной форме (1NF) и все неключевые атрибуты зависели от
первичного ключа. Это значит, что каждый неключевой столбец должен
зависеть от всего первичного ключа, а не только от его части.

Пример таблицы, нарушающей 2NF: Нарушение: "ProductName" зависит


только от "ProductID", а не от всего первичного ключа (OrderID,
ProductID).

| OrderID | ProductID | ProductName | Quantity |


|---------|-----------|-------------|----------|
| 1 | 101 | Widget | 10 |
| 2 | 102 | Gadget | 5 |
Нормализованная таблица: Теперь "ProductName" зависит только от
"ProductID".

Таблица заказов:
| OrderID | ProductID | Quantity |
|---------|-----------|----------|
| 1 | 101 | 10 |
| 2 | 102 | 5 |

Таблица продуктов:
| ProductID | ProductName |
|-----------|-------------|
| 101 | Widget |
| 102 | Gadget |

● Третья нормальная форма (3NF) требует, чтобы таблица находилась во


второй нормальной форме (2NF) и все неключевые атрибуты были
независимы друг от друга, то есть не было транзитивных зависимостей.
Это значит, что неключевые столбцы должны зависеть только от
первичного ключа и не должны зависеть от других неключевых столбцов.

Пример таблицы, нарушающей 3NF: Нарушение: "AdvisorName" зависит от


"AdvisorID", а не от "StudentID".

Нормализованная таблица: Теперь "AdvisorName" зависит только от


"AdvisorID".
| StudentID | StudentName | AdvisorID | AdvisorName |
|-----------|-------------|-----------|-------------|
| 1 | Alice | 101 | Dr. Smith |
| 2 | Bob | 102 | Dr. Jones |

Таблица студентов:
| StudentID | StudentName | AdvisorID |
|-----------|-------------|-----------|
| 1 | Alice | 101 |
| 2 | Bob | 102 |

Таблица советников:
| AdvisorID | AdvisorName |
|-----------|-------------|
| 101 | Dr. Smith |
| 102 | Dr. Jones |

Расскажи про шардирование баз данных


Шардирование баз данных — это метод разделения большой базы данных на
более мелкие, называемые "шардами". Каждый шард хранит подмножество
данных и может быть размещен на отдельном сервере. Это помогает
улучшить производительность и масштабируемость системы, так как
запросы могут обрабатываться параллельно на разных серверах.

Например, в интернет-магазине можно разделить данные по регионам,


чтобы каждый сервер обслуживал свой регион.
Что такое триггер?
Триггер — это специальная процедура в базе данных, которая
автоматически выполняется при наступлении определенного события,
например, при вставке, обновлении или удалении данных в таблице.
Триггеры помогают автоматизировать задачи, такие как проверка данных,
ведение логов или обновление связанных таблиц.

CREATE TRIGGER RecordPriceChange


AFTER UPDATE ON Products
FOR EACH ROW
WHEN ([Link] != [Link])
BEGIN
INSERT INTO PriceHistory(ProductID, OldPrice, NewPrice, ChangeDate)
VALUES (:[Link], :[Link], :[Link], CURRENT_TIMESTAMP);
END;

В этом примере:
● RecordPriceChange — название триггера.
● AFTER UPDATE ON Products — указывает, что триггер срабатывает
после обновления записи в таблице Products.
● FOR EACH ROW — означает, что триггер будет выполняться для
каждой измененной строки.
● WHEN ([Link] != [Link]) — условие, при котором триггер
сработает (только если цена изменилась).
● BEGIN ... END; — блок кода триггера, который вставляет запись в
таблицу PriceHistory с идентификатором продукта, старой и новой
ценой, а также временем изменения.

В каком порядке пишутся операции в SQL?


SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY, LIMIT.

Как снизить нагрузку на БД?


● Индексы: Создайте индексы на часто запрашиваемых столбцах для
ускорения поиска.
● Кэширование: Кэшируйте результаты часто выполняемых запросов.
● Оптимизация запросов: Перепишите сложные и неэффективные запросы,
чтобы они выполнялись быстрее.
● Шардирование: Разделите данные на несколько баз данных для
распределения нагрузки.
● Архивирование: Переносите старые и редко используемые данные в
архивные таблицы.
● Пул соединений: Используйте пул соединений для уменьшения накладных
расходов на установку соединений с базой данных.
● Нормализация: Приведите структуру базы данных в нормализованную форму
для уменьшения избыточности данных.
● Пакетная загрузка в БД.

Какие методы используются для оптимизации запросов?


● Использование индексов: Создание индексов для часто используемых
столбцов может значительно ускорить выполнение запросов.
● Использование JOIN вместо подзапросов: JOIN-операции часто
выполняются быстрее, чем подзапросы.
● Нормализация данных: Нормализация данных уменьшает избыточность и
улучшает производительность запросов.
● Кэширование результатов: Кэширование часто запрашиваемых данных
уменьшает нагрузку на базу данных.
● Избегание SELECT * : Выбор только необходимых столбцов уменьшает
объем передаваемых данных и ускоряет выполнение запросов.
● Использование плана выполнения: Изучение плана выполнения запроса
помогает выявить узкие места и оптимизировать запрос.

Расскажи про репликацию и партиционирование БД


Репликация:
● Что это: Копирование данных с одного сервера базы данных на
другой.
● Зачем нужно: Для повышения отказоустойчивости. Если один сервер
выходит из строя, данные все еще доступны на другом.
● Типы: Синхронная (данные копируются в реальном времени) и
асинхронная (данные копируются с задержкой).

Партиционирование:
● Что это: Разделение большой таблицы на более мелкие,
управляемые части (партиции).
● Зачем нужно: Для улучшения производительности и управляемости.
Запросы могут выполняться быстрее, так как работают с меньшими
объемами данных.
● Типы: Горизонтальное (разделение строк) и вертикальное
(разделение столбцов).

Всегда ли будет использоваться индекс?


Нет, не всегда.
● Отсутствие индекса: Индекс для столбца не создан.
● Маленькие таблицы: Полное сканирование быстрее.
● Низкая селективность: Запрос возвращает большую часть строк.

Что такое оптимизатор запросов?


Оптимизатор запросов — это компонент СУБД, который анализирует SQL-
запросы и выбирает наилучший способ их выполнения. Оптимизатор
учитывает наличие индексов, статистику данных, соединения таблиц и
другие факторы, чтобы минимизировать время выполнения запроса.

Что делать если база данных плохо работает при чтении?


● Индексы: Проверьте и добавьте индексы на часто запрашиваемые столбцы.
● Оптимизация запросов: Перепишите медленные запросы для повышения
эффективности.
● Кэширование: Внедрите кэширование для часто запрашиваемых данных.

Что делать если база данных плохо работает при записи?


● Индексы: Минимизируйте количество индексов на таблицах с частыми
записями.
● Пакетная запись: Используйте пакетную запись для уменьшения
количества транзакций.
● Транзакции: Сократите длительность транзакций.

Сделали контроллер и он тормозит что делать?


Оптимизировать запрос БД

Расскажи про пакетную загрузку в БД?


Пакетная загрузка в БД — это метод вставки или обновления большого
объема данных за один раз, вместо выполнения множества отдельных
операций. Это повышает производительность и снижает нагрузку на базу
данных, так как уменьшает количество сетевых запросов и транзакций.

Вам также может понравиться