Вы находитесь на странице: 1из 6

Кафедра вычислительной техники

Информационные системы и базы данных

Лабораторная работа №4
«EXPLAIN INDEX»
Вариант 101036

Преподаватель:
Сагайдак Алина Алексеевна

Выполнил:
Пащенко Олег Дмитриевич
Р33141

Санкт-Петербург
2023
Задание
По варианту, выданному преподавателем, составить и выполнить запросы к
базе данных "Учебный процесс".

Команда для подключения к базе данных ucheb:

psql -h pg -d ucheb

Отчёт по лабораторной работе должен содержать:

1. Текст задания.
2. Реализацию запросов на SQL.
3. Планы выполнения запросов.
4. Ответы на вопросы, представленные в задании.
5. Выводы по работе.

Темы для подготовки к защите лабораторной работы:

1. Индексы
2. Оптимизация запросов
3. Выбор плана выполнения запросов

Введите вариант:
Внимание! У разных вариантов разный текст задания!
Составить запросы на языке SQL (пункты 1-2).

Для каждого запроса предложить индексы, добавление которых уменьшит


время выполнения запроса (указать таблицы/атрибуты, для которых нужно
добавить индексы, написать тип индекса; объяснить, почему добавление
индекса будет полезным для данного запроса).

Для запросов 1-2 необходимо составить возможные планы выполнения


запросов. Планы составляются на основании предположения, что в таблицах
отсутствуют индексы. Из составленных планов необходимо выбрать
оптимальный и объяснить свой выбор.
Изменятся ли планы при добавлении индекса и как?

Для запросов 1-2 необходимо добавить в отчет вывод команды EXPLAIN


ANALYZE [запрос]

Подробные ответы на все вышеперечисленные вопросы должны


присутствовать в отчете (планы выполнения запросов должны быть
нарисованы, ответы на вопросы - представлены в текстовом виде).
1. Сделать запрос для получения атрибутов из указанных таблиц, применив
фильтры по указанным условиям:
Таблицы: Н_ЛЮДИ, Н_СЕССИЯ.
Вывести атрибуты: Н_ЛЮДИ.ОТЧЕСТВО, Н_СЕССИЯ.ДАТА.
Фильтры (AND):
a) Н_ЛЮДИ.ИД = 142095.
b) Н_СЕССИЯ.УЧГОД < 2001/2002.
Вид соединения: INNER JOIN.
2. Сделать запрос для получения атрибутов из указанных таблиц, применив
фильтры по указанным условиям:
Таблицы: Н_ЛЮДИ, Н_ВЕДОМОСТИ, Н_СЕССИЯ.
Вывести атрибуты: Н_ЛЮДИ.ИД, Н_ВЕДОМОСТИ.ДАТА, Н_СЕССИЯ.ДАТА.
Фильтры (AND):
a) Н_ЛЮДИ.ИД = 152862.
b) Н_ВЕДОМОСТИ.ЧЛВК_ИД > 142390.
c) Н_СЕССИЯ.ИД < 14.
Вид соединения: INNER JOIN.

Запросы

● №1:

SELECT Н_ЛЮДИ.ОТЧЕСТВО, Н_СЕССИЯ.ДАТА

FROM Н_ЛЮДИ

INNER JOIN Н_СЕССИЯ ON Н_ЛЮДИ.ИД = Н_СЕССИЯ.ЧЛВК_ИД

WHERE Н_ЛЮДИ.ИД = 142095

AND Н_СЕССИЯ.УЧГОД < '2001-01-01';


Вывод EXPLAIN ANALYZE:

Nested Loop (cost=4.58..19.63 rows=1 width=28) (actual time=0.039..0.040 rows=0 loops=1)


-> Index Scan using "ЧЛВК_PK" on "Н_ЛЮДИ" (cost=0.28..8.30 rows=1 width=24)
(actual time=0.026..0.027 rows=1 loops=1)
Index Cond: ("ИД" = 142095)
-> Bitmap Heap Scan on "Н_СЕССИЯ" (cost=4.30..11.32 rows=1 width=12) (actual
time=0.008..0.008 rows=0 loops=1)
Recheck Cond: ("ЧЛВК_ИД" = 142095)
Filter: (("УЧГОД")::text < '2001-01-01'::text)
-> Bitmap Index Scan on "SYS_C003500_IFK" (cost=0.00..4.29 rows=2 width=0)
(actual time=0.005..0.006 rows=0 loops=1)
Index Cond: ("ЧЛВК_ИД" = 142095)
Planning Time: 0.243 ms
Execution Time: 0.099 ms

Индексы:

CREATE INDEX ЧЛВК_ИД_ХЕШ_ИНДЕКС ON Н_СЕССИЯ USING HASH (ЧЛВК_ИД);

CREATE INDEX ИД_ИНДЕКС ON Н_ЛЮДИ (ИД);

CREATE INDEX ДАТА_СЕССИЯ_БТРЕЕ_ИНДЕКС ON Н_СЕССИЯ USING BTREE


(ДАТА);

Добавление этих индексов должно сильно ускорить выполнение запросов, так как в
них присутствует выборка с использованием операторов сравнения и соединение
таблиц.
● №2:
SELECT Н_ЛЮДИ.ИД, Н_ВЕДОМОСТИ.ДАТА, Н_СЕССИЯ.ДАТА
FROM Н_ЛЮДИ
INNER JOIN Н_ВЕДОМОСТИ ON Н_ЛЮДИ.ИД = Н_ВЕДОМОСТИ.ЧЛВК_ИД
INNER JOIN Н_СЕССИЯ ON Н_ЛЮДИ.ИД = Н_СЕССИЯ.ЧЛВК_ИД
WHERE Н_ЛЮДИ.ИД = 152862
AND Н_ВЕДОМОСТИ.ЧЛВК_ИД > 142390
AND Н_СЕССИЯ.ИД < 14;

Вывод EXPLAIN ANALYZE:

Nested Loop (cost=4.87..63.88 rows=13 width=20) (actual time=0.058..0.059 rows=0 loops=1)


-> Nested Loop (cost=4.58..19.63 rows=1 width=12) (actual time=0.057..0.058 rows=0
loops=1)
-> Index Only Scan using "ЧЛВК_PK" on "Н_ЛЮДИ" (cost=0.28..8.30 rows=1 width=4)
(actual time=0.043..0.043 rows=1 loops=1)
Index Cond: ("ИД" = 152862)
Heap Fetches: 1
-> Bitmap Heap Scan on "Н_СЕССИЯ" (cost=4.30..11.32 rows=1 width=12) (actual
time=0.009..0.009 rows=0 loops=1)
Recheck Cond: ("ЧЛВК_ИД" = 152862)
Filter: ("ИД" < 14)
-> Bitmap Index Scan on "SYS_C003500_IFK" (cost=0.00..4.29 rows=2 width=0)
(actual time=0.006..0.006 rows=0 loops=1)
Index Cond: ("ЧЛВК_ИД" = 152862)
-> Index Scan using "ВЕД_ЧЛВК_FK_IFK" on "Н_ВЕДОМОСТИ" (cost=0.29..44.12
rows=13 width=12) (never executed)
Index Cond: (("ЧЛВК_ИД" > 142390) AND ("ЧЛВК_ИД" = 152862))
Planning Time: 0.268 ms
Execution Time: 0.125 ms

Индексы:

CREATE INDEX ЧЛВК_ИД_ХЕШ_ИНДЕКС_ВЕДОМОСТИ ON Н_ВЕДОМОСТИ


USING HASH (ЧЛВК_ИД);

CREATE INDEX ИД_ИНДЕКС ON Н_ЛЮДИ (ИД);

CREATE INDEX ЧЛВК_ИД_ХЕШ_ИНДЕКС_СЕССИЯ ON Н_СЕССИЯ USING HASH


(ЧЛВК_ИД);

CREATE INDEX ЧЛВК_ИД_ИНДЕКС_ВЕДОМОСТИ ON Н_ВЕДОМОСТИ


(ЧЛВК_ИД);
CREATE INDEX ДАТА_БТРЕЕ_ИНДЕКС_ВЕДОМОСТИ ON Н_ВЕДОМОСТИ
USING BTREE (ДАТА);

CREATE INDEX ДАТА_БТРЕЕ_ИНДЕКС_СЕССИЯ ON Н_СЕССИЯ USING BTREE


(ДАТА);

CREATE INDEX ИД_ИНДЕКС_СЕССИЯ ON Н_СЕССИЯ (ИД);

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

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

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