This media is not supported in your browser
VIEW IN TELEGRAM
Часто приходится ковыряться в терминале с CSV или JSON, а стандартные CLI-инструменты всё превращают в кашу.
Tabiew — open-source тулза для комфортного просмотра таблиц прямо в терминале. Есть Vim-стиль управления и SQL-запросы к данным.
Форматы: CSV, Parquet, JSON, Excel и прочее. Можно быстро фильтровать, искать, листать и даже строить графики.
Фишки
🔸 Поддержка CSV, Parquet, Arrow, Excel и др.
🔸 SQL-фильтрация и анализ прямо в терминале
🔸 Vim-подобные хоткеи
🔸 Поиск на лету и мульти-табличные операции
🔸 Темы Monokai, Nord и др.
🔸 Лёгкий, ест даже огромные файлы без лагов
👉 @SQLPortal
Tabiew — open-source тулза для комфортного просмотра таблиц прямо в терминале. Есть Vim-стиль управления и SQL-запросы к данным.
Форматы: CSV, Parquet, JSON, Excel и прочее. Можно быстро фильтровать, искать, листать и даже строить графики.
Фишки
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6
Манипуляции с JSON в PL/SQL с использованием объектных типов, добавленных в версии 12.2
С помощью функций
👉 @SQLPortal
JSON_ELEMENT_T
JSON_SCALAR_T
JSON_OBJECT_T
JSON_ARRAY_T
С помощью функций
get, put
и remove
можно получать, добавлять и удалять значения из JSON-объектов и массивовPlease open Telegram to view this post
VIEW IN TELEGRAM
❤6
This media is not supported in your browser
VIEW IN TELEGRAM
Инструмент для анализа данных на базе AI от Microsoft 🤖
Представляем LLM-powered no-code-инструмент, который преобразует данные и строит крутые визуализации.
Ключевые фичи
🔸 Преобразование данных с помощью AI
🔸 Интерактивный UI
🔸 Ввод на естественном языке
Ссылка на GitHub-репозиторий - https://github.com/microsoft/data-formulator
👉 @SQLPortal
Представляем LLM-powered no-code-инструмент, который преобразует данные и строит крутые визуализации.
Ключевые фичи
Ссылка на GitHub-репозиторий - https://github.com/microsoft/data-formulator
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤4🔥3
Кто сказал, что на SQL нельзя делать ресерч по рынку?
Этот запрос вытаскивает для каждой FAANG-компании месяц с пиком и месяц с минимумом цены открытия
Задача из Bloomberg SQL
У тебя есть данные по акциям FAANG (Facebook, Amazon, Apple, Netflix, Google) и надо найти месяц и год, когда у каждой бумаги был
- максимальный прайс открытия
- минимальный прайс открытия
при этом даты должны быть в формате
Таблица:
Хранит дневные котировки
-
-
-
Разбор запроса
1. CTE month_open
Группируем данные по месяцу и тикеру
Считаем
-
-
2. CTE high
Для каждого тикера берём строку с самым высоким значением
Используем
Результат
-
-
-
3. CTE low
То же самое, только для минимума
Результат
-
-
-
4. JOIN high и low по
На выходе по каждой бумаге месяц+значение максимума и месяц+значение минимума
👉 @SQLPortal
Этот запрос вытаскивает для каждой FAANG-компании месяц с пиком и месяц с минимумом цены открытия
Задача из Bloomberg SQL
У тебя есть данные по акциям FAANG (Facebook, Amazon, Apple, Netflix, Google) и надо найти месяц и год, когда у каждой бумаги был
- максимальный прайс открытия
- минимальный прайс открытия
при этом даты должны быть в формате
Mon-YYYY
Таблица:
stock_prices
Хранит дневные котировки
-
date
— дата в формате типа 01/31/2023 -
ticker
— тикер, например AAPL -
open
, high
, low
, close
— цены открытия, максимума, минимума, закрытия Разбор запроса
1. CTE month_open
Группируем данные по месяцу и тикеру
Считаем
-
max_open
— максимальная цена открытия за месяц по тикеру -
min_open
— минимальная цена открытия за месяц по тикеру 2. CTE high
Для каждого тикера берём строку с самым высоким значением
open
Используем
DISTINCT ON (ticker)
, чтобы оставить только один месяц с максимумом Результат
-
ticker
-
high_mth
— месяц с пиком открытия -
high_open
— сам пик цены открытия 3. CTE low
То же самое, только для минимума
Результат
-
ticker
-
low_mth
— месяц с минимальным открытием -
low_open
— минимальная цена открытия 4. JOIN high и low по
ticker
На выходе по каждой бумаге месяц+значение максимума и месяц+значение минимума
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍6
Я сторонник того, чтобы всегда выбирать инструмент под конкретную задачу
Как бы я ни любил Postgres и MySQL, они заточены под OLTP-нагрузку. А вот когда нужны аналитика или работа с временными рядами — ClickHouse отлично подходит🤵
На выходных почитал их статью — море интересных инженерных решений
👉 @SQLPortal
Как бы я ни любил Postgres и MySQL, они заточены под OLTP-нагрузку. А вот когда нужны аналитика или работа с временными рядами — ClickHouse отлично подходит
На выходных почитал их статью — море интересных инженерных решений
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍3🔥3
Разбор libpq \ Что такое libpq
Просто потому что мы любим Postgres, мы решили посвятить эту неделю разбору libpq
Возможно, ты видел упоминание libpq в доках или слышал этот термин от других разработчиков. Но что это за библиотека и зачем она вообще нужна
libpq — это клиентская библиотека на C, которая позволяет тебе или твоему приложению общаться с сервером PostgreSQL. По сути, это базовый мост между тобой, твоим кодом и базой данных
Представь, у тебя есть приложение — это может быть веб-приложение, скрипт для анализа данных, консольный инструмент вроде psql или любая другая софтина, которой нужно ходить в базу
Твой клиент обычно не умеет напрямую говорить на сетевом протоколе PostgreSQL. Вместо этого он вызывает функции libpq — чаще всего через драйвер базы для твоего языка. libpq в этом случае играет роль прослойки или «переводчика» на стороне клиента. Она предоставляет API с набором функций, которые приложение может использовать, чтобы отправлять запросы и получать ответы
Когда твое приложение через libpq отправляет запрос на подключение к Postgres, его принимает Postmaster. Postmaster проверяет аутентификацию, и если всё ок, он поднимает новый отдельный процесс на сервере, который будет обслуживать только твое соединение. Postmaster передает этому процессу сетевое подключение, и дальше libpq общается уже напрямую с ним (Postmaster в этом не участвует). Все SQL-запросы, обращения к данным и ответы идут между libpq и этим выделенным backend-процессом на протяжении всей сессии
👉 @SQLPortal
Просто потому что мы любим Postgres, мы решили посвятить эту неделю разбору libpq
Возможно, ты видел упоминание libpq в доках или слышал этот термин от других разработчиков. Но что это за библиотека и зачем она вообще нужна
libpq — это клиентская библиотека на C, которая позволяет тебе или твоему приложению общаться с сервером PostgreSQL. По сути, это базовый мост между тобой, твоим кодом и базой данных
Представь, у тебя есть приложение — это может быть веб-приложение, скрипт для анализа данных, консольный инструмент вроде psql или любая другая софтина, которой нужно ходить в базу
Твой клиент обычно не умеет напрямую говорить на сетевом протоколе PostgreSQL. Вместо этого он вызывает функции libpq — чаще всего через драйвер базы для твоего языка. libpq в этом случае играет роль прослойки или «переводчика» на стороне клиента. Она предоставляет API с набором функций, которые приложение может использовать, чтобы отправлять запросы и получать ответы
Когда твое приложение через libpq отправляет запрос на подключение к Postgres, его принимает Postmaster. Postmaster проверяет аутентификацию, и если всё ок, он поднимает новый отдельный процесс на сервере, который будет обслуживать только твое соединение. Postmaster передает этому процессу сетевое подключение, и дальше libpq общается уже напрямую с ним (Postmaster в этом не участвует). Все SQL-запросы, обращения к данным и ответы идут между libpq и этим выделенным backend-процессом на протяжении всей сессии
Please open Telegram to view this post
VIEW IN TELEGRAM
❤11👍7
Старые приёмы работы с Postgres которые могут быть полезны. Пример функция
Можно написать поиск по именам которые звучат как Jon — их не обязательно писать так же или иметь совпадающую триграмму
Такой запрос найдёт "John" "Jon" и даже "Joan"
Больше про
👉 @SQLPortal
soundex
Можно написать поиск по именам которые звучат как Jon — их не обязательно писать так же или иметь совпадающую триграмму
SELECT first_name, last_name
FROM customers
WHERE soundex(first_name) = soundex('Jon');
Такой запрос найдёт "John" "Jon" и даже "Joan"
Soundex
— это специальный алгоритм для английского произношения. Он берёт первую букву слова и оставляет её в качестве якоря. Остальную часть слова он упрощает сгруппировав согласные в несколько общих категорий звуков. Например согласные которые произносятся с помощью губ как B и P считаются одной группой. Гласные (A E I O U) и мягкие согласные вроде H и W полностью игнорируются так как они мало влияют на основное звучание. В итоге получается стандартизированный код из четырёх символов. Запрос ищет другие совпадения с таким же четырёхсимвольным кодомSoundex
заметно слабо работает с текстом на других языках так что с реализацией стоит быть аккуратным. Но он может помочь в некоторых задачах поиска и сортировки особенно если у вас ещё нет ИИ или эмбеддинговБольше про
soundex
, полнотекстовый поиск и нечеткое сравнение строк читайте здесь: ссылкаPlease open Telegram to view this post
VIEW IN TELEGRAM
👍14❤2
libpq deep dive День 2 - переменные окружения Postgres
Когда вы подключаетесь к Postgres, соединение под капотом ведет
1. Явные параметры подключения
Это может быть формат URL как выше или отдельные флаги команды вроде
2. Переменные окружения
Если нужного параметра подключения не найдено,
Многие ORM и драйверы тоже используют
Когда драйвер вроде
3. Значения по умолчанию
Если настройка не указана ни в строке подключения ни в переменной окружения,
Поэтому
👉 @SQLPortal
Когда вы подключаетесь к Postgres, соединение под капотом ведет
libpq
libpq
проверяет параметры подключения в таком порядке приоритета1. Явные параметры подключения
psql postgres://postgres:flXEXcSpx@p.qz
Это может быть формат URL как выше или отдельные флаги команды вроде
-h <host>
или -p <port>
psql
преобразует свои флаги командной строки в параметры подключения для одной из процедур libpq
2. Переменные окружения
Если нужного параметра подключения не найдено,
libpq
затем смотрит переменные окружения операционной системы. Это позволяет разработчикам приложений задавать переменные вроде PGHOST
, PGUSER
, PGDATABASE
и получать эти значения в любом приложении, которое использует libpq
Многие ORM и драйверы тоже используют
libpq
для хранения и поддержки соединения. Схема такая Наше приложение или ORM
→ драйвер обертка
→ libpq
→ PostgreSQL
Когда драйвер вроде
psycopg2
который линкуется с libpq
инициализирует соединение, он автоматически ищет переменные типа PGHOST
, PGUSER
и тд в текущем окружении и использует их3. Значения по умолчанию
Если настройка не указана ни в строке подключения ни в переменной окружения,
libpq
использует зашитые при компиляции дефолты например подключение к localhost
под текущим пользователем ОС Поэтому
psql postgres
просто подключится к вашему localhost
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤2🔥2
This media is not supported in your browser
VIEW IN TELEGRAM
Talk to DBs
Вышел AI-инструмент, который позволяет общаться с базами данных на обычном языке
→ Загружаешь URL своей базы
→ Задаёшь любой вопрос
→ Получаешь SQL-запрос, результаты и пояснения
https://github.com/Arindam200/awesome-ai-apps/tree/main/simple_ai_agents/talk_to_db
👉 @SQLPortal
Вышел AI-инструмент, который позволяет общаться с базами данных на обычном языке
→ Загружаешь URL своей базы
→ Задаёшь любой вопрос
→ Получаешь SQL-запрос, результаты и пояснения
https://github.com/Arindam200/awesome-ai-apps/tree/main/simple_ai_agents/talk_to_db
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍6
Разбор libpq. День 3 — libpq и режим pipeline
Новое в Postgres 14 — libpq теперь поддерживает пакетные запросы.
Раньше Postgres работал по принципу «одна команда — один ответ». Сначала отправлялся запрос на сервер, ждали ответ, потом отправляли следующий. В режиме pipeline приложение может отправить целую пачку команд сразу.
Вместо того чтобы ждать ответа на каждый запрос, приложение шлёт их оптом, сервер обрабатывает и возвращает результаты одним пакетом.
В Postgres есть набор функций для работы с таким подходом, а некоторые драйверы (например, psycopg3) уже поддерживают эти возможности, что упрощает выполнение нескольких запросов и получение всех результатов за один раз.
👉 @SQLPortal
Новое в Postgres 14 — libpq теперь поддерживает пакетные запросы.
Раньше Postgres работал по принципу «одна команда — один ответ». Сначала отправлялся запрос на сервер, ждали ответ, потом отправляли следующий. В режиме pipeline приложение может отправить целую пачку команд сразу.
Вместо того чтобы ждать ответа на каждый запрос, приложение шлёт их оптом, сервер обрабатывает и возвращает результаты одним пакетом.
В Postgres есть набор функций для работы с таким подходом, а некоторые драйверы (например, psycopg3) уже поддерживают эти возможности, что упрощает выполнение нескольких запросов и получение всех результатов за один раз.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤11
Postgres и MySQL поддерживают два типа репликации — логическую и физическую
Репликация используется для HA-схем с primary/replica и для миграций между провайдерами без простоя
Почему два вида
🔸 Физическая репликация
Передаёт изменения реальных дисковых блоков с primary на целевой сервер.
Сюда входят изменения данных таблиц, индексов и системных каталогов.
В итоге на целевом сервере получается побайтовая копия исходной базы.
Это быстро и эффективно, но требует, чтобы версии серверов совпадали (или хотя бы были совместимы на уровне байтов)
В MySQL это называется ROW-level replication (
🔸 Логическая репликация
Передаёт сами изменения в логическом виде.
Например, при
Это медленнее, но позволяет реплицировать между разными основными версиями сервера
В MySQL это называется STATEMENT-level replication (
Оба варианта дают широкие возможности по масштабированию и миграциям баз данных
👉 @SQLPortal
Репликация используется для HA-схем с primary/replica и для миграций между провайдерами без простоя
Почему два вида
Передаёт изменения реальных дисковых блоков с primary на целевой сервер.
Сюда входят изменения данных таблиц, индексов и системных каталогов.
В итоге на целевом сервере получается побайтовая копия исходной базы.
Это быстро и эффективно, но требует, чтобы версии серверов совпадали (или хотя бы были совместимы на уровне байтов)
В MySQL это называется ROW-level replication (
binlog_format=ROW
), а в Postgres — физическая репликацияПередаёт сами изменения в логическом виде.
Например, при
UPDATE
строки реплика получит команду вида «изменить колонку X на значение Y в строке Z», а не побайтовые изменения. Это медленнее, но позволяет реплицировать между разными основными версиями сервера
В MySQL это называется STATEMENT-level replication (
binlog_format=STATEMENT
)Оба варианта дают широкие возможности по масштабированию и миграциям баз данных
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤3🔥3
libpq deep dive День 4 . Несколько хостов в одном подключении
Новое в Postgres 16 Теперь libpq умеет распределять подключения между несколькими хостами В строке подключения можно указать сразу список серверов, а не только один вместе с данными пользователя и базы
Пример строки подключения
Здесь указано несколько хостов и в конце добавлен параметр
Как это работает
1) libpq берет список хостов
2) Пытается подключиться к хостам в новом случайном порядке пока соединение не установится
Это простой способ распределить нагрузку на read реплики без использования внешнего балансировщика
👉 @SQLPortal
Новое в Postgres 16 Теперь libpq умеет распределять подключения между несколькими хостами В строке подключения можно указать сразу список серверов, а не только один вместе с данными пользователя и базы
Пример строки подключения
host=pg-replica-01,pg-replica-02,pg-replica-03 user=app_user dbname=my_app_db load_balance_hosts=random
Здесь указано несколько хостов и в конце добавлен параметр
load_balance_hosts=random
Как это работает
1) libpq берет список хостов
pg-replica-01 pg-replica-02 pg-replica-03
и случайным образом их перемешивает 2) Пытается подключиться к хостам в новом случайном порядке пока соединение не установится
Это простой способ распределить нагрузку на read реплики без использования внешнего балансировщика
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍2
Подготовленные выражения и параметризованные запросы теперь работают с самым популярным пулером соединений для Postgres —
В этом посте разбирается, почему и как это реализовано через
👉 @SQLPortal
pgBouncer
В этом посте разбирается, почему и как это реализовано через
transaction
mode в pgBouncer
, а также как находить типичные проблемы в такой конфигурации.Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
libpq углублённый разбор. День 5 - Почему оно называется libpq?
Ну lib понятно — от слова library. А вот почему именно ‘pq’...
Есть идеи? Без подсказок ;)
👉 @SQLPortal
Ну lib понятно — от слова library. А вот почему именно ‘pq’...
Есть идеи? Без подсказок ;)
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4
Чтиво на выходные для амбициозных ребят 🔥
Полноценная книга по архитектуре БД
Как проектировать базы с помощью SQL и реляционных СУБД. Для новичков, с Jupyter Notebook для практики. Освоите Postgres и основы SQL, научитесь проектировать и поддерживать безопасные и эффективные БД для сложных приложений.
> Читать книгу
👉 @SQLPortal
Полноценная книга по архитектуре БД
Как проектировать базы с помощью SQL и реляционных СУБД. Для новичков, с Jupyter Notebook для практики. Освоите Postgres и основы SQL, научитесь проектировать и поддерживать безопасные и эффективные БД для сложных приложений.
> Читать книгу
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8👍2
Два SQL-запроса ниже для планировщика разные:
Планировщику нужно разобрать скомпилировать и построить план для каждого
Использование bind-переменных позволяет избежать парсинга
Теперь оба хешируются в один и тот же план:
Из этого вылезают любопытные ситуации:
может использовать индекс по id благодаря высокой избирательности, но повторное применение того же индексного плана для
может быть не таким эффективным как полный скан
Ничего не бывает бесплатным. Всегда есть компромисс
👉 @SQLPortal
select * from emp where id = 7
select * from emp where id = 9
Планировщику нужно разобрать скомпилировать и построить план для каждого
Использование bind-переменных позволяет избежать парсинга
Теперь оба хешируются в один и тот же план:
select * from emp where id = ?, 7
select * from emp where id = ?, 9
Из этого вылезают любопытные ситуации:
select * from emp where id between ? and ?, 1, 3
может использовать индекс по id благодаря высокой избирательности, но повторное применение того же индексного плана для
select * from emp where id between ? and ?, 0, 9000000
может быть не таким эффективным как полный скан
Ничего не бывает бесплатным. Всегда есть компромисс
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤2🔥2
This media is not supported in your browser
VIEW IN TELEGRAM
Хочешь попрактиковаться в SQL на реальных задачах от топовых компаний и подготовиться к собеседованиям?
Заходи на stratascratch.com — там собраны сотни задач с интервью в FAANG и других крупных компаниях
Удобный онлайн-редактор, проверка решений и пояснения помогут прокачать скилл без лишней мороки🤩
👉 @SQLPortal
Заходи на stratascratch.com — там собраны сотни задач с интервью в FAANG и других крупных компаниях
Удобный онлайн-редактор, проверка решений и пояснения помогут прокачать скилл без лишней мороки
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤4
Если ты запускаешь транзакцию в уровне изоляции Read Committed (назовём её tx1) и выполняешь долгий SELECT — например, с сортировками и join’ами по большим датасетам — база берёт снимок зафиксированных данных на момент старта этого запроса.
Пока этот SELECT ещё работает, другая транзакция (tx2) в другом сеансе обновляет те же строки и успевает закоммитить.
Несмотря на то что tx2 закоммитила во время выполнения SELECT, твой запрос внутри tx1 этих апдейтов не увидит, потому что каждый запрос в Read Committed использует снимок данных, сделанный в начале его выполнения. Всё, что было зафиксировано после старта запроса, отфильтровывается.
Но если потом в рамках tx1 ты запустишь ещё один SELECT, он уже увидит изменения из tx2, так как возьмёт новый снимок, включающий все коммиты, сделанные к этому моменту.
В Postgres этот снимок строится на основе идентификаторов транзакций.
👉 @SQLPortal
Пока этот SELECT ещё работает, другая транзакция (tx2) в другом сеансе обновляет те же строки и успевает закоммитить.
Несмотря на то что tx2 закоммитила во время выполнения SELECT, твой запрос внутри tx1 этих апдейтов не увидит, потому что каждый запрос в Read Committed использует снимок данных, сделанный в начале его выполнения. Всё, что было зафиксировано после старта запроса, отфильтровывается.
Но если потом в рамках tx1 ты запустишь ещё один SELECT, он уже увидит изменения из tx2, так как возьмёт новый снимок, включающий все коммиты, сделанные к этому моменту.
В Postgres этот снимок строится на основе идентификаторов транзакций.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤11
This media is not supported in your browser
VIEW IN TELEGRAM
Copilot как функция в Excel
Microsoft только что анонсировала функцию copilot в Excel
Новая функция =COPILOT() в Excel позволяет анализировать данные, генерировать контент и брейнштормить прямо в ячейках таблицы
Подробнее: ссылка
👉 @SQLPortal
Microsoft только что анонсировала функцию copilot в Excel
Новая функция =COPILOT() в Excel позволяет анализировать данные, генерировать контент и брейнштормить прямо в ячейках таблицы
Подробнее: ссылка
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11❤4