SQL Portal | Базы Данных
Присоединяйтесь к нашему каналу и погрузитесь в мир баз данных Связь: @devmangx РКН: https://clck.ru/3H4Wo3
Show more📈 Analytical overview of Telegram channel SQL Portal | Базы Данных
Channel SQL Portal | Базы Данных (@sqlportal) is an active participant. Currently, the community unites 14 184 subscribers, ranking 9 109 in the Technologies & Applications category and 47 074 in the Russia region.
📊 Audience metrics and dynamics
Since its creation on невідомо, the project has demonstrated rapid growth, gathering an audience of 14 184 subscribers.
According to the latest data from 04 June, 2026, the channel demonstrates stable activity. Although there has been a change in the number of participants by -133 over the last 30 days and by 3 over the last 24 hours, overall reach remains high.
- Verification status: Not verified
- Engagement rate (ER): The average audience engagement rate is 9.09%. Within the first 24 hours after publication, content typically collects 5.03% reactions from the total number of subscribers.
- Post reach: On average, each post receives 1 289 views. Within the first day, a publication typically gains 714 views.
- Reactions and interaction: The audience actively supports content: the average number of reactions per post is 5.
- Thematic interests: Content is focused on key topics such as строка, sql, индекс, postgres, колонка.
📝 Description and content policy
The author describes the resource as a platform for expressing subjective opinions:
“Присоединяйтесь к нашему каналу и погрузитесь в мир баз данных
Связь: @devmangx
РКН: https://clck.ru/3H4Wo3”
Thanks to the high frequency of updates (latest data received on 05 June, 2026), the channel maintains relevance and a high level of publication reach. Analytics show that the audience actively interacts with content, making it an important point of influence in the Technologies & Applications category.
npx skills add planetscale/database-skillsили в Cursor:
/add-plugin database-skillsМне нравится сама идея. Сейчас многие используют агентов как очень умный автокомплит. А вот заставить агента понимать, почему этот индекс плохой, почему VACUUM отстаёт или почему шардирование сломает запросы через полгода, уже гораздо интереснее. Open source. MIT License. GitHub доступен всем. 👉 @SQLPortal
CREATE ... ORA-01031: insufficient privilegesпри создании объектов? В Oracle AI Database 26ai достаточно выдать одну роль:
GRANT db_developer_role TO ...После этого пользователь сможет создавать все стандартные объекты базы данных. 👉 @SQLPortal
git checkout, git diff или git merge для базы данных, Dolt решает именно эту задачу.
Посмотреть проект можно здесь: https://github.com/dolthub/dolt
👉 @SQLPortalHaiku для массовых механических задач. Sonnet для исследований и анализа. Opus только там, где действительно требуется сложное рассуждение.До этого токены тратились без разбора на любые задачи. После настройки результат остался тем же, а расход снизился примерно вдвое. Схема состоит из трёх частей. 1. Блок делегирования задач Вы задаёте правило, по которому Claude создаёт субагентов и выбирает самую дешёвую подходящую модель: → Haiku: рутинные задачи без необходимости принимать решения → Sonnet: исследования, изучение кодовой базы, анализ и обобщение информации → Opus: только для реального планирования и сложных компромиссов Два важных ограничения: • Haiku никогда не создаёт собственных субагентов. Если это понадобилось, задача была плохо декомпозирована. • Максимальная глубина вложенности — два уровня (родитель → субагент → ещё один уровень). Если субагенту требуется более сильная модель, он возвращает задачу родителю, а не повышает уровень самостоятельно. 2. Блок предпочтительных инструментов Вы учите Claude сначала выбирать самые дешёвые инструменты: → WebFetch для публичных веб-страниц → agent-browser CLI для динамических страниц и сайтов с авторизацией (примерно на 82% меньше токенов по сравнению с инструментами на основе скриншотов) → Конвертация PDF в текст вместо использования инструмента Read Если Claude постоянно повторяет один и тот же шаблон действий, вы просите его оформить этот процесс как переиспользуемый инструмент. 3. Две строки в settings.json
"CLAUDE_CODE_DISABLE_1M_CONTEXT": "1"Не позволяет загружать огромные контекстные окна, которые часто не нужны.
"CLAUDE_AUTOCOMPACT_PCT_OVERRIDE": "80"Запускает автоматическое сжатие контекста при заполнении на 80%, а не после полного заполнения. Только эти две настройки экономят токены в каждой сессии. Вся настройка занимает около двух минут. А экономия начинает накапливаться с каждой следующей задачей. 👉 @SQLPortal
UPDATE <target_tab>
SET <target_col> = <source_col>
FROM <source_tab>
WHERE <join_condition>
Такие JOIN-соединения также можно использовать в операторах DELETE.
👉 @SQLPortalpsql выполняется запрос и вы нажимаете Ctrl+C, клиент отправляет серверу запрос на отмену выполнения. Но как это работает?
Сервер не может использовать уже существующее соединение, потому что оно занято обработкой текущего запроса. Поэтому Postgres использует второе, временное соединение, которое работает по принципу «отправил и забыл», аналогично SIGINT. Этот механизм намеренно сделан максимально простым, потому что отмена должна срабатывать даже тогда, когда всё остальное зависло.
Все драйверы, клиенты и инструменты, поддерживающие отмену запросов, используют один и тот же механизм.
PID, секретный ключ и код запроса на отмену
Во время инициализации соединения, после завершения аутентификации, сервер отправляет сообщение BackendKeyData, содержащее:
pid — идентификатор процесса (PID) backend-процесса, обслуживающего ваше соединение;
secret — случайное 32-битное целое число, генерируемое при запуске сессии.
Согласованный код запроса на отмену — фиксированное значение: 0x04d2162e, или PG_PROTOCOL(1234,5678) в исходном коде Postgres.
Чтобы отменить запрос, клиент открывает новое соединение с портом Postgres и отправляет сообщение CancelRequest, содержащее PID, секретный ключ и код запроса на отмену.
Что делает сервер?
- Распознаёт сообщение как CancelRequest, а не как стартовое сообщение (StartupMessage);
- Находит backend-процесс с указанным PID;
- Проверяет совпадение секретного ключа;
- Отправляет сигнал SIGINT этому backend-процессу;
- Закрывает соединение для отмены, не отправляя никакого ответа.
- Backend-процесс получает SIGINT, что запускает механизм обработки прерываний в Postgres. После этого в
исходное соединение возвращается ошибка:
ErrorResponse: ERROR: canceling statement due to user request ReadyForQueryЧто именно происходит внутри Postgres после получения запросом сигнала
SIGINT — тема уже не для выходного чтения. Об этом поговорим в одном из постов на след недели.
👉 @SQLPortal• уверенную работу в Linux и терминале • Git и контроль версий в реальных проектах • Docker и контейнеризацию приложений • Kubernetes и оркестрацию контейнеров • основы сетей, безопасности и хранения данных • автоматизацию задач и диагностику инфраструктуры ... и многому другомуВсе знания закрепляются на практике с помощью заданий с автопроверкой. Материал подаётся понятным языком, шаг за шагом, с большим количеством примеров, схем и демонстраций. После прохождения вы получите сертификат, который можно добавить в резюме. Отдельно курсы стоят 16 600 ₽, но в составе программы доступны всего за 7 990 ₽: открыть на Stepik
JOIN, JSON, индексы и создание таблиц
✓ Всё объясняется постепенно и на практических примерах
https://databaseschool.com/series/intro-to-postgres/videos/203
👉 @SQLPortalcalls в pg_stat_statements без соответствующего роста трафика
• всплеск запросов, привязанный к загрузке конкретной страницы
• пользователи жалуются, что страница «сломалась» или «грузится вечность»
Решение: состояния загрузки с отключением кнопок, optimistic UI, асинхронная генерация отчётов или хотя бы обычный spinner, который показывает, что приложение работает. Ни одна база не выдержит фронтенд, позволяющий пользователям DDOS’ить её вручную.
N+1 запросы из ORM
Вы загружаете список из 100 заказов. ORM затем выполняет ещё 100 отдельных запросов, чтобы получить клиента для каждого заказа. Потом дашборд показывает общее число заказов для каждого клиента — и это ещё 100 запросов. В итоге вместо одного запроса страница делает 201.
Каждый запрос занимает 2 мс. Но 201 × 2 мс = 404 мс последовательных round-trip’ов к БД на каждый запрос страницы. При 500 запросах в минуту одна страница генерирует тысячи лишних запросов в минуту, которых вообще не должно существовать.
Решение: свести всё к одному запросу через JOIN и агрегации. Некоторые ORM умеют это автоматически, в других придётся писать SQL вручную.
Агрессивный polling чаще, чем меняются данные
Разработчик добавляет setInterval(() => fetchStatus(), 1000) для проверки статуса заказа. Код уезжает в production. 50 000 активных сессий, опрашивающих сервер раз в секунду = 50 000 запросов в секунду к таблице, которая обновляется всего раз в минуту.
Решение: WebSocket, Server-Sent Events или хотя бы существенно увеличить интервал polling’а.
Запрос медленный только для нового сценария использования
Отчётный запрос выполняется 800 мс. Финансовый отдел запускает его один раз в день в 9 утра. Потом кто-то добавляет этот запрос в widget на дашборде с автообновлением каждые 30 секунд. Теперь каждый пользователь с открытым дашбордом запускает запрос на 800 мс по 120 раз в час.
Сам запрос медленнее не стал. Изменился паттерн доступа.
Решение: кешировать отчёт через materialized view, вынести его в background job или убрать auto-refresh.
Иногда проблема — в дизайне системы, а не в БД
Не раз бывало так, что запись экрана пользователя с воспроизведением ошибки помогала понять проблему быстрее, чем любые логи.
👉 @SQLPortalanalyze.c в исходном коде PostgreSQL. Число 300 — это жёстко заданное значение в коде ANALYZE. Его происхождение связано с научной работой "Random Sampling for Histogram Construction: How Much Is Enough?", опубликованной в 1998 году, когда объёмы данных были значительно меньше, а оборудование — намного медленнее.
В статье рассматривался вопрос:
сколько строк нужно выбрать в выборку, чтобы построить статистику, достаточно точную для оптимизации запросов к неиндексированным данным?Ответ оказался примерно таким: около 300 выборок на каждый бакет (bin) гистограммы равной высоты (equi-height histogram). Почему именно столько? Статья показывает, что необходимый объём выборки растёт линейно с количеством бакетов, но лишь логарифмически с размером таблицы в большинстве практических случаев. Поэтому после нескольких сотен выборок на бакет отдача от увеличения выборки становится всё меньше. Например, значение
statistics_target по умолчанию равно 100.
Это означает, что PostgreSQL стремится собрать выборку размером:
300 × 100 = 30 000 значенийчтобы: - построить гистограмму равной высоты из 100 бакетов; - сохранить 100 наиболее часто встречающихся значений (Most Common Values, MCV). Зачем столько усилий ради неиндексированных данных? Потому что в 1998 году индексы были значительно дороже, чем сегодня: - занимали ценное дисковое пространство; - потребляли ограниченные IOPS при записи и построении; - были дорогими в сопровождении; - полные сканирования таблиц выполнялись медленно и блокировали работу. В то время производительность дисков измерялась в RPM (оборотах в минуту). Говорить об IOPS было сложнее, поскольку случайный доступ к данным требовал ожидания поворота диска до нужного сектора, а физическое расположение данных заранее было неизвестно. Тесты из статьи выполнялись на системе со следующими характеристиками: - процессор Pentium 200 МГц; - 64 МБ оперативной памяти; - SCSI-диск 7200 RPM. Пользователи PostgreSQL продолжают получать выгоду от этой работы даже сегодня. Да, индексы по-прежнему не бесплатны, и их может быть слишком много, но их стоимость уже далеко не такая, как в конце 90-х. Аналогично и работа с неиндексированными данными стала намного менее затратной. Компромисс между точностью и производительностью Авторы статьи также отмечают, что задача является:
«доказуемо сложной, поскольку существует предел достижимой точности оценки в худшем случае».Поэтому:
«мы разработали простой метод оценки, который, по нашему мнению, является оптимальным».Число 300 представляет собой компромисс между точностью и скоростью работы: - меньшее значение дало бы менее точную статистику и могло привести к ошибочным решениям планировщика запросов; - большее значение улучшило бы точность, но замедлило бы работу
ANALYZE.
А в те времена ANALYZE и без того работал значительно медленнее.
Что контролирует statistics_target?
Параметр statistics_target определяет количество значений, сохраняемых для:
- Most Common Values (MCV);
- Equi-height Histogram.
Например:
statistics_target = 100 → 30 000 выборок, 100 MCV, 100 бакетов statistics_target = 500 → 150 000 выборок, 500 MCV, 500 бакетов statistics_target = 1000 → 300 000 выборок, 1000 MCV, 1000 бакетовПо умолчанию этот параметр задаётся на уровне базы данных, но его можно переопределить для отдельного столбца:
-- Настройка для конкретного столбца
ALTER TABLE requests
ALTER COLUMN status_code
SET STATISTICS 500;
ANALYZE requests;
Для крупных баз данных обычно находится хотя бы один столбец, для которого имеет смысл увеличить значение статистики локально. Не стоит повышать глобальное значение по умолчанию только из-за одного столбца, которому требуется более детальная статистика.
Сегодня влияние настроек статистики меньше, чем раньше, но для отдельных столбцов они всё ещё могут улучшить планы запросов.
👉 @SQLPortal
Available now! Telegram Research 2025 — the year's key insights 
