惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

N
News and Events Feed by Topic
Malwarebytes
Malwarebytes
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
C
Cybersecurity and Infrastructure Security Agency CISA
F
Future of Privacy Forum
C
Cisco Blogs
T
The Exploit Database - CXSecurity.com
A
Arctic Wolf
S
Securelist
K
Kaspersky official blog
S
Schneier on Security
T
ThreatConnect
T
Tenable Blog
Spread Privacy
Spread Privacy
T
True Tiger Recordings
AWS News Blog
AWS News Blog
F
Fox-IT International blog
量子位
T
Threatpost
V
Vulnerabilities – Threatpost
C
CERT Recently Published Vulnerability Notes
Cisco Talos Blog
Cisco Talos Blog
GbyAI
GbyAI
宝玉的分享
宝玉的分享
腾讯CDC
G
Google Developers Blog
aimingoo的专栏
aimingoo的专栏
Cyberwarzone
Cyberwarzone
有赞技术团队
有赞技术团队
S
SegmentFault 最新的问题
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
Visual Studio Blog
U
Unit 42
雷峰网
雷峰网
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Simon Willison's Weblog
Simon Willison's Weblog
O
OpenAI News
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
The GitHub Blog
The GitHub Blog
The Register - Security
The Register - Security
MyScale Blog
MyScale Blog
小众软件
小众软件
A
About on SuperTechFans
Last Week in AI
Last Week in AI
Y
Y Combinator Blog
博客园 - 三生石上(FineUI控件)
美团技术团队
Google Online Security Blog
Google Online Security Blog
P
Proofpoint News Feed
MongoDB | Blog
MongoDB | Blog

Все публикации подряд на Хабре

[Перевод] Эрик Рис, автор Lean Startup: Почему хорошие компании становятся плохими после IPO Context-driven Reusable Form Pattern: Масштабируемая архитектура для Create / Edit / Create-from-Source Пузырьковая сетка, кошачья стая и не только — неожиданные источники вдохновения для QoS-алгоритмов ___, или «Заголовок намеренно оставлен пустым» ИИ-боты сканируют даже логи TLS-сертификатов. Любая информация используется для обучения LLM Нейросеть оживить фото ИИ: Как оживить фото нейросетью в 2026 году? Разбираемся в ML без воды: от базы до Attention. Часть 5: Метрики качества В поисках «кофейного Грааля». Как человечество пытается сварить идеальный кофе и какие рецепты предлагают…математики Программатик: Часть 2 — OpenRTB Интернет до бесконечных лент: каким был 2010 год Перезапуск TrueIndex: что изменилось в рейтинге языков программирования Проектный холст: как менеджеру подбирать «краски» управления под разные команды «Метафизика в формулах: математическое ядро «Веры Паломника — Исход» Java и постквантовый TLS Marcli: Markdown Терминал Кнопочный смартфон с 5G за 2800 рублей — разбираем и изучаем китайскую диковинку Где неприятности — там и жизнь Разворачивайте платформы: stackfile Мой путь в Microsoft Мобильная разработка за неделю #631 (18 — 24 мая) Что не так с Mixtape, и почему не все довольны новой игрой? Стоматология каменного века. Как неандертальцы лечили зубы 59 тысяч лет назад Почему классическое управление проектами часто не работает в IT-продуктах Строительство Саркофага. Часть 2. Бетонные реки и стальные берега РАЗРАБОТКА ПАРАМЕТРИЗИРУЕМОГО МОДУЛЯ CORDIC-АЛГОРИТМА НА SYSTEM VERILOG Вариационное исчисление как метафора свободы выбора: от градиентного спуска к онтологии пути Ekahau Sidekick и RSSI‑offset: физические ограничения метода и пять независимых причин неточности клиентской модели Колесо потока против раскола Обзор интересных особенностей переворачивающихся при умножении чисел В С неопределённое поведение повсюду MCP-агрегатор: объединяем инструменты для LLM в один сервер Дата-центры в космосе: как Google и SpaceX готовят новую инфраструктуру для ИИ Google готовит замену Chromebook: какими будут ноутбуки Googlebook Пользователь пишет issue, агент меняет сайт. Да, я это сделал Корпоративные конфликты в ИТ-секторе: механика судебной защиты активов и субсидиарных рисков Цена одной опечатки: Как три неверные буквы сорвали киберограбление на миллиард долларов Как я победил спам в своих email аккаунтах Whitepaper Сбера «AI-Disrupt PDLC»: разбор для тех, кто пишет код RustDesk Pro в России не купить. После долгих лет администрирования мы собрали своё честное решение Не пики, а бассейны: почему эволюция — это блуждание по графу жизни Как Gemini 3.5 Flash сломали ради красивых графиков (и почему она обходит 3.1 Pro только на бумаге) Вредоносная атака на Laravel-Lang meta-attention is all you need Как перестать путаться в IP-адресах серверов Сколько стоят ошибки в арбитраже: декомпозиция ценообразования на судебные услуги в Москве Разбираемся в ML без воды: от базы до Attention. Часть 4: kNN Vortex: фреймворк для тех, кого задолбала итальянская кухня в репозитории Использование тепла ЦОД в мире и РФ Часть 4. Скорость света — технические детали Не цитируй мне нейросеть Что сейчас с Project Loom? Примеры и код Рождённые в Сумерках Meta 1 мая показала как они хранят ключи от ваших бэкапов WhatsApp. Разбираю архитектуру и сравниваю Линт проектов: собираем ESLint, Prettier и Stylelint в один пакет Reasoning-модели сломали мой промпт-инжиниринг. Год переучиваюсь РБМК: enfant terrible Как я собеседую менеджеров AI-продуктов для крупного Enterprise Парадокс рынка труда: конкуренция выросла, но не везде, нанимать легче, но не везде Модификаторы в Blender: осваиваем Boolean «Бесплатно» — это красный флаг: почему мы доверяем не тем (опрос) Стратегия выживания в эпоху ИИ Новая теория обещает переписать фундамент всей математики MTP у Qwen3.6 в llama.cpp обещает ×2 по скорости. Я прогнал ту же модель через своего агента — и получил обратное [Перевод] Соль и перец в безопасности паролей Что такое «статьи-зомби» CodeGraph: граф кода для Claude Code вместо grep по файлам. Разбираю архитектуру и проверяю бенчмарки Мессенджер Ласточка. Часть 3 Google представила Gemini Omni — универсальную ИИ-модель. Роботы работают, счастлив человек Что у SpaceX с патентным портфелем перед IPO? Делегирование, которому можно научиться у промпт‑инженеров Feature Based Clean Architecture. Часть 5: Масштабирование FBCA и теоретико-графовый анализ зависимостей Настройка типизации формы React Hook Form (≥ v7.44.0) + Zod с разными входными и выходными типами Feature Based Clean Architecture. Часть 4: FBCA: формализация границ ответственности в NestJS-модуле Корпорация «Святые Технологии». Работа мечты (рассказ) CyLab Security Academy: как Carnegie Mellon превратила CTF в полноценную обучающую платформу Feature Based Clean Architecture. Часть 3: Архитектурный риск циклов в NestJS: ROI решений на горизонте пяти лет Домашний сервер без белого IP: безопасная публикация сервисов через VPS, обратный SSH-туннель и Caddy Почему не взлетели дирижабли? Часть 22: Митягина, Эйхенвальд и Ховрина, первый в истории женский экипаж дирижабля Китайцы ответили на H200 — обзор Zhenwu M890 от Alibaba Feature Based Clean Architecture. Часть 2: Декомпозиция на сервисы: анализ ограниченности подхода Лучшие игры для Steam Deck в 2026 году по мнению пользователей Обход блокировок внутри iOS-приложения: VLESS + Reality через sing-box, и грабли по дороге [Перевод] Любой пользователь интернета может позвонить в вашу дверь Новый экспериментальный препарат для похудения обеспечил резкое снижение веса Хром и скорость Провалила вайтборд, но прошла тестовое — как я делала задание для Т-Банка Космическая линза помогла Уэббу увидеть древнейшую галактику Вселенной Почему custom URI schemes в Telegram Mini Apps ведут себя по-разному на Android, iOS и Desktop Как я сократил рутину QA до пары кликов: генератор API-тестов и тест-кейсов на LLM, которым хочу поделиться ИИ‑спасатель в кармане: как мы сделали агента для помощи при ЧС, который работает без интернета QNAME minimisation на практике: RFC 7816, реализация, грабли Агенты, роботы и мы: как ИИ перекраивает рынок труда в Европе От боли к npm install: TDLib для React-Native, или как я делал проект, а получилась библиотека Написание консольного симулятора баттл-арены на языке С++ с реализацией «умных» ботов Очень много букв… Или кейс по специфической настройке рабочего окружения Segmentation Fault: как оно устроено? Python в enterprise: момент, когда пора открыть Java не только ради собеседований MonoGame — игровой движок для тех, кто любит изобретать велосипеды Спасти рядового Буридана Рефакторинг выпадающих списков: от enum к конфигу-константе
Почему устанавливают join_collapse_limit = 20
OlegIct · 2026-05-25 · via Все публикации подряд на Хабре

В обсуждении под статьями "СУБД Tantor Postgres 18: обзор улучшений для 1С" и "В погоне за APDEX-ом, или как создать HighLoad на недорогом серверном железе" чрезвычайно уважаемые люди задались вопросом про *_collapse_limit и его отношение к geqo_threshold. В сообществе обсуждали эти параметры в большом топике, в этой статье коротко описано то, к чему там пришли.

Число 20 взялось из поста Роберта Хааса 2009 года по то, можно ли что-то сделать с параметрами *_collapse_limit в PostgreSQL версии 8.5, которая в то время выходила. Техника добавления OFFSET 0 взялась из того же обсуждения.

В 2009 году Хаас предложил увеличить geqo_threshold до 16 и *_collapse_limit до 12 (сделать булевыми или вообще убрать), и спросил мнение практиков. GEQO появился в PostgreSQL 19 февраля 1997 года.

Практик, Кевин Гриттнер, написал: у нас отключен geqo, и мы установили _collapse_limit на 20. Вероятно, нам следует просто установить их на несколько сотен и не ждать, пока какой-нибудь запрос с более чем 20 таблицами начнет работать плохо, но я не уверен, что у нас пока есть такие запросы. По его опыту, в тех случаях, когда увеличение _collapse_limit хоть как-то влияло на результат, это всегда приводило к созданию плана, который экономил больше времени, чем дополнительное время на планирование.

Роберт Хаас выразил суть параметров: параметры join_collapse_limit и from_collapse_limit ограничивают порядок объединения. Если все оценки верны, установка их значения < бесконечности  либо оставит планы неизменными, либо ухудшит их. Если же они улучшат планы, значит, оценки неверны, и ограничение порядка объединения мешает планировщику учитывать случаи, которые действительно наносят ущерб. Но это в основном дело случая.

То есть что 20, что 100 разницы нет, если оценки верны. Сделать булевыми хотели, чтобы можно было сделать порядок соединения точно таким, как в запросе.

Том Лейн написал, что *_collapse_limit были добавлены исключительно на основе предположения, что кому-то они могут пригодиться. Том не против удаления join_collapse_limit или сведения его к логическому значению.

Альваро Эррера никогда не сталкивался со случаями, когда collapse_limits были бы  полезными инструментами.

Ноа Миш донес миру то, что добавление статистически неразличимых столбцов на PostgreSQL 8.3 он наблюдает увеличение времени планировании и памяти в 4 раза (В PostgreSQL 18 в 3.x раз или, как абсолютно правильно пишет Андрей Лепихов "сверхэкспоненциально") и привел пример соединения 16 таблиц. А для запросов с 19-21 соединениями, пришлось отключить детерминизм (включить GEQO),так как планирование длилось более, чем 600 секунд и использовало на этапе планирвания более 10 Гб памяти. Ноа Миш никогда не сталкивался с ситуацией, когда значение, отличное от 1 или "бесконечность", для *_collapse_limit, оказалось бы оптимальным.

Том Лейн сказал, что DBA любят предсказуемость, поэтому, значения по-умолчанию, для join_collapse_limit и from_collapse_limit установлены так, чтобы предотвратить использование GEQO.  Если убрать *_collapse_limit, то посыпятся жалобы, что запрос выполняется, то быстро то медленно, если только не отключить GEQO и сослался на недавнюю жалобу с соединением 17 таблиц.

Мнение Тома подтвердил Кевин Гриттнер (как представитель DBA в обсуждении), что главная причина, по которой он старается избегать GEQO, в том, что он никогда не знает, GEQO может редко, но метко, создать кривой план, что приведет к загадочным жалобам пользователей, и эти жалобы могут отнять много времени на разбор причин.

Андреас Фройнд потратил несколько дней и создал сложный тесткейс из реальной системы, который и опубликовал в топике. Любой может его попробовать. Я воспроизвёл на 18 версии тест Андреаса:

\timing on \\
SET SEARCH_PATH = test_data, test_view;
SET geqo = off;
SET join_collapse_limit = 11;
--- 2617.020 ms Memory: used=597053kB  allocated=599284kB
SET join_collapse_limit = 12;
--- 3205.557 ms used=759366kB  allocated=763124kB
SET join_collapse_limit = 13;
--- 3266.530 ms used=769482kB  allocated=771316kB
SET join_collapse_limit = 14;
--- 7079.614 ms used=1090170kB  allocated=1091380kB
SET join_collapse_limit = 15;
--- 15926.589 ms used=2179803kB  allocated=2181044kB
SET join_collapse_limit = 16;
--- 13124.880 ms used=2210545kB  allocated=2213812kB
SET join_collapse_limit = 17;
--- 19529.137 ms used=2793452kB  allocated=2796724kB
SET join_collapse_limit = 18;
--- 63925.147 ms used=8861636kB  allocated=8869044kB
SET join_collapse_limit = 19;
--- 56204.530 ms used=8861646kB  allocated=8869044kB
SET join_collapse_limit = 20;
--- 85993.891 ms used=11677634kB  allocated=11679733kB
SET geqo = off;
SET join_collapse_limit = 21;
--- следующий скачок использования памяти и времени.

Оказалось, что на тесте Андреаса Фройнда, память и время выделялось скачкообразно. Следующий скачок, с 11Гб памяти, которая выделялась серверным процессом на время планирования, происходил после join_collapse_limit = 20. Нехватка памяти выглядит, как подвисание системы (из-за кэшей) и можно подумать, что якобы процессор сильно грузится.

Собственно отсюда и взялось число 20. Устанавливать его стали, вероятно, из предположения, что при отключенном GEQO систсема хотя бы не подвиснет и памяти хватит. То есть *_collapse_limit = 20 разумная рекомендация чисто, чтобы защититься от geqo = off.

Но пример Андреаса и Кевина для типичных бизнес-запросов. Интересен граничный случай, подсказанный Ноа Миш. Создадим запрос для join_colapse_limit со статистически неразличимыми столбами:

\timing on \\
SET geqo = on;
SET geqo_threshold = 16;
SET join_collapse_limit = 16;
EXPLAIN (analyze, memory, settings) 
with t as (select 1 a)
select 1 from t t0 natural join t t1 natural join t t2 natural join t
t3 natural join t t4 natural join t t5 natural join t t6 natural join t t7
natural join t t8 natural join t t9 natural join t t10 natural join t t11
natural join t t12 natural join t t13 natural join t t14;
Settings: geqo_threshold = '15', join_collapse_limit = '15' 
Planning: 
  Memory: used=235kB  allocated=256kB 
Planning Time: 33.668 ms 
Execution Time: 0.328 ms

Settings: geqo_threshold = '15', join_collapse_limit = '14' 
Planning: 
  Memory: used=5155822kB  allocated=5162241kB 
Planning Time: 18779.568 ms 
Execution Time: 0.410 ms

Settings: geqo_threshold = '15', join_collapse_limit = '13' 
Planning: 
  Memory: used=1680916kB  allocated=1688193kB 
Planning Time: 5986.123 ms 
Execution Time: 0.409 ms

Settings: geqo_threshold = '15', join_collapse_limit = '12' 
Planning: 
  Memory: used=546392kB  allocated=549153kB 
Planning Time: 1937.615 ms 
Execution Time: 0.395 ms

То есть худший случай, когда *_collapse_limit меньше geqo_threshold на единицу.
При geqo_threshold = '16', join_collapse_limit = '15' выделяется и используется 15Гб памяти, что довольно много.
Planning Time: 41241.285 ms Memory: used=15761345kB

Рекомендация *_collapse_limit = 20 разумна. Если не отключать GEQO и не менять geqo_threshold, то его даже можно увеличить и установить 30, 40. На это указывает второй график в статье Павла Толмачёва. Хорошие картинки также есть в статье.

Остался ещё один вопрос (кто убил мистера Нолестро): нужно ли ставить *_collapse_limit больше, чем geqo_threshold, который оставляют 12. Да, нужно. В 1С была проблема, когда в конец  запроса с большим числом соединений добавалялся "ANDt1.col1 IN ( VALUES(..". Проблема описана в статье Александра Симонова. Андрей Лепихов и Алёна Рыбакина создали патч (ревьюверы Иван Кушнаренко и Александр Коротков), который чрезвычайно быстро был закоммичен Томом Лейном. Эта проблема ушла, но *_collapse_limit установленные в значение, большее geqo_threshold, позволяют планировщику соединить условия из начала и конца списка соединений или предикатов. Генерирует ли 1С сейчас запросы, где это нужно я не знаю, но до патча на VALUES генерировал. Дает ли минусы установка *_collapse_limit в чуть меньшее значение, чем 20? По графику из статьи Павла Толмачева почти нет. Планы не улучшит (если только нет ошибок планировщика).

Я воспроизвёл на 18 версии тест Андреаса: