Большинство баз данных каждый раз выполняют запросы с нуля, что делает задержку чтения пропорциональной сложности запроса и размеру данных. Readyset использует другой подход: он компилирует каждый запрос в граф потока данных — сеть операторов (соединения, фильтры, агрегации, проекции), которая непрерывно поддерживает результат запроса по мере изменения данных. Когда строка вставляется, обновляется или удаляется в вышестоящей системе, изменение распространяется через граф, и кэшированный результат инкрементально обновляется. Чтение становится поиском в предварительно вычисленном материализованном представлении, а не полным выполнением запроса.
Эта архитектура накладывает структурные ограничения на SQL. Бинарные соединения требуют предикатов равенства; предикаты диапазона или ключи соединения на основе выражений не поддерживаются. Коррелированные подзапросы должны быть переписаны в эквивалентные соединения, так как поток данных не имеет выполнения на внешнюю строку. Производные таблицы поддерживаются, но компилируются в полностью материализованные промежуточные узлы; конвейер переписывания агрессивно встраивает их там, где это безопасно.
Поддерживаемые типы соединений включают INNER, LEFT OUTER и CROSS; RIGHT и FULL OUTER не поддерживаются из-за сложности отслеживания отсутствующих совпадений. Агрегации требуют явных ссылок на столбцы GROUP BY и по крайней мере одной проекции, производной от агрегации.
Компромисс заключается в том, что запросы должны быть выражены в форме, которую может скомпилировать механизм потока данных — более ограничительной, чем стандартный SQL — но выгода заключается в инкрементальном обслуживании и более быстром чтении.
Источник: Hacker News · Сводку подготовил HeadlinesBriefing