14500
Присоединяйтесь к нашему каналу и погрузитесь в мир баз данных Связь: @devmangx РКН: https://clck.ru/3H4Wo3
Нужна быстрая задержка в скрипте или тесте?
SELECT pg_sleep(2); -- 2 секунды
SELECT pg_sleep(0.5); -- полсекунды
SELECT pg_sleep_for('5 minutes'); -- самодокументируемо
Удобно для симуляции медленных запросов, тестирования таймаутов или просто чтобы добавить драматизма в демо.
👉 @SQLPortal
Понимание порядка выполнения SQL-запроса критично для написания корректных и оптимизированных запросов.
Запомни последовательность: FROM и JOIN, WHERE, GROUP BY, HAVING, SELECT, DISTINCT, ORDER BY, затем LIMIT.
Освоение этого порядка ускоряет отладку и помогает мыслить как СУБД. #SQL #DataAnalytics #LearnSQL #Database
👉 @SQLPortal
Для фоновых задач, таких как vacuum и создание индексов, Postgres использует специальное выделение памяти под названием maintenance_work_mem. Обычные запросы используют work_mem, чтобы определить, сколько памяти может быть выделено на одну операцию или соединение.
Если требуется ускорить выполнение задач, таких как:
> выполнение vacuum,
> создание индексов,
> создание индексов для материализованных представлений,
используйте:
SET maintenance_work_mem = '8GB';
SQL-приём, о котором мало кто знает
Знал ли ты, что внутри транзакции можно создавать контрольные точки с помощью SAVEPOINT? Вместо сценария, где при ошибке теряется вся работа.
SAVEPOINT позволяет зафиксировать точку внутри транзакции, к которой можно откатиться. Обычный откат отменяет всю транзакцию, а откат к SAVEPOINT возвращает состояние только до этой точки.
SAVEPOINT — это как контрольные точки в трубопроводе. Если проблема возникает дальше по потоку, можно локализовать последствия, вернувшись к последней стабильной точке, не останавливая всю систему.
Следующий код откатывает всё:
BEGIN;
INSERT INTO orders VALUES (1, 'Laptop');
INSERT INTO payments VALUES (1, 'FAILED');
-- Здесь что-то пошло не так
ROLLBACK; -- Удалит И заказ, И платёж
BEGIN;
INSERT INTO orders VALUES (1, 'Laptop');
-- Создаём контрольную точку
SAVEPOINT before_payment;
INSERT INTO payments VALUES (1, 'FAILED');
-- Платёж не прошёл — откатываем только его
ROLLBACK TO SAVEPOINT before_payment;
-- Пробуем альтернативный способ оплаты
INSERT INTO payments VALUES (1, 'SUCCESS');
COMMIT;
«Его открывал мой муж. Поэтому и покинул нас в 45», - добавила она
👉 @SQLPortal
pgcli — интерфейс командной строки для PostgreSQL
Его главные особенности — автодополнение и подсветка синтаксиса. Это позволяет упростить взаимодействие с базами данных.
Есть аналог для MySQL.
⛓ Ссылка: тык
👉 @SQLPortal
Как сгруппировать строки в пачки (batch), где сумма не превышает заданное значение — прямо в Oracle SQL
Используйте MATCH_RECOGNIZE:
SELECT ... FROM ... MATCH_RECOGNIZE (
ORDER BY ...
MEASURES ...
PATTERN ( total+ )
DEFINE total AS SUM ( ... ) <= ...
)
Этот репозиторий содержит все, что вам нужно, чтобы прокачать свои навыки работы с SQL
Более 100 упражнений и примеров по SQL.
⛓ Ссылка: тык
👉 @SQLPortal
Руководство по SQL
Это руководство охватывает различные аспекты, начиная с основ SQL и до более сложных тем
Материал дополнен практическими примерами, которые способствуют лучшему усвоению информации
Сохраняйте, чтобы не потерять
👉 @SQLPortal
Если используешь COUNT вместе с CASE, не ставь ELSE 0
Пример:
SELECT
Department,
COUNT(CASE WHEN Status = 'Active' THEN EmployeeID ELSE 0 END) AS ActiveCount
FROM Employees
GROUP BY Department;
ELSE 0, COUNT начинает считать нули как значения. COUNT игнорирует только NULL, а ноль это не NULL. Поэтому если в отделе 10 активных и 5 неактивных сотрудников, запрос вернет 15 для ActiveCount, потому что посчитает все 15 строк (10 EmployeeID + 5 нулей).ELSE 0:SELECT
Department,
COUNT(CASE WHEN Status = 'Active' THEN EmployeeID END) AS ActiveCount
FROM Employees
GROUP BY Department;
ELSE тут не нужен. Если условие не выполняется, выражение вернет NULL, а COUNT NULL-ы не считает. Еще более явно можно написать так:SELECT
Department,
COUNT(CASE WHEN Status = 'Active' THEN 1 END) AS ActiveCount
FROM Employees
GROUP BY Department;
ELSE 0 будет уместен, это если вместо COUNT ты используешь SUM.
Не используй CASE в WHERE
Один из самых частых SQL анти-паттернов это пихать CASE прямо в WHERE, чтобы разрулить условную логику для диапазонов или фильтров.
Классический пример:
SELECT * FROM products
WHERE
CASE WHEN category = 'Electronics' THEN price < 500 ELSE price < 100 END;
CASE делает предикат не SARGable в большинстве популярных СУБД. Оптимизатор уже не может нормально сделать index seek по индексу на price (или по составному индексу (category, price)). В итоге нередко получаешь full table scan, даже если индексы отличные.SELECT * FROM products
WHERE price < 100
OR (category = 'Electronics' AND price < 500);
Поток данных в Postgres для чтения/записи:
Приложение --> (опционально) пулер --> отдельный backend/клиентское соединение --> shared buffers --> кэш ОС (page cache) --> физический диск.
При чтении к кэшу ОС или диску обращается только если нужных страниц нет в shared buffers.
👉 @SQLPortal
shivambhadani_/acid-properties-explained-a-complete-guide-with-postgresql-implementation-071afa6aaf8a">Cтатья про ACID-свойства.
Не только теория, но и практическая реализация на PostgreSQL с примерами из реальной жизни.
Этот пост отлично зайдет новичкам, которые хотят начать разбираться в базах данных, и он же нужен как база перед моей серией про внутренности PostgreSQL.
👉 @SQLPortal
Как выполнить поиск по нескольким условиям с помощью Xlookup
👉 @SQLPortal
Сегодня мы изучим импорт и экспорт данных в SQL:
SQL предоставляет механизмы для импорта данных в базу данных и экспорта их во внешние файлы.
Импорт данных:
Использование команды INSERT INTO SELECT для импорта данных из одной таблицы в другую:
INSERT INTO destination_table (column1, column2)
SELECT column3, column4 FROM source_table;
SELECT column1, column2 INTO OUTFILE 'file_path.csv'
FIELDS TERMINATED BY ',' FROM table_name;
🚀 GigaChat 3.1 Ultra и GigaChat 3.1 Lightning в опенсорс под MIT лицензией!
Обе модели
• Обучены с нуля — без инициализации зарубежными весами
• MoE + MTP + MLA
• Совместимы с HuggingFace, llama.cpp / vLLM / SGLang
Код и веса уже на платформе GitVerse.
Это не просто релиз весов, а результат большой инженерной работы над качеством, alignment и стабильностью модели. В блоге команда поделилась результатами и своими наработками.
В релизе: высокие результаты на аренах, улучшенный function calling, решённая проблема циклов, DPO в нативном FP8, найденный и зарепорченный баг в SGLang при dp > 1.
Нужно быстро выгрузить данные? \copy записывает результат любого запроса в локальный файл.
\copy (SELECT * FROM users WHERE created_at > now() - interval '7 days') TO '~/new_users.csv' WITH CSV HEADER
Вы можете использовать ORDER BY по столбцам, которых нет в SELECT-списке запроса.
...за исключением случая:
SELECT DISTINCT this FROM t ORDER BY that -- некорректно!
DISTINCT удаляет дубликаты из выбранных значений и формирует новую таблицу,SELECT
Сравнение с предыдущим. Решение.
Решение: использование DATEDIFF: эта функция вычисляет разницу между двумя датами. Она используется для того, чтобы обеспечить сравнение именно «сегодняшних» и «вчерашних» температур.
DATEDIFF
Если сформулировать обычным языком следующий запрос, то окажется, что он выражает следующую идею: нужно выбрать такие идентификаторы, чтобы температура, соответствующая представляемым ими датам, была бы больше, чем температура на «вчерашние» по отношению к ним даты.
SELECT DISTINCT a.Id
FROM Weather a, Weather b
WHERE a.Temperature > b.Temperature
AND DATEDIFF(a.Recorddate, b.Recorddate) = 1
Руководство по стилю SQL
Последовательное руководство по стилю кода SQL для обеспечения разборчивости и сопровождения проектов
⛓ Ссылка: тык
👉 @SQLPortal
Перенаправляете вывод psql куда-то ещё? В psql есть настройки, позволяющие сократить вывод до одиночных строк данных.psql -qtA
- -q — тихий режим
- -t — только строки (tuples only)
- -A — без выравнивания (unaligned)
👉 @SQLPortal
Вчера мы говорили о функциях pg_get_*. Чтобы получить отформатированный SQL, передайте true вместо одной длинной нечитаемой строки.pg_get_viewdef — представленияpg_get_indexdef — индексыpg_get_constraintdef — ограничения
SELECT pg_get_viewdef('active_orders'::regclass, true);
Функции pg_get_* — это встроенные функции интроспекции в Postgres.pg_get_viewdef — «Покажи SQL, лежащий за этим представлением»pg_get_indexdef — «Покажи CREATE INDEX для этого индекса»pg_get_constraintdef — «Покажи, как определён этот внешний ключ / check-ограничение»
👉 @SQLPortal
Вопрос по SQL
Нужно получить:
- все товары дешевле 100
- плюс товары из категории Electronics дешевле 500
Какое условие корректно вернет такой результат?
A)
price < 100 AND category = 'Electronics' OR price < 500
price < 100 OR (category = 'Electronics' AND price < 500)
(price < 100 OR category = 'Electronics') AND price < 500
Open-source инструмент Text2SQL, который превращает запросы на естественном языке в SQL, используя понимание схемы на базе графа. Задавай вопросы к базе простым языком, а QueryWeaver сам сделает всю склейку и соберет нужный SQL.
https://github.com/FalkorDB/QueryWeaver
👉 @SQLPortal
Краткая шпаргалка по SQL с примерами запросов
https://github.com/enochtangg/quick-SQL-cheatsheet
👉 @SQLPortal
JSONB-колонки Postgres и TOAST: гайд по производительности
Postgres даёт огромный набор фич на уровне пользователя под кучу разных кейсов, а под капотом там довольно сложная абстракция.
Работа с API и массивами в типе jsonb в последнее время стала заметно популярнее, и хранить куски данных приложения в jsonb превратилось в распространённый паттерн.
Но зачем вообще “нарезать” JSON-объект на строки и колонки, а потом собирать его обратно, чтобы отправить клиенту?
Ответ: эффективность. Postgres быстрее всего работает со строками и колонками, а когда ты прячешь структуру данных внутрь JSON, движку сложнее разогнаться на максимум, как он мог бы.
👉 @SQLPortal
В Postgres есть unlogged-таблицы: для них отключается Write-Ahead Logging (WAL). За счёт этого запись становится заметно быстрее, но очевидная цена — такие таблицы не реплицируются через WAL и после крэша/перезапуска их содержимое не восстанавливается (по сути, данные считаются временными). В некоторых сценариях этот размен реально оправдан.
👉 @SQLPortal