Trino — это не база данных. Это распределённый SQL-движок, который подключается к десяткам источников: PostgreSQL, ClickHouse, Hive, S3 и другим. У него есть свои ресурсы (воркеры, память, CPU), но хранить данные он не умеет — он их берёт из источников и обрабатывает у себя.
И вот здесь начинаются сюрпризы.
🟢 Что такое Pushdown — и почему без него всё тормозит:
Когда Trino выполняет запрос к внешнему источнику, в идеале он должен «протолкнуть» (push down) часть работы прямо туда: фильтры, агрегации, лимиты. Тогда источник вернёт уже обработанный результат — маленький и быстрый.
Но pushdown не всегда работает. Это зависит от конкретного коннектора, версии Trino и сложности запроса. Если pushdown не сработал — Trino тащит всю таблицу к себе и фильтрует уже у себя в памяти. Например:
-- Trino может вытащить всю таблицу orders и только потом отфильтровать
SELECT *
FROM postgres.public.orders
WHERE created_at > '2024-01-01'
Хочешь точно знать, что происходит? Смотри EXPLAIN — в плане будет видно, пошёл ли фильтр в источник или Trino делает это сам.
🟢 system.query — явный контроль вместо надежды на pushdown:
system.query — это способ сказать Trino: «не думай сам, выполни этот SQL прямо в источнике и просто верни мне результат».
1️⃣ PostgreSQL — тяжёлый фильтр по индексу:
SELECT *
FROM TABLE(
postgres.system.query(
query => 'SELECT id, amount FROM orders WHERE created_at > ''2024-01-01'''
)
)
PostgreSQL выполнит запрос сам, использует свои индексы — и вернёт только нужные строки.
2️⃣ ClickHouse — агрегация на стороне источника:
SELECT *
FROM TABLE(
clickhouse.system.query(
query => 'SELECT event_date, count() FROM events GROUP BY event_date'
)
)
ClickHouse заточен под колоночные агрегации. Если делать GROUP BY в Trino поверх ClickHouse — он сначала вытащит все сырые строки. system.query оставляет агрегацию там, где ей место.
🟢 Когда использовать system.query — интуитивно:
✅ Используй, если мысленно отвечаешь «да» хотя бы на один вопрос:
• «Я точно знаю, что эта логика быстрее выполнится в источнике» → используй
• «Таблица большая, а мне нужен маленький срез — и я не уверен, что Trino сам догадается» → используй
• «Я делаю агрегацию в ClickHouse и не хочу гонять миллионы строк» → используй
• «EXPLAIN показывает, что pushdown не работает» → используй
❌ Не используй, если:
• Нужно джойнить данные из разных источников — тут Trino незаменим, system.query не даст соединить PG и ClickHouse в одном запросе
• Запрос простой и ты уверен, что pushdown сработал
• Хочешь переносимый запрос без привязки к диалекту источника
Итог: 🤩
🔥 Набираем 70 реакций на этот пост — так я пойму, что стоит делать больше таких разборов.
📤 Пересылай пост коллеге или другу из аналитики — это бесплатно и помогает каналу расти. Спасибо!
🚬 Вопросы, менторство, консультации: Написать в ЛС | mentor.dima-sqlit.ru
@dima_sqlit
