14500
Присоединяйтесь к нашему каналу и погрузитесь в мир баз данных Связь: @devmangx РКН: https://clck.ru/3H4Wo3
Общие табличные выражения (Common Table Expressions, CTE), известные по ключевому слову WITH, позволяют создавать именованные подзапросы:
WITH cte AS (
SELECT ...
)
SELECT *
FROM cte;
WITH RECURSIVE
DBeaver уже 15 лет остаётся де-факто стандартом среди SQL-клиентов.
Инструмент мощный, но это ещё и тяжёлый Java-монолит, который может запускаться по 20 секунд.
Кто-то решил переписать его с нуля на Rust и добавить возможности, которых в DBeaver никогда не было.
Проект называется Tabularis. 2.5 тыс. звёзд. Лицензия Apache 2.0. Последняя активность — 17 часов назад.
Самое интересное:
Tabularis создал один разработчик — Debba — как эксперимент по AI-assisted разработке.
Цель была простой: проверить, насколько далеко AI-агенты способны зайти при создании реального продукта.
В итоге получилось 55 релизов, 1192 коммита и SQL-клиент, который уже конкурирует с продуктами компаний, где над подобными инструментами работают десятки инженеров.
Что есть в Tabularis, а в DBeaver нет:
✅ Встроенный MCP-сервер — Claude, Cursor и Windsurf могут читать схему БД и выполнять запросы прямо из чата
✅ SQL Notebooks с графиками внутри ячеек и общими переменными между ними
✅ Визуальный EXPLAIN с AI-анализом плана выполнения
✅ Визуальный конструктор запросов с drag-and-drop JOIN'ами
✅ Автоматическая генерация ER-диаграмм
✅ Поддержка PostgreSQL, MySQL/MariaDB, SQLite и ClickHouse через плагины
✅ Редактор на базе Monaco с интеллектуальным автодополнением
✅ Без телеметрии, аккаунтов и подписок
Чего пока нет в Tabularis, но есть в DBeaver:
❌ SQL Server
❌ Oracle
Если работаешь с ними, DBeaver пока остаётся более очевидным выбором.
Во всех остальных случаях Tabularis запускается примерно за 2 секунды, занимает меньше ресурсов и позволяет AI-агентам работать с базой напрямую.
https://github.com/TabularisDB/tabularis
👉 @SQLPortal
Написать медленный запрос в Postgres сегодня гораздо сложнее, чем раньше. Запрос может содержать полное сканирование таблицы, крупную сортировку или дорогую агрегацию, но всё равно выполняться быстро. Современный Postgres просто подключает параллельных воркеров.
Параллелизм скрывает стоимость тяжёлых запросов, но не устраняет её. Индексы и механизмы кэширования уменьшают объём работы, который нужно выполнить.
Параллельное выполнение всё равно делает тот же объём работы — оно лишь распределяет его между несколькими процессорами. Воркеры позволяют задействовать больше CPU, но не сокращают количество операций. Если запрос выполняет полное сканирование таблицы, он всё равно прочитает всю таблицу. Просто сделает это быстрее за счёт дополнительных CPU.
На первый взгляд безобидный запрос:
SELECT
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. Такой запрос выполняет большой объём работы. В любом случае ему придётся прочитать каждую строку таблицы.loops=3 для Seq ScanWorkers Launched: 2 (лидирующий процесс + 2 воркера = всего 3 процесса)Partial HashAggregate выполняется в каждом воркереFinalize HashAggregate в лидирующем процессе
Сегодня на практике разбирался с обработкой ошибок в SQL.
Что сделал:
→ Написал хранимую процедуру для добавления заказов в базу данных Sales
→ Обернул её в блок TRY/CATCH
→ При ошибке сохраняются точные значения ERROR_MESSAGE() и ERROR_NUMBER()
→ Никаких тихих падений и гаданий. База данных сама сообщает, что пошло не так.
Почему это важно:
→ Пайплайны ломаются
→ Данные бывают грязными
→ Ошибки неизбежны
Пайплайн без обработки ошибок — это пайплайн, которому нельзя доверять.
В этом и разница между SQL-кодом, который работает на твоём ноутбуке, и SQL-кодом, который выдерживает продакшен.
#DataEngineering #BuildInPublic #SQL
👉 @SQLPortal
В Postgres 18 появилась поддержка аутентификации пользователей через OAUTH 2.0
👉 @SQLPortal
Внутренняя архитектура PostgreSQL
1. Архитектура на основе процессов
PostgreSQL использует архитектуру «один процесс на соединение», то есть для каждого клиента создаётся отдельный процесс операционной системы.
2. Журнал предзаписи
PostgreSQL применяет WAL для обеспечения надёжности данных, согласованности, восстановления после сбоев и репликации
3. Многоверсионность и управление параллелизмом
Благодаря MVCC PostgreSQL позволяет выполнять параллельные транзакции без необходимости жёсткой блокировки данных
4. Конвейер выполнения запросов
Запросы в PostgreSQL проходят через чёткую последовательность этапов: разбор, планирование, исполнение и возврат результатов
5. Система индексации
PostgreSQL поддерживает множество типов индексов (B-Tree, GIN, GiST, BRIN и др.) для оптимизации запросов под разные типы данных
6. Партиционирование таблиц
PostgreSQL позволяет разбивать большие таблицы на более мелкие части (партиции) по диапазону значений, списку или хешу, что упрощает управление и ускоряет обработку.
7. Логическая декодировка
Позволяет транслировать изменения из WAL в логическом формате, что полезно для репликации и систем отслеживания изменений (CDC).
8. Расширения
PostgreSQL построен как модульная система и поддерживает расширения, которые позволяют добавлять новые функции и возможности.
9. Сбор статистики
Механизм сбора статистики PostgreSQL отслеживает активность в реальном времени, что помогает анализировать и оптимизировать производительность базы данных
Ты обожаешь Postgres и SQL, но начальству нужны отчёты в Excel? К счастью, в Postgres есть простой способ выгрузить данные из SQL-запроса сразу в CSV.
Экспортировать CSV-файл для любого SQL-запроса можно так:
psql --csv -c 'select * from orders'
--csv выводит данные в формате CSV прямо в stdout>, чтобы направить вывод в файл на локальной системе\copy, но для простого экспорта результатов запроса — это быстрое и удобное решение.
Появилась новая игра для изучения SQL — SQL Protocol.
Она сделана в стиле «Матрицы». Внутри надо играть за агента, идти по сюжету и решать множество SQL-задач от простых к сложным. Также есть PvP Arena 🤑
👉 @SQLPortal
Превратите PostgreSQL в тайм-серверную СУБД с помощью одного расширения
В стандартном PostgreSQL все строки хранятся в одной таблице. По мере роста тайм-серверных данных до миллионов записей запросы не могут пропускать нерелевантные данные, поэтому даже запросы по свежим данным сканируют гораздо больше, чем нужно.
TimescaleDB решает это через гипертаблицы, которые автоматически разбивают данные на временные чанки.
Запросы затрагивают только нужные чанки, остальная часть данных не участвует в чтении.
Другие возможности:
• уменьшение объёма хранения до 95% за счёт колоночного сжатия с полной поддержкой запросов
• ускорение запросов через непрерывные агрегаты, которые обновляются только новыми данными
• встроенные политики хранения для автоматического удаления старых данных
Плюс TimescaleDB — это open source. Достаточно установить расширение и продолжать использовать PostgreSQL.
Ссылка: https://tsdb.co/ktran-x
👉 @SQLPortal
Нашёл удобный сервис для быстрого запуска SQL-запросов онлайн — RunSQL
> Мгновенно пишешь и выполняешь SQL без установки ПО
> Поддержка PostgreSQL
> Можно быстро делиться своими запросами через ссылку
> Подходит для тестов, демонстраций и обучения
Просто открыл сайт — и сразу работаешь с базой. Минимализм и скорость
👉 @SQLPortal
13 типов баз данных :
1. Реляционные
↳ хранят структурированные данные в таблицах с фиксированной схемой и доступом через SQL-запросы.
2. Ключ-значение
↳ хранят простые пары ключ–значение для сверхбыстрого поиска и кэширования.
3. Колонночные
↳ хранят данные по колонкам вместо строк для оптимизации аналитических запросов.
4. Wide-column (ширококолонночные)
↳ используют семейства колонок для гибкого хранения в распределённых системах большого масштаба.
5. Документные
↳ хранят данные как JSON-подобные документы с вложенной и гибкой структурой.
6. Векторные
↳ хранят эмбеддинги для поиска похожих объектов и задач ИИ-извлечения.
7. Временных рядов
↳ хранят данные с метками времени для метрик, логов и событий.
8. Неизменяемые реестры
↳ фиксируют записи без возможности изменения или удаления для защиты от подмены данных.
9. Графовые
↳ хранят связи между сущностями и оптимизируют запросы по отношениям.
10. Геопространственные
↳ работают с координатами и геоданными для карт и пространственных запросов.
11. В памяти
↳ держат данные в ОЗУ для минимальной задержки доступа.
12. BLOB-хранилища
↳ предназначены для больших бинарных объектов: изображения, видео, файлы.
13. Полнотекстовый поиск
↳ индексируют текст для быстрого поиска по содержимому.
👉 @SQLPortal
Совет по продуктивной работе с Postgres: шаблонные базы данных
Многие разработчики используют шаблонные базы данных для настройки дев-окружений. Суть подхода в следующем: вы запускаете один экземпляр Postgres для разработки и при необходимости создаёте/удаляете базы данных. При этом база данных для разработки создаётся на основе шаблона, который синхронизирован со схемой продакшена.
Для распределённых команд, использующих облачные решения, шаблонная база — это экономичный и безопасный способ работы.
Преимущества использования шаблонной базы данных для разработки:
● Упрощает работу с расширениями, конфигурацией Postgres, управлением версиями и установкой зависимостей — всё, что обычно замедляет локальную разработку
● Обеспечивает соответствие схемы продакшену, так как шаблон можно быстро создать из полной копии базы без данных
● Сокращает время на развёртывание и удаление дев-машин
● Позволяет использовать анонимизированные тестовые данные, подходящие для разработки
Подробнее о шаблонных базах данных
➡️ Создайте шаблон на основе продакшена, выгрузив только схему и расширения:
pg_dump -U my_user -h my_host -p 5432 -d my_database --exclude-table-data --no-owner --no-privileges > template.sql
--exclude-table-data исключает данные, но сохраняет полную схему и все расширения.-- создаём базу
CREATE DATABASE my_template_db OWNER postgres;
-- восстанавливаем из дампа
psql -U my_user -h my_host -p 5432 -d my_template_db -f template.sql
ALTER DATABASE my_template_db IS_TEMPLATE TRUE;
CREATE DATABASE new_db WITH TEMPLATE my_template_db OWNER my_user;
my_template_db под именем new_db
В копилку тренажёров: sqltutor.ru
Годный онлайн-тренажёр для запросов. Простой интерфейс, полностью на русском, все задачи бесплатные, есть теоретические разделы, регистрация по желанию
👉 @SQLPortal
JSON и JSONB удобны, когда нужно просто складывать схемно-нефиксированные данные, но иногда требуется добавить контроль структуры.
Можно использовать расширение pg_jsonschema, чтобы задать схему и валидировать содержимое. Это даёт больше контроля над форматом данных в таких колонках.
👉 @SQLPortal
Каждая база данных Postgres имеет свой профиль нагрузки: одни в основном читают данные, другие — постоянно их записывают. Понимание этого помогает принимать решения по индексам, настройке shared_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 — грязные страницы должны находиться в памяти до их записи на диск, поэтому дополнительная память может улучшить производительность систем с интенсивной записью.
👉 @SQLPortal
В SQL можно объединять таблицы по одинаковым именам колонок через:
t1 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
В Oracle AI Database 26ai теперь можно определять функции и модули на JavaScript прямо в базе данных.
CREATE FUNCTION ... MLE LANGUAGE JAVASCRIPT ...
CREATE MLE MODULE ... LANGUAGE JAVASCRIPT ...
Большинство SQL-разработчиков умеют писать запросы.
Но лишь немногие понимают, что происходит автоматически после изменения данных.
Если хочешь разобраться в SQL-триггерах, изучи следующие темы:
1. BEFORE Triggers — триггеры, выполняющиеся до изменения данных.
2. AFTER Triggers — триггеры, выполняющиеся после изменения данных.
3. INSTEAD OF Triggers — триггеры, которые заменяют выполнение операции.
4. Row-Level Triggers — триггеры, срабатывающие для каждой строки.
5. Statement-Level Triggers — триггеры, срабатывающие один раз на SQL-оператор.
6. Audit Logging — аудит и журналирование изменений.
7. Data Validation — проверка данных.
8. Soft Deletes — логическое удаление записей.
9. Business Rule Enforcement — обеспечение соблюдения бизнес-правил.
10. Trigger Performance — производительность триггеров.
11. Nested Triggers — вложенные триггеры.
12. Best Practices для Production — практики использования триггеров в боевых системах.
Освоив эти темы, ты поймёшь, как корпоративные базы данных автоматизируют бизнес-логику в крупных системах.
👉 @SQLPortal
Использование привязанных переменных — ключ к быстрой работе приложений
Пишите SQL вот так:
'SELECT ... WHERE col = ' || var
'SELECT ... WHERE col = :bind'
Это визуальная шпаргалка по SQL-командам, оформленная в виде рисунков с фруктами и человечками. Она охватывает основные конструкции SQL на примере таблицы fruits
По моему одна из лучших, что есть 🐸
👉 @SQLPortal
JOIN против UNION в Postgres:
JOIN нужен для объединения столбцов ➡️
UNION нужен для объединения строк ⬇️
✤ JOIN объединяет столбцы из двух и более таблиц по связанному полю. Это как добавлять данные по горизонтали. Используй JOIN, когда нужно посмотреть данные из разных таблиц рядом. Пример:
SELECT employees.name, departments.location
FROM employees
JOIN departments
ON employees.dept_id = departments.id;
SELECT city
FROM customers
UNION
SELECT city;
Лёгковесный настольный клиент с открытым исходным кодом, который позволяет подключаться к разным базам данных через единый инструмент: MySQL, PostgreSQL, SQLite, Redis, MongoDB, ClickHouse и другие. Не нужно ставить отдельные клиенты под каждую СУБД.
DBX собран на Tauri 2 + Vue.js 3 + Rust, размер установщика около 15 МБ, без бандла Chromium.
Поддерживает подключение к десяткам баз данных, включая OceanBase и openGauss. SQL-редактор содержит AI-ассистента для генерации и оптимизации запросов на естественном языке; таблицы поддерживают inline-редактирование, сортировку и поиск; для Redis и MongoDB есть отдельные браузеры.
https://github.com/t8y2/dbx
👉 @SQLPortal
В Oracle SQL можно проверить, получится ли привести выражение к нужному типу данных, с помощью функции
VALIDATE_CONVERSION ( <expr> AS <datatype>, <fmt> )
Роадмэп по SQL
SQL MASTER TREE
│
├── 1. Database Fundamentals
│ ├── What is DB / DBMS / RDBMS
│ ├── Tables, Rows, Columns
│ ├── Primary Key
│ ├── Foreign Key
│ ├── Candidate Key
│ ├── Composite Key
│ ├── Constraints
│ │ ├── NOT NULL
│ │ ├── UNIQUE
│ │ ├── PRIMARY KEY
│ │ ├── FOREIGN KEY
│ │ ├── CHECK
│ │ └── DEFAULT
│ └── Data Integrity
│
├── 2. SQL Data Types
│ ├── Numeric
│ │ ├── INT
│ │ ├── BIGINT
│ │ ├── DECIMAL
│ │ └── FLOAT
│ ├── String
│ │ ├── CHAR
│ │ ├── VARCHAR
│ │ └── TEXT
│ ├── Date & Time
│ │ ├── DATE
│ │ ├── TIME
│ │ ├── DATETIME
│ │ └── TIMESTAMP
│ └── Boolean / Binary
│
├── 3. DDL (Data Definition Language)
│ ├── CREATE
│ │ ├── DATABASE
│ │ ├── TABLE
│ │ └── INDEX
│ ├── ALTER
│ │ ├── ADD COLUMN
│ │ ├── MODIFY COLUMN
│ │ └── DROP COLUMN
│ ├── DROP
│ │ ├── DATABASE
│ │ └── TABLE
│ └── TRUNCATE
│
├── 4. DML (Data Manipulation Language)
│ ├── INSERT
│ ├── UPDATE
│ ├── DELETE
│ └── MERGE / UPSERT
│
├── 5. DQL (Data Query Language)
│ ├── SELECT
│ ├── DISTINCT
│ ├── WHERE
│ │ ├── AND
│ │ ├── OR
│ │ └── NOT
│ ├── ORDER BY
│ ├── GROUP BY
│ ├── HAVING
│ └── LIMIT / OFFSET
│
├── 6. SQL Operators
│ ├── Arithmetic (+ - * /)
│ ├── Comparison (= != > < >= <=)
│ ├── Logical (AND OR NOT)
│ ├── BETWEEN
│ ├── IN
│ ├── LIKE
│ └── IS NULL
│
├── 7. SQL Functions
│ ├── Aggregate
│ │ ├── COUNT
│ │ ├── SUM
│ │ ├── AVG
│ │ ├── MIN
│ │ └── MAX
│ ├── String
│ │ ├── CONCAT
│ │ ├── SUBSTRING
│ │ ├── LENGTH
│ │ └── TRIM
│ ├── Numeric
│ │ ├── ROUND
│ │ └── ABS
│ └── Date
│ ├── NOW
│ ├── DATEADD
│ └── DATEDIFF
│
├── 8. Joins
│ ├── INNER JOIN
│ ├── LEFT JOIN
│ ├── RIGHT JOIN
│ ├── FULL JOIN
│ ├── CROSS JOIN
│ └── SELF JOIN
│
├── 9. Subqueries
│ ├── Scalar Subquery
│ ├── Correlated Subquery
│ └── Nested Subquery
│
├── 10. Views
│ ├── CREATE VIEW
│ ├── UPDATE VIEW
│ └── MATERIALIZED VIEW
│
├── 11. Indexing
│ ├── Clustered Index
│ ├── Non-Clustered Index
│ ├── Composite Index
│ └── Index Optimization
│
├── 12. Transactions
│ ├── BEGIN
│ ├── COMMIT
│ ├── ROLLBACK
│ └── SAVEPOINT
│
├── 13. ACID Properties
│ ├── Atomicity
│ ├── Consistency
│ ├── Isolation
│ └── Durability
│
├── 14. Normalization
│ ├── 1NF
│ ├── 2NF
│ ├── 3NF
│ ├── BCNF
│ └── Denormalization
│
├── 15. Advanced SQL
│ ├── Stored Procedures
│ ├── Triggers
│ ├── CTE (WITH)
│ ├── Window Functions
│ │ ├── ROW_NUMBER
│ │ ├── RANK
│ │ ├── DENSE_RANK
│ │ └── PARTITION BY
│ └── Recursive Queries
│
├── 16. Performance Optimization
│ ├── Query Optimization
│ ├── Execution Plan
│ ├── Index Tuning
│ └── Query Caching
│
├── 17. SQL Ecosystem
│ ├── MySQL
│ ├── PostgreSQL
│ ├── SQLite
│ ├── SQL Server
│ └── Oracle DB
│
└── 18. Real-World Usage
├── Backend APIs
├── Data Analytics
├── Reporting Systems
├── ETL Pipelines
└── Data Warehousing
👉 @SQLPortal
❤️ Конференция Backend Talks от Яндекс 360 — место встречи опытных бэкенд-разработчиков
Обсудим лучшие практики в разработке высоконагруженных систем и разберём реальные рабочие кейсы на примере сервисов с аудиторией в 100+ миллионов пользователей.
Когда: 16 мая, 12:00 мск
Где: офлайн в Москве и онлайн
В программе — два зала с докладами и решением практических задач.
🈲 Расписание зала №1:
«Направленный ациклический граф в PostgreSQL: как мы научили реляционную базу хранить оргструктуру на 500 тыс. пользователей»
//Спикер: Малик Минубаев, разработчик в B2B-платформе
«Как Яндекс Диск выдерживает сотни гигабит входящего трафика: устройство балансировки загрузок»
//Спикер: Илья Абрамов, разработчик в Диске
«Как формировать технологический стек и не погибнуть в священных войнах: от хаоса к процессам и техрадару»
//Спикер: Дмитрий Сафонов, руководитель команды разработки платформы микросервисов
«Зачем и как бэкендеру расти в карьере в 2026 году»
//Спикер: Дмитрий Соломонов, руководитель группы B2B-разработки бэкенда Диска
«Семь раз подумай, один раз пошардируй: как мы начали горизонтально масштабировать метаданные чатов Телемоста»
//Спикер: Никита Звонарев, разработчик в Мессенджере
🚀«Марс: великое противостояние»
//Спикер: Владимир Сурдин, астроном, кандидат физико-математических наук, доцент
Аналог DBeaver: https://tableplus.com/
Тот же клиент для работы с базами данных с графическим интерфейсом.
По сути, это инструмент, который позволяет:
подключаться к разным СУБД (MySQL, PostgreSQL, SQLite, SQL Server и др.)
писать и выполнять SQL-запросы
смотреть и редактировать данные в таблицах
управлять схемой базы (таблицы, индексы и т.д.)
LangChain Community Spotlight: text2sql
Агентный text-to-SQL SDK, построенный на Deep Agents из LangChain, который автономно исследует схемы, пишет запросы и сам себя корректирует — достигая 100% точности на бенчмарке Spider без использования извлечения с дополнением генерации или предрассчитанных схем.
Посмотреть: https://github.com/Text2SqlAgent/text2sql-framework
👉 @SQLPortal
🚫 Никогда не используй COUNT для проверки существования
Если нужно просто проверить, существует ли запись, не используй COUNT() с фильтром (WHERE)
SELECT COUNT(*)
FROM users
WHERE email = 'http://thisemaildontexist.com';
COUNT(*) отвечает на другой вопрос — считает количество строк, подходящих под условие, хотя нужна только проверка наличия хотя бы одной.COUNT(*) база может просканировать все подходящие строки, чтобы посчитать итог. Даже если совпадение найдено сразу, выполнение может продолжиться, потому что запрошен полный подсчёт. На больших таблицах это лишняя работа.COUNT() используй EXISTSSELECT EXISTS (
SELECT 1
FROM users
WHERE email = 'http://thisemaildontexist.com'
);
pgstattuple - Расширения Postgres, которые у тебя уже есть
Что делает: проверяет раздувание таблиц и индексов
Как включить:
CREATE EXTENSION pgstattuple;
select * from pgstattuple или писать свои запросы, чтобы смотреть таблицы, количество «живых» и «мертвых» строк и процент.SELECT
relname AS table_name,
pg_size_pretty(pg_relation_size(relid)) AS table_size,
(pgstattuple(relid)).dead_tuple_percent AS dead_pct,
(pgstattuple(relid)).free_percent AS free_pct
FROM pg_catalog.pg_stat_user_tables
ORDER BY dead_pct DESC;