
Лаб. 7 СУБД
.docxЛабораторная работа 7
«Индексы, транзакции»
CREATE TABLE attendance (
attendance_id SERIAL PRIMARY KEY,
generated_code VARCHAR(64),
person_id integer,
enter_time timestamp,
exit_time timestamp,
FOREIGN KEY (person_id) REFERENCES student_id (student_id)
);
do
$$
DECLARE
enter_time timestamp(0);
exit_time timestamp(0);
person_id integer;
enter_id VARCHAR(64);
BEGIN
FOR i IN 1..1000000 LOOP
-- Генерируем случайную дату в указанном диапазоне
enter_time := to_timestamp(random() *
(
extract(epoch from '2023-12-31'::date) -
extract(epoch from '2023-01-01'::date)
)
+ extract(epoch from '2023-01-01'::date)
);
-- Генерируем случайный интервал времени, который пробыл в вузе студент (не более 10 часов)
exit_time := enter_time + (floor(random() * 36000 + 1)*'1 SECOND'::interval);
person_id := (
SELECT student_id FROM student
ORDER BY random()
LIMIT 1
);
enter_id := md5(random()::text);
INSERT INTO attendance(generated_code, person_id, enter_time,exit_time)
VALUES(enter_id, person_id, enter_time, exit_time);
END LOOP;
END
$$;
insert into attendance (generated_code, person_id, enter_time, exit_time)
values (
md5(random()::text),
(select student_id from student_id order by random() limit 1),
now(),
now() + interval '2 hours'
);
explain analyze
select * from attendance order by generated_code;
create index idx_attendance_generated_code on attendance(generated_code);
|
Время до индексирования Tb |
Время после индексирования Ta |
Ta/ Tb |
SELECT |
2377,492 мс |
485,260 мс |
0,204 |
INSERT |
4,952 мс |
3,478 мс |
0,702 |
explain analyze
select * from attendance
explain analyze
select * from attendance
where person_id = 869103
create index idx_attendance_person_id on attendance(person_id)
|
Время до индексирования Tb |
Время после индексирования Ta |
Ta/ Tb |
SELECT |
58,846 мс |
56,252 мс |
0,956 |
SELECT + WHERE |
154,960 мс |
4,384 мс |
0,028 |
explain analyze
select * from attendance
where generated_code like '%a'
order by generated_code
select s.student_id, s.surname, s.name, s.patronymic, s.students_group_number
from student s
join field_comprehension fc on fc.student_id = s.student_id
where fc.field in ('bd201d43-4932-4c1d-cd2e-f264ad9c27a5', '7ace7bee-0d70-5a1f-1113-2cd60d11dfa4')
and fc.mark < 5
group by s.student_id, s.surname, s.name, s.patronymic, s.students_group_number
having count(distinct fc.field) = 2
order by s.surname
За преподавателя:
begin;
update field_comprehension
set mark = 5
where field = '7ace7bee-0d70-5a1f-1113-2cd60d11dfa4'
and student_id = (select student_id from student where surname = 'Алексеев' and name = 'Тимофей');
update field_comprehension
set mark = 5
where field = 'bd201d43-4932-4c1d-cd2e-f264ad9c27a5'
and student_id = (select student_id from student where surname = 'Алексеев' and name = 'Тимофей');
За методиста:
select *
from field_comprehension fc
join student s on s.student_id = fc.student_id
where s.surname = 'Алексеев' and s.name = 'Тимофей'
and fc.field in ('bd201d43-4932-4c1d-cd2e-f264ad9c27a5', '7ace7bee-0d70-5a1f-1113-2cd60d11dfa4')
За преподавателя:
commit
За методиста:
Уровень изоляции |
До фиксации |
После фиксации |
Read uncommited |
изменения не видны |
изменения видны |
Read committed |
изменения не видны |
изменения видны |
Repeatable read |
изменения не видны |
изменения не видны |
Serializable |
изменения не видны |
изменения не видны |
Первичный ключ автоматически индексируется.
Индексация номера группы, так как номер группы может часто использоваться для запросов.
Контрольные вопросы
За счет чего индексы ускоряют выборку данных?
Существуют ли случаи, когда использование индексов замедляет выборку данных?
Какая структура данных хранит в себе индексные записи?
B-дерево, Хеш-индексы.
Для чего предназначены транзакции?
В чем отличие между неповторяющимся и фантомным чтением?