Проталкивание условий сквозь dds.event_v #128
Notifications
Due Date
No due date set.
Blocks
#132 Контракт dds.event_v: атрибуты бизнес-модели
ddmitry/clickstream-data-platform
Reference: ddmitry/clickstream-data-platform#128
Reference in new issue
Block a user
Part of #127.
Вопрос
Пробрасывает ли ClickHouse условия запроса внутрь обычного представления
над таблицей с
FINAL(ods.event_v) и внутрь вложенного представлениянад ним (будущее
dds.event_v), или сначала разворачивает представлениецеликом и фильтрует потом?
От ответа зависит контракт
dds.event_v: годится ли цепочкапредставлений ODS → DDS → DM, или событию в DDS нужна другая форма.
Сомнение владельца: представление, которое материализуется до фильтра, —
плохой пример для менти.
Как проверять
EXPLAIN(
indexes = 1,actions = 1) поods.event_vс фильтром поEventDateи по ключу сортировки; сравнить с прямым запросом кods.event FINAL.представлений, предикаты и PREWHERE, поведение
FINAL(
do_not_merge_across_partitions_select_final), взаимодействие сDistributed-таблицами.
Сначала прочитать
docs/architecture/storage.md, раздел «Актуальные события»;ods.event_vиdds.event_v);sql/ddl/30-ods-views.sql.Проверено на живом стенде (ClickHouse 26.3.17.56, только читающие запросы) и по документации через MCP Context7.
Ответ: ClickHouse проталкивает условия сквозь обычное представление над FINAL и сквозь второй уровень вложенности. Фильтр по EventDate через ods.event_v срезает партиции так же, как прямой запрос к ods.event_dist FINAL (Parts 2/16, Granules 3/24, один в один); эквивалент вложенного dds.event_v — подзапрос с переименованными колонками — даёт те же цифры. Исполнение сверено по read_rows: 50 626 строк с фильтром против 401 185 без, вложенность не добавила ни строки. Условие доезжает даже сквозь вычисленную колонку (toStartOfWeek(EventDate) анализируется MinMax). Единственная плата FINAL — отключённый автоматический PREWHERE (optimize_move_to_prewhere_if_final = 0 по умолчанию); срезание по индексам работает полностью.
Вывод для контракта: цепочка обычных представлений ODS → DDS → DM годится, представление до фильтра не материализуется. Оговорка в контракт: ключевые для срезов колонки (прежде всего EventDate) отдавать в DDS переименованием, а не нетривиальным пересчётом.
Заметка: docs/research/2026-08-22-view-predicate-pushdown.md, влита в main (PR #139).