Проталкивание условий сквозь dds.event_v #128

Closed
opened 2026-08-22 10:26:10 +03:00 by ddmitry · 1 comment
Owner

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.
  • Документация ClickHouse через MCP Context7: раскрытие обычных
    представлений, предикаты и PREWHERE, поведение FINAL
    (do_not_merge_across_partitions_select_final), взаимодействие с
    Distributed-таблицами.

Сначала прочитать

  • docs/architecture/storage.md, раздел «Актуальные события»;
  • мастер-спека, раздел 7 (контракты ods.event_v и dds.event_v);
  • sql/ddl/30-ods-views.sql.
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`. - Документация ClickHouse через MCP Context7: раскрытие обычных представлений, предикаты и PREWHERE, поведение `FINAL` (`do_not_merge_across_partitions_select_final`), взаимодействие с Distributed-таблицами. ## Сначала прочитать - `docs/architecture/storage.md`, раздел «Актуальные события»; - мастер-спека, раздел 7 (контракты `ods.event_v` и `dds.event_v`); - `sql/ddl/30-ods-views.sql`.
ddmitry added the wayfinder:research label 2026-08-22 10:26:13 +03:00
ddmitry self-assigned this 2026-08-22 10:28:19 +03:00
Author
Owner

Проверено на живом стенде (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).

Проверено на живом стенде (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).
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Reference: ddmitry/clickstream-data-platform#128