Postgres предоставляет широкий и надёжный набор функций для отчетности и аналитики. Доступно множество опций для группировки по датам и агрегации (rollup).
Смотри практическое руководство по работе с датами. Примеры можно запускать прямо в браузере, чтобы попробовать разные инструменты.
▶️ playground/postgres-date-functions
👉 @SQLPorta
Смотри практическое руководство по работе с датами. Примеры можно запускать прямо в браузере, чтобы попробовать разные инструменты.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥2❤1
Мониторинг SQL в реальном времени в Oracle Database позволяет отслеживать прогресс выполнения плана запроса во время его выполнения.
Посмотреть отчёт по конкретному запросу можно с помощью:
Полную информацию смотри в этом руководстве : readme🤵
👉 @SQLPortal
Посмотреть отчёт по конкретному запросу можно с помощью:
SELECT dbms_sql_monitor.report_sql_monitor(sql_id => :sql_id)
Полную информацию смотри в этом руководстве : readme
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5🔥2
This media is not supported in your browser
VIEW IN TELEGRAM
Ты обожаешь Postgres и SQL, но начальству нужны отчёты в Excel? К счастью, в Postgres есть простой способ выгрузить данные из SQL-запроса сразу в CSV.
Экспортировать CSV-файл для любого SQL-запроса можно так:
psql уже содержит встроенную утилиту для работы с CSV. Просто укажи параметры подключения, запрос в кавычках — и готово.
– флаг
– добавь
Этот способ не такой гибкий, как
Прямой вывод в CSV избавляет от лишней постобработки. Нам нравится, как psql позволяет быстро и эффективно работать со структурированными данными — для отчётов, аудита и загрузки в таблицы.
👉 @SQLPortal
Экспортировать CSV-файл для любого SQL-запроса можно так:
psql --csv -c 'select * from orders'
psql уже содержит встроенную утилиту для работы с CSV. Просто укажи параметры подключения, запрос в кавычках — и готово.
– флаг
--csv
выводит данные в формате CSV прямо в stdout– добавь
>
, чтобы направить вывод в файл на локальной системеЭтот способ не такой гибкий, как
\copy
, но для простого экспорта результатов запроса — это быстрое и удобное решение.Прямой вывод в CSV избавляет от лишней постобработки. Нам нравится, как psql позволяет быстро и эффективно работать со структурированными данными — для отчётов, аудита и загрузки в таблицы.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8👍5
Практикуем SQL
Используя таблицы выше, напиши запрос, который определит продавца с наибольшим количеством клиентов.
👉 @SQLPortal
Используя таблицы выше, напиши запрос, который определит продавца с наибольшим количеством клиентов.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5
Инициализация массивов в PL/SQL с помощью циклов FOR внутри конструкторов типов (начиная с версии 21c):
Цикл может проходить по:
Диапазону значений:
Курсору:
👉 @SQLPortal
array_var := array_type( FOR i IN ... => val );
Цикл может проходить по:
Диапазону значений:
FOR i IN min .. max => ...
Курсору:
FOR rws IN (SELECT ...) => ...
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤2🔥1
Postgres содержит массу полезной информации в системных каталогах, которая позволяет понять, что происходит внутри базы данных. Также существуют представления, объединяющие данные из системных таблиц для более удобного доступа.
Для тех, кто только начинает работать с Postgres или только осваивает работу с базой данных, важно познакомиться со следующими ключевыми представлениями каталогов — они помогут увидеть, что происходит внутри, выявить проблемы и провести отладку:
👉 @SQLPortal
Для тех, кто только начинает работать с Postgres или только осваивает работу с базой данных, важно познакомиться со следующими ключевыми представлениями каталогов — они помогут увидеть, что происходит внутри, выявить проблемы и провести отладку:
pg_stat_activity
→ текущие выполняющиеся запросы и сессииpg_stat_statements
→ журнал запросов и их длительностьpg_stat_user_indexes
→ пользовательские индексы (не системные), включая первичные ключиpg_roles
→ системные роли и роли для входа в системуpg_locks
→ процессы, удерживающие блокировкиpg_stats
→ статистика по таблицам: распределение данных, кардинальность столбцовpg_settings
→ параметры конфигурации, включая те, что задаются через ALTER SYSTEMpg_stat_database
→ информация о базе данных, например, объем транзакцийPlease open Telegram to view this post
VIEW IN TELEGRAM
❤4👍4
This media is not supported in your browser
VIEW IN TELEGRAM
Индексация в Postgres для запросов с подстановочными символами 🃏
Это немного отличается от стандартной индексации. Если запросы твоего приложения делают точное сравнение — стандартные B-tree индексы обычно работают хорошо.
Но если ты часто используешь
Индексы типа B-tree зависят от сортировки, а наличие подстановочного символа
К счастью, есть расширение
Оператор
Если посмотреть план выполнения (EXPLAIN) для такого индекса, ты увидишь, что используются планы Index Bitmap и Heap Bitmap.
Обычно это работает так: поиск по индексу создает
👉 @SQLPortal
Это немного отличается от стандартной индексации. Если запросы твоего приложения делают точное сравнение — стандартные B-tree индексы обычно работают хорошо.
Но если ты часто используешь
LIKE
или ILIKE
с шаблоном вида %строка%, такие запросы обрабатываются иначе.Индексы типа B-tree зависят от сортировки, а наличие подстановочного символа
%
и в начале, и в конце строки делает такую сортировку невозможной обычными методами.К счастью, есть расширение
pg_trgm
, которое позволяет Postgres искать внутри столбца по триграммам (наборы из 3 символов).pg_trgm
нужно установить явно, но оно поставляется с каждым дистрибутивом Postgres.pg_trgm
работает вместе с GIN-индексами, создавая индекс по триграммам для ускоренного поиска по схожести:CREATE INDEX trgm_idx ON test_trgm USING GIN (t gin_trgm_ops);
Оператор
gin_trgm_ops
— это специальный оператор индексации, который связывает GIN-индекс с триграммами.Если посмотреть план выполнения (EXPLAIN) для такого индекса, ты увидишь, что используются планы Index Bitmap и Heap Bitmap.
Обычно это работает так: поиск по индексу создает
bitmap
(битовую карту), ссылающуюся на строки, подходящие под условие, а затем heap bitmap используется для получения этих строк из основной таблицыPlease open Telegram to view this post
VIEW IN TELEGRAM
❤4👍3
5 нормальных форм баз данных, которые должен знать каждый разработчик
Первая нормальная форма (1NF)
Обеспечивает, чтобы каждое значение в столбце было атомарным (неделимым).
Вторая нормальная форма (2NF)
Обеспечивает, чтобы каждый неключевой столбец зависел от всего составного первичного ключа.
Третья нормальная форма (3NF)
Удаляет транзитивные зависимости: неключевые столбцы должны зависеть только от первичного ключа.
Нормальная форма Бойса-Кодда (BCNF)
Усиление 3NF: все детерминирующие атрибуты должны быть кандидатными ключами.
Четвёртая нормальная форма (4NF)
Обеспечивает, чтобы таблица не смешивала независимые связи «один-ко-многим» для одной и той же сущности.
👉 @SQLPortal
Первая нормальная форма (1NF)
Обеспечивает, чтобы каждое значение в столбце было атомарным (неделимым).
Вторая нормальная форма (2NF)
Обеспечивает, чтобы каждый неключевой столбец зависел от всего составного первичного ключа.
Третья нормальная форма (3NF)
Удаляет транзитивные зависимости: неключевые столбцы должны зависеть только от первичного ключа.
Нормальная форма Бойса-Кодда (BCNF)
Усиление 3NF: все детерминирующие атрибуты должны быть кандидатными ключами.
Четвёртая нормальная форма (4NF)
Обеспечивает, чтобы таблица не смешивала независимые связи «один-ко-многим» для одной и той же сущности.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤11👍5
Совет по SQL:
5 причин использовать Common Table Expressions (CTE):
🔸 CTE позволяют разбивать логику на именованные и читаемые шаги.
🔸 Если что-то ломается, каждое выражение CTE можно протестировать изолированно.
🔸 С CTE вы определяете подзапрос один раз и потом чисто переиспользуете его.
🔸 CTE масштабируются лучше, чем одна длинная монолитная выборка.
🔸 Так как каждое CTE — это как отдельный мыслительный шаг, код читается так, как вы бы объясняли решение вслух. Это помогает и при написании, и при ревью SQL-запросов.
👉 @SQLPortal
5 причин использовать Common Table Expressions (CTE):
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍6
Пояснение концепций баз данных на примере банковской терминологии
➣ База данных = Банк
➣ Таблица = Счёт
➣ Данные = Деньги
➣ DDL = Открытие/обновление/закрытие счёта
➣ DML = Списание и зачисление средств
➣ ACID = Безопасная транзакция
➣ Индекс = Кредитная/дебетовая карта
➣ Ограничения = Политики банка
➣ Первичный ключ = Номер счёта
➣ Внешний ключ = Совместный счёт
➣ Триггеры = SMS-уведомления
➣ Хранимая процедура = Служба поддержки клиентов
👉 @SQLPortal
➣ База данных = Банк
➣ Таблица = Счёт
➣ Данные = Деньги
➣ DDL = Открытие/обновление/закрытие счёта
➣ DML = Списание и зачисление средств
➣ ACID = Безопасная транзакция
➣ Индекс = Кредитная/дебетовая карта
➣ Ограничения = Политики банка
➣ Первичный ключ = Номер счёта
➣ Внешний ключ = Совместный счёт
➣ Триггеры = SMS-уведомления
➣ Хранимая процедура = Служба поддержки клиентов
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
SQL-запрос в Postgres для просмотра объема транзакций через представление
dattname | xact_commit. | xact_rollback
-------------------------+-------------+---------------
metabase | 48304399 | 3377
postgres | 4448208 | 20
➣ xact_commit — количество успешно зафиксированных транзакций
➣ xact_rollback — количество откатанных транзакций
Выполните этот запрос дважды с заданным интервалом. Например, запустите сейчас и повторно через час. Разность между значениями покажет количество транзакций за этот час — то есть вашу транзакционную нагрузку
👉 @SQLPortal
pg_stat_database
:SELECT datname, xact_commit, xact_rollback
FROM pg_stat_database;
dattname | xact_commit. | xact_rollback
-------------------------+-------------+---------------
metabase | 48304399 | 3377
postgres | 4448208 | 20
➣ xact_commit — количество успешно зафиксированных транзакций
➣ xact_rollback — количество откатанных транзакций
Выполните этот запрос дважды с заданным интервалом. Например, запустите сейчас и повторно через час. Разность между значениями покажет количество транзакций за этот час — то есть вашу транзакционную нагрузку
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤2
Power BI смотрит на тебя, когда ты начинаешь путь дата-аналитика с ноутбуком на 4ГБ ОЗУ и Intel Celeron:
👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
😁33
This media is not supported in your browser
VIEW IN TELEGRAM
Распространённый вопрос на собеседовании по SQL: Как оптимизировать медленный SQL-запрос?
Варианты ответов:
• Избегать использования
• Использовать
• По возможности избегать
• Добавить индексы в базу данных
• Проанализировать план выполнения запроса (
👉 @SQLPortal
Варианты ответов:
• Избегать использования
SELECT DISTINCT
• Использовать
INNER JOIN
вместо фильтрации через WHERE
• По возможности избегать
JOIN
вообще (рассмотреть денормализацию)• Добавить индексы в базу данных
• Проанализировать план выполнения запроса (
EXPLAIN
/ QUERY PLAN
)Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11❤3
7 сайтов для практики логики программирования — бесплатно, интерактивно и интересно:
① adventjs.dev — задачи на JavaScript с новогодней атмосферой
② exercism.org — практика с менторством и большим выбором языков
③ leetcode.com — топовая платформа для подготовки к интервью
④ codewars.com — "ката"-задачи и система рангов
⑤ coderbyte.com — челленджи и оценки навыков
⑥ codesignal.com — тренировки и эмуляция интервью
⑦ hackerrank.com — задачи по алгоритмам, SQL, DevOps и др.
👉 @SQLPortal
① adventjs.dev — задачи на JavaScript с новогодней атмосферой
② exercism.org — практика с менторством и большим выбором языков
③ leetcode.com — топовая платформа для подготовки к интервью
④ codewars.com — "ката"-задачи и система рангов
⑤ coderbyte.com — челленджи и оценки навыков
⑥ codesignal.com — тренировки и эмуляция интервью
⑦ hackerrank.com — задачи по алгоритмам, SQL, DevOps и др.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥1
SQL-вопрос
Что из перечисленного обязательно присутствует в каждой оконной функции SQL❓
a. DENSE_RANK
b. PARTITION
c. OVER
d. RANK
e. Всё вышеперечисленное
👉 @SQLPortal
Что из перечисленного обязательно присутствует в каждой оконной функции SQL
a. DENSE_RANK
b. PARTITION
c. OVER
d. RANK
e. Всё вышеперечисленное
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3🔥2
Совет по продуктивной работе с Postgres: шаблонные базы данных
Многие разработчики используют шаблонные базы данных для настройки дев-окружений. Суть подхода в следующем: вы запускаете один экземпляр Postgres для разработки и при необходимости создаёте/удаляете базы данных. При этом база данных для разработки создаётся на основе шаблона, который синхронизирован со схемой продакшена.
Для распределённых команд, использующих облачные решения, шаблонная база — это экономичный и безопасный способ работы.
Преимущества использования шаблонной базы данных для разработки:
● Упрощает работу с расширениями, конфигурацией Postgres, управлением версиями и установкой зависимостей — всё, что обычно замедляет локальную разработку
● Обеспечивает соответствие схемы продакшену, так как шаблон можно быстро создать из полной копии базы без данных
● Сокращает время на развёртывание и удаление дев-машин
● Позволяет использовать анонимизированные тестовые данные, подходящие для разработки
Подробнее о шаблонных базах данных
➡️ Создайте шаблон на основе продакшена, выгрузив только схему и расширения:
Флаг
➡️ Создайте базу и восстановите в неё шаблон:
Добавьте сид-данные на этом этапе. Это позволит быстро клонировать шаблон без необходимости повторного восстановления.
➡️ Разрешите использовать базу как шаблон:
Важно: использовать шаблонные базы можно только от имени суперпользователя Postgres. На платформе Crunchy Bridge это поддерживается, но не все облачные провайдеры предоставляют доступ к суперюзеру.
➡️ Создайте новую базу на основе шаблона:
Это создаст копию
➡️ Обновите строку подключения, чтобы использовать новую базу в разработке — и можно начинать писать код.
👉 @SQLPortal
Многие разработчики используют шаблонные базы данных для настройки дев-окружений. Суть подхода в следующем: вы запускаете один экземпляр 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;
Важно: использовать шаблонные базы можно только от имени суперпользователя Postgres. На платформе Crunchy Bridge это поддерживается, но не все облачные провайдеры предоставляют доступ к суперюзеру.
CREATE DATABASE new_db WITH TEMPLATE my_template_db OWNER my_user;
Это создаст копию
my_template_db
под именем new_db
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6
pgCompare — это утилита на Java, предназначенная для сравнения данных. Подходит для следующих сценариев:
🔸 репликация — проверка того, что данные реплицируются корректно и находятся в синхронизации;
🔸 кроссплатформенная репликация — валидация данных между разными СУБД;
🔸 миграции между базами данных — убедиться, что данные корректно синхронизированы в рамках миграционного проекта;
🔸 проверка целостности данных при active-active репликации.
На данный момент pgCompare поддерживает следующие СУБД: Oracle, PostgreSQL, DB2, MariaDB, MySQL и MSSQL.
https://github.com/CrunchyData/pgCompare
👉 @SQLPortal
На данный момент pgCompare поддерживает следующие СУБД: Oracle, PostgreSQL, DB2, MariaDB, MySQL и MSSQL.
https://github.com/CrunchyData/pgCompare
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5