Ответ на задание 1
Если поиск часто выполняется по столбцу Email, для него
можно создать индекс:
CREATE INDEX idx_student_email
ON Student(Email);
После этого запрос:
SELECT *
FROM Student
WHERE Email = 'student@example.com';
может выполняться быстрее, поскольку СУБД при подходящем
плане выполнения сможет использовать индекс вместо последовательного просмотра
всей таблицы.
Если поле Email должно содержать только уникальные значения,
можно создать уникальный индекс:
CREATE UNIQUE INDEX idx_student_email
ON Student(Email);
Индекс особенно полезен для столбцов, которые часто
используются в WHERE, JOIN, а в некоторых случаях — в операциях сортировки.
При этом индексы требуют дополнительного дискового
пространства и могут увеличивать стоимость операций INSERT, UPDATE и DELETE,
поскольку СУБД должна поддерживать индекс в актуальном состоянии.
Ответ на задание 2
Предположим, часто выполняется следующий запрос:
SELECT *
FROM Orders
WHERE CustomerID = 15
AND OrderDate >=
'2026-01-01'
AND OrderDate < '2027-01-01';
Для такого запроса можно создать составной индекс:
CREATE INDEX idx_orders_customer_date
ON Orders(CustomerID, OrderDate);
В данном индексе сначала располагается CustomerID, а затем
OrderDate.
Это соответствует условию запроса: сначала выбираются заказы
конкретного клиента, а затем применяется диапазон по дате.
Составной индекс содержит несколько столбцов:
(CustomerID, OrderDate)
Порядок столбцов в составном индексе имеет значение и должен
определяться с учетом реально выполняемых запросов.
Например, этот индекс хорошо подходит для запросов вида:
WHERE CustomerID = 15
и:
WHERE CustomerID = 15
AND OrderDate >=
...
Однако создавать большое количество индексов без
необходимости не следует. Каждый дополнительный индекс увеличивает затраты на
изменение данных.
Ответ на задание 3
Для анализа производительности необходимо изучить план
выполнения запроса.
Например, в PostgreSQL можно использовать:
EXPLAIN
SELECT *
FROM Student
WHERE GroupID = 5;
Для получения фактической информации о выполнении:
EXPLAIN ANALYZE
SELECT *
FROM Student
WHERE GroupID = 5;
Если СУБД выполняет последовательное сканирование большой
таблицы, в плане можно увидеть операцию типа:
Seq Scan on Student
Одним из возможных способов оптимизации является создание
индекса:
CREATE INDEX idx_student_group
ON Student(GroupID);
После этого СУБД может выбрать индексный доступ, если
оптимизатор считает его более эффективным.
Однако наличие индекса не гарантирует, что он будет
использован. Например, если GroupID = 5 соответствует очень большой доле
таблицы, последовательное чтение может оказаться эффективнее.
Также вместо:
SELECT *
желательно запрашивать только действительно необходимые
столбцы:
SELECT StudentID, FullName
FROM Student
WHERE GroupID = 5;
При оптимизации запросов следует учитывать:
Таким образом, оптимизация должна начинаться не с создания
индексов «на все поля», а с анализа конкретных запросов и их планов выполнения.