SQL Portal | Базы Данных
Присоединяйтесь к нашему каналу и погрузитесь в мир баз данных Связь: @devmangx РКН: https://clck.ru/3H4Wo3
Показати більше📈 Аналітичний огляд Telegram-каналу SQL Portal | Базы Данных
Канал SQL Portal | Базы Данных (@sqlportal) є активним учасником. На даний момент спільнота об'єднує 14 070 підписників, посідаючи 9 112 місце в категорії Технології та додатки та 47 075 місце у регіоні Росія.
📊 Показники аудиторії та динаміка
З моменту свого створення невідомо, проект продемонстрував стрімке зростання, зібравши аудиторію у 14 070 підписників.
За останніми даними від 30 червня, 2026, канал демонструє стабільну активність. Хоча за останні 30 днів спостерігається зміна кількості учасників на -121, а за останні 24 години на -4, загальне охоплення залишається високим.
- Статус верифікації: Не верифікований
- Рівень залученості (ER): Середній показник залученості аудиторії становить 8.69%. Протягом перших 24 годин після публікації контент зазвичай збирає 4.95% реакцій від загальної кількості підписників.
- Охоплення публікацій: В середньому кожен допис отримує 1 223 переглядів. Протягом першої доби публікація в середньому набирає 696 переглядів.
- Реакції та взаємодія: Аудиторія активно підтримує контент: середня кількість реакцій на один пост – 4.
- Тематичні інтереси: Контент зосереджений навколо ключових тем, таких як строка, sql, индекс, postgres, колонка.
📝 Опис та контентна політика
Автор описує ресурс як майданчик для висловлення суб'єктивної думки:
“Присоединяйтесь к нашему каналу и погрузитесь в мир баз данных
Связь: @devmangx
РКН: https://clck.ru/3H4Wo3”
Завдяки високій частоті оновлень (останні дані отримано 01 липня, 2026), канал підтримує актуальність та високий рівень охоплення публікацій. Аналітика показує, що аудиторія активно взаємодіє з контентом, що робить його важливою точкою впливу в категорії Технології та додатки.
NOT NULL, CHECK, диапазонов значений и других правил будут перенесены в JSON Schema. Это позволяет приложениям выполнять валидацию ещё до отправки данных в базу.
При использовании NOPRECHECK ограничения не включаются в схему, а проверка и определение допустимых значений остаются на стороне базы данных.
Функция доступна в Oracle AI Database 26ai и помогает синхронизировать правила валидации между БД и приложением.
👉 @SQLPortalJOIN TO ONE
WAIT/NOWAIT для DML-операций
вложенные WITH-выражения (Nested WITH)
https://www.oracle.com/database/free/get-started/
👉 @SQLPortalWITH, позволяют создавать именованные подзапросы:
WITH cte AS (
SELECT ...
)
SELECT *
FROM cte;
CTE помогают упростить сложные SQL-запросы и сделать их более читаемыми.
Вместо вложенных подзапросов на несколько уровней можно разбить логику на отдельные именованные блоки и затем использовать их как обычные таблицы в основном запросе.
Преимущества:
→ улучшают читаемость сложных запросов
→ позволяют повторно использовать промежуточные результаты
→ упрощают отладку и поддержку SQL-кода
→ поддерживают рекурсивные запросы через WITH RECURSIVE
Baraa Khatib Salkini наглядно показывает, как работают CTE и почему они делают сложные SQL-запросы гораздо понятнее.
👉 @SQLPortalshared_buffers, WAL, репликам чтения и агрессивности autovacuum.
Чтение и запись — не одно и то же
Чтение получает страницу размером 8 КБ из shared_buffers или кэша ОС.
Если страница уже закэширована, стоимость операции почти нулевая.
Если её приходится читать с диска — это одно физическое чтение.
С записью всё сложнее:
• Изменение сначала записывается в WAL, и только после этого транзакция может быть подтверждена
• При первой записи после checkpoint'а может потребоваться запись всей страницы в WAL (full page write)
• Обновляются все связанные индексы
• Может выполняться запись в TOAST-таблицы и TOAST-индексы
• Страница данных должна находиться в памяти, поэтому запись часто включает дополнительное чтение
Из-за этого одна операция записи по стоимости ввода-вывода обычно заметно дороже одной операции чтения.
Настройки для read-heavy нагрузок
• shared_buffers и effective_cache_size — чем больше горячих данных помещается в памяти, тем меньше обращений к диску
• Индексы на колонках из WHERE, JOIN и ORDER BY — выигрыш от ускорения чтения обычно перекрывает накладные расходы на обновление индексов
• Read replicas — позволяют распределить нагрузку от SELECT-запросов без воздействия на primary-узел
• EXPLAIN ANALYZE — помогает находить медленные запросы и заменять последовательное сканирование (Seq Scan) на индексное (Index Scan) там, где это оправдано
Настройки для write-heavy нагрузок
• Быстрые накопители (NVMe SSD, высокий IOPS) — записи нельзя обслуживать только за счёт кэша
• Меньше индексов — каждый индекс приходится обновлять при записи; неиспользуемые индексы лучше удалять
• HOT Updates и fillfactor — Postgres может обновлять строку без изменения индексов, если индексируемые поля не меняются и на странице есть свободное место
• Настройка WAL — wal_buffers уменьшает частоту сбросов WAL, а checkpoint_timeout и checkpoint_completion_target помогают сглаживать пики нагрузки во время checkpoint'ов
• Более крупный shared_buffers — грязные страницы должны находиться в памяти до их записи на диск, поэтому дополнительная память может улучшить производительность систем с интенсивной записью.
👉 @SQLPortalt1 JOIN t2 USING (c1)
Но здесь есть неприятная ловушка
Такой запрос:
t1
JOIN t2 USING (c1)
JOIN t3 USING (c2)
будет работать, если c2 есть только в t2 и t3.
Проблемы начинаются позже.
Если в будущем кто-то добавит колонку c2 в t1, запрос внезапно перестанет работать или начнёт вести себя не так, как ожидалось.
Причина в том, что USING опирается на имена колонок, а не на явные ссылки на таблицы. Изменение схемы может неожиданно повлиять на уже существующие JOIN'ы.
Именно поэтому многие разработчики предпочитают более явный вариант:
t1
JOIN t2 ON t1.c1 = t2.c1
JOIN t3 ON t2.c2 = t3.c2
Кода чуть больше, зато зависимость от структуры таблиц становится очевидной и предсказуемой.
Лукас Эдер показывает этот кейс на простом примере и напоминает, что некоторые удобные сокращения в SQL могут обернуться проблемами спустя месяцы или годы.
https://blog.jooq.org/why-join-using-can-lead-to-errors-in-sql/
👉 @SQLPortalSELECT
user_id,
count(*) AS total_events
FROM events
GROUP BY user_id
ORDER BY total_events DESC
LIMIT 10;
Предположим, что индексов нет, таблица events содержит 1 000 000 строк и 10 000 уникальных user_id. Такой запрос выполняет большой объём работы. В любом случае ему придётся прочитать каждую строку таблицы.
Параллельный конвейер Postgres
Postgres разделил таблицу на три части, выполнил агрегацию параллельно и затем объединил результаты.
[см. изображение с выводом EXPLAIN ANALYZE]
loops=3 для Seq Scan
Workers Launched: 2 (лидирующий процесс + 2 воркера = всего 3 процесса)
Partial HashAggregate выполняется в каждом воркере
результаты объединяются через Finalize HashAggregate в лидирующем процессе
Несмотря на высокую скорость выполнения, это не лучший вариант для OLTP-базы данных.
При высокой конкурентной нагрузке пул воркеров становится узким местом. Запрос может работать быстро, пока ресурсов хватает, но заметно замедляться при конкуренции за CPU. Запросы с нестабильным временем выполнения — хорошие кандидаты для оптимизации.
Параллельные воркеры не заменяют здоровую архитектуру базы данных:
Добавляйте индексы, чтобы избежать полного сканирования таблиц и дорогостоящих сортировок.
Используйте summary-таблицы или materialized view, чтобы не выполнять тяжёлые агрегации на больших объёмах данных.
Разбивайте time-series таблицы на партиции, чтобы уменьшить объём данных, который приходится сканировать в типовых запросах.
👉 @SQLPortalCREATE FUNCTION ... MLE LANGUAGE JAVASCRIPT ... CREATE MLE MODULE ... LANGUAGE JAVASCRIPT ...Это позволяет публиковать JavaScript-код, который затем можно вызывать напрямую из SQL. #JavaScript #OracleDatabase #SQL #MLE 👉 @SQLPortal
IF условие
выполнить действие
ELSE
выполнить другое действие
Например, проверить, сдал студент экзамен или нет:
IF @Score >= 50
PRINT 'You passed!';
ELSE
PRINT 'You failed.';
Точно так же можно проверять:
право голоса по возрасту;
наличие товара на складе;
скидки для клиентов;
права администратора;
любые бизнес-правила.
Теперь стало понятно, что IF ELSE — это основной способ управлять логикой внутри процедуры.
2. Обработка ошибок
Рано или поздно что-то ломается:
деление на ноль;
дубликаты данных;
обновление несуществующих записей;
ошибки во время денежных переводов.
Для таких случаев в SQL Server есть:
BEGIN TRY
-- основной код
END TRY
BEGIN CATCH
-- обработка ошибки
END CATCH
Пример:
BEGIN TRY
SELECT @Number1 / @Number2;
END TRY
BEGIN CATCH
PRINT 'Division by zero.';
END CATCH
Полезная штука:
ERROR_MESSAGE()Позволяет получить текст реальной ошибки:
PRINT ERROR_MESSAGE();Ещё посмотрел на транзакции. Идея простая:
либо выполняются все операции, либо не выполняется ни одна.Для денежных переводов это критично. Если одна из операций упала:
ROLLBACK TRANSACTION;
База откатит изменения и не останется в промежуточном состоянии.
3. Стиль написания Stored Procedures
SQL быстро превращается в кашу, если писать как попало.
Плохой вариант:
create procedure getstudents as begin select * from students end
Нормальный вариант:
CREATE PROCEDURE GetStudents
AS
BEGIN
SELECT *
FROM Students;
END;
Что стоит соблюдать:
понятные названия процедур;
понятные названия параметров;
SQL-ключевые слова в верхнем регистре;
отступы;
комментарии только там, где они реально нужны;
аккуратная структура кода.
Ещё узнал про:
SET NOCOUNT ON;
Эта команда отключает лишние сообщения вида:
(1 row affected)Мелочь, но в рабочих процедурах её почти всегда добавляют. Маленькая тема, но без неё сложно писать серьёзные процедуры и автоматизировать работу с данными. 👉 @SQLPortal
PARTITION BY LIST (
REGEXP_SUBSTR(email_address, '[^.]+$')
)
То есть .com, .org, .net и другие TLD будут попадать в свои партиции без создания отдельного вычисляемого столбца.
Небольшая фича, которая убирает лишний слой костылей в схемах БД.
Демонстрация от Dani Schnider -https://danischnider.wordpress.com/2026/05/22/partition-by-expression/
👉 @SQLPortalROW_NUMBER() — уникальный порядковый номер для каждой строки
DENSE_RANK() — одинаковый ранг для одинаковых значений, без пропусков в нумерации
RANK() — одинаковый ранг для одинаковых значений, после совпадений появляются пропуски
Пример:
score ----- 100 100 90 80
ROW_NUMBER()
1 2 3 4
DENSE_RANK()
1 1 2 3
RANK()
1 1 3 4Джесс Рамос показывает разницу между этими функциями на практике и разбирает типичные сценарии их использования. 👉 @SQLPortal
ON CONFLICT DO SELECT.
Теперь можно попытаться вставить запись, а если она уже есть — сразу получить существующую.
Похоже, атомарный get-or-create наконец добрался до PostgreSQL.
#PostgreSQL #SQL
👉 @SQLPortal
Вже доступно! Дослідження Telegram за 2025 — головні інсайти року 
