Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лаб. 7 СУБД

.docx
Скачиваний:
1
Добавлен:
29.05.2025
Размер:
3.17 Mб
Скачать

Лабораторная работа 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

изменения не видны

изменения не видны

Первичный ключ автоматически индексируется.

Индексация номера группы, так как номер группы может часто использоваться для запросов.

Контрольные вопросы

  1. За счет чего индексы ускоряют выборку данных?

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

  1. Какая структура данных хранит в себе индексные записи?

B-дерево, Хеш-индексы.

  1. Для чего предназначены транзакции?

  1. В чем отличие между неповторяющимся и фантомным чтением?

Соседние файлы в предмете Системы управления базами данных