Ответ на задание 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;

При оптимизации запросов следует учитывать:

Таким образом, оптимизация должна начинаться не с создания индексов «на все поля», а с анализа конкретных запросов и их планов выполнения.