Mikhail IvantsovДавай упростим. Основная логика - управление данными. Данные не хранятся в кеше, они хранятся в постоянном хранилище (в анализируемых РСУБД). Основная нагрузка в самом медленном узле - дисковой подсистеме. Каждая СУБД решает проблемы с медленным доступом к данным хранилища своим способом. Вот это вс
Как показывает практика, документация и открытый код (если есть) - это не так.
Данные с диска надо не просто прочитать.
Во-первых данные в современных полноценных RDBMS лежат не просто так, а в страницах.
И вот уже первая проблема - как получить список страниц для таблицы на 100Tb.
Далее, этот список будет хранится не в 4-м измерении, а где то. Это "где то" - это и есть промежуточные таблицы.
Да, можно конечно на каждый чих городить спец контейнеры. Но никто в здравом уме так делать не будет. Ибо поддерживать это всё совершенно невозможно, а велосипедов придется изобрести на 200 лет вперед. Но не исключаю.
И это, мы только получили список страниц!
Далее читаем страницы и кладем их в кеш. Чтобы потом с этими данными работать вы должны:
1. Иметь сопоставление страниц на диске со страницами в памяти
2. Иметь сопоставление между строками и адресами внутри страницы
Едем дальше - надо применить условия WHERE. Это значит, что для каждой строки надо:
1. Найти ее внутри страницы
2. Найти поле внутри строки
3. Применить условие
И тут работает всё тот же движок, описанный ранее, который не только создает контейнеры для хранения, но и предоставляет интерфейсы для их использования.
И хотя на словах это всё выглядит просто - в реальности это создает дичайший оверхед. Тот самый порядок между PG и Oracle.
Далее идут индексы - и снова - нам надо:
1. Прочитать страницы из памяти, да еще не просто так а в соответствии с алгоритмом B-дерева. Опять работает движок.
2. Отфильтровать по этому индексу строки и получить OID или RawId. Опять работает движок.
3. Взять по OID или RawId данные из кеша или диска. И опять работает движок.
4. Загрузить их в кеш для последующей фильтрации.
Аналогично с JOIN, аналитическими функциями и прочим.
И вот получается, что куда не плюнь - везде используется движок.
И если движок на каждом шаге теряет x10, а шагов на пути от сырых данных 10 или 100 мы имеем потери в 1000-10000 раз легко.
Да, в многопотоке еще добавляется конкуренция. Но мы уже поте… Читать полностью →
👍1