🫙 Про чтение в SQL [ч. 1]

Господа-аналитики, ничего сложного, делаем 90% своей работы, все в порядке. А вот как работает все под капотом не было особо сильного понимания. Решил глянуть парочку источников... 🔥 Будем говорить в контексте работы с нераспределенными базами данных. К ним относятся: PostgreSQL, MySQL, Oracle, MS SQL. Увидел формулировку ниже, решил покопать ⌨️ Основная идея повышения скорости работы нераспределённой базы данных заключается в уменьшении количества операций чтения/записи с жёсткого диска

👀 У ИТМО нашел страничку, где описаны объемы, производительности, стоимости, в целом можно собрать какие-то выводы, что оперативка быстрее и лучше, но дороже, в целом понятно, почему хочется меньше жесткого диска)

Но RAM выполняет функцию буфера, а данные хранятся на диске.

Предположим, у нас есть упрощенная табличка в нераспределенной базе данных people со следующей структурой:

`CREATE TABLE people ( last_name varchar(32), first_name varchar(32), second_name varchar(32), sex char(1), birthday date );

Допущение, что в среднем фамилия имя и отчество состоят из 7 RU символов, а кодировка используется Unicode, тогда средняя строка займет на диске:

(7 * 2 + 1) * 3 + 2 * 1 + 4 = 51 байт

💅 Есть еще определенная метадата, которая будет добавлять +32 байта, тогда средняя строчка займет 83 байта с учетом метадаты. Блок - это минимальная единица чтения и записи базы данных (страница данных в файле таблицы). Один блок во многих учебных материалах идет в 4 кб (4096 байт) 👩‍💻 У постгре, например, он стоит в 8 кб по стандарту=> В одном блоке содержится 📛

4096 / 83 = 49 строк и 29 байт остатка

⚠ Важно: база читает не одну строку, а весь блок целиком.

В таблице у нас 1000 записей, значит суммарно у нас будет блоков:

1000 / 49 ~ 20.4 блоков (округляем до 21)

Хотим сделать фильтрацию в SQL 🔽 `select * from people where last_name IN('Иванов', 'Петров', 'Сидоров');

Мы не знаем где находятся записи, поэтому блоки будем считывать последовательно ([1, 2, 3, ... 21] блок, а может наши данные находятся в 12, 15 и 21 блоке).

🙊 Чем ближе нужные строки друг к другу, тем быстрее запрос. Если они лежат в одном блоке, база считает всё за один проход, а если раскиданы по разным, то придётся читать каждый блок отдельно 🐢 🙅‍♂️ Если отсортировать записи в блоке по ключу, то, дойдя до последнего совпадения, можно просто остановить поиск, так как дальше нужных значений уже не будет.

Чтобы не читать лишние блоки и быстрее находить нужные записи можно пользоваться индексными структурами, про которые я хочу написать в последующих постах, поговорим о стоимости запросов и о том, где они хороши, а где нет. Все что нужно — это 🐳

А я то думал, что когда был в 💙 и строил витрины с сегментациями, сортировками, думал, что все просто, но еще нужно много всего подучить 🧑‍🎓

@zasql_python``