Базы данных (Data Base) – Telegram
Базы данных (Data Base)
8.22K subscribers
559 photos
468 videos
19 files
538 links
Базы данных (Data Base). По всем вопросам @evgenycarter
Download Telegram
Как эффективно работать с датами в SQL?

Привет, друзья! Сегодня разберем один из самых частых вопросов в SQL — работу с датами. Даты встречаются везде: в заказах, логах, отчетах. И если их неправильно хранить или использовать, можно напороться на серьезные проблемы с производительностью и логикой запросов.

Вот несколько ключевых моментов:

🔹 Используйте правильный тип данных
Не храните даты в VARCHAR! Всегда используйте DATE, DATETIME или TIMESTAMP. Это не только экономит место, но и ускоряет запросы.

🔹 Не используйте NOW() в WHERE без обработки
Запрос вида:

SELECT * FROM orders WHERE order_date > NOW() - INTERVAL 7 DAY;

может привести к тому, что индексы не будут использоваться. Лучше заранее вычислить диапазон и передать его в запрос.

🔹 Сравнение по диапазону – ключ к оптимизации
Для фильтрации по дате лучше использовать BETWEEN:

SELECT * FROM orders WHERE order_date BETWEEN '2024-02-01' AND '2024-02-07';

Это более понятно и эффективно.

🔹 Осторожно с часовыми поясами
Если ваш сервис работает глобально, храните время в UTC и конвертируйте на уровне приложения.

🔹 Агрегируйте правильно
Часто нужно сгруппировать данные по дням или месяцам:

SELECT DATE(order_date) AS order_day, COUNT(*) FROM orders GROUP BY order_day;

Но если поле order_dateDATETIME, такие операции могут игнорировать индексы. Лучше использовать GROUP BY DATE_FORMAT(order_date, '%Y-%m-%d') или завести отдельное DATE-поле.

Работа с датами — мощный инструмент, но требует внимательности. Как вы решаете проблемы с обработкой времени в SQL? Делитесь в комментариях!

Мы в MAX

#db

👉 @database_info
👍14
🔥 Шпаргалка по SQL с основными командами и примерами

1. Основные команды SQL

SELECT column1, column2 FROM table_name; -- Выборка данных
SELECT * FROM table_name; -- Выборка всех данных
INSERT INTO table_name (column1, column2) VALUES ('value1', 'value2'); -- Добавление данных
UPDATE table_name SET column1 = 'value' WHERE condition; -- Обновление данных
DELETE FROM table_name WHERE condition; -- Удаление данных


2. Фильтрация данных (WHERE, AND, OR, LIKE, IN, BETWEEN)

SELECT * FROM users WHERE age > 18; -- Возраст больше 18
SELECT * FROM users WHERE city = 'Москва' AND age > 18; -- Два условия
SELECT * FROM users WHERE name LIKE 'A%'; -- Начинается с 'A'
SELECT * FROM users WHERE age BETWEEN 18 AND 30; -- Возраст от 18 до 30
SELECT * FROM users WHERE city IN ('Москва', 'Санкт-Петербург'); -- Город Москва или Питер


3. Группировка и агрегатные функции (GROUP BY, HAVING, COUNT, SUM, AVG, MAX, MIN)

SELECT city, COUNT(*) FROM users GROUP BY city; -- Количество пользователей в каждом городе
SELECT city, AVG(age) FROM users GROUP BY city HAVING AVG(age) > 25; -- Средний возраст > 25
SELECT MAX(salary) FROM employees; -- Максимальная зарплата
SELECT SUM(sales) FROM orders WHERE date >= '2024-01-01'; -- Сумма продаж с 2024 года


4. Сортировка (ORDER BY)

SELECT * FROM users ORDER BY age ASC; -- Сортировка по возрасту (по возрастанию)
SELECT * FROM users ORDER BY age DESC; -- Сортировка по убыванию


5. Соединение таблиц (JOIN)

SELECT users.name, orders.amount
FROM users
JOIN orders ON users.id = orders.user_id; -- Внутреннее соединение

SELECT users.name, orders.amount
FROM users
LEFT JOIN orders ON users.id = orders.user_id; -- Левый JOIN (все из users)

SELECT users.name, orders.amount
FROM users
RIGHT JOIN orders ON users.id = orders.user_id; -- Правый JOIN (все из orders)


6. Создание и изменение таблиц (CREATE, ALTER, DROP)

CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(100),
age INT
); -- Создание таблицы

ALTER TABLE users ADD COLUMN email VARCHAR(100); -- Добавление колонки
ALTER TABLE users DROP COLUMN email; -- Удаление колонки
DROP TABLE users; -- Удаление таблицы


7. Работа с индексами (INDEX)

CREATE INDEX idx_users_name ON users(name); -- Создание индекса
DROP INDEX idx_users_name; -- Удаление индекса


8. Ограничения (PRIMARY KEY, FOREIGN KEY, UNIQUE, CHECK, DEFAULT)

CREATE TABLE orders (
id SERIAL PRIMARY KEY,
user_id INT REFERENCES users(id), -- Внешний ключ
amount DECIMAL(10,2) CHECK (amount > 0), -- Ограничение CHECK
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- Значение по умолчанию
);


9. Подзапросы (SUBQUERY)

SELECT * FROM users WHERE id IN (SELECT user_id FROM orders WHERE amount > 1000);


10. Транзакции (BEGIN, COMMIT, ROLLBACK)

BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT; -- Завершение транзакции
ROLLBACK; -- Откат изменений


Мы в MAX

#db

👉 @database_info
👍7🔥61
🔥 Оптимизация запросов: Как убрать тормоза в SQL?

Сейчас покажу вам, как ускорить медленный SQL-запрос, который выполняется слишком долго. Если у вас в проекте есть запросы, которые выполняются секундами, а не миллисекундами, пора что-то менять!

🚀 Разбор примера
Допустим, у нас есть такой запрос:


SELECT *
FROM orders
WHERE customer_id = 123
ORDER BY order_date DESC;


Кажется простым, но выполняется медленно. В чём может быть проблема?

📌 Основные причины тормозов:
1️⃣ Нет нужного индекса – если customer_id или order_date не индексированы, база будет делать полный скан таблицы.
2️⃣ Слишком много данных – если таблица огромная, ORDER BY без индекса будет работать медленно.
3️⃣ Использование SELECT * – загружает ненужные колонки и увеличивает нагрузку.

Как ускорить?
Добавляем индекс (если его нет):

CREATE INDEX idx_orders_customer ON orders(customer_id, order_date DESC);

Выбираем только нужные колонки:

SELECT order_id, order_date
FROM orders
WHERE customer_id = 123
ORDER BY order_date DESC;

Лимитируем выборку (если нужен только последний заказ):

SELECT order_id, order_date
FROM orders
WHERE customer_id = 123
ORDER BY order_date DESC
LIMIT 1;


🔥 Итог
Добавление индекса + правильный выбор колонок + LIMIT = в разы быстрее! 🚀

А какие приёмы оптимизации запросов используете вы? Делитесь в комментариях!

📲 Мы в MAX

#db

👉 @database_info
Please open Telegram to view this post
VIEW IN TELEGRAM
👍91
🔥 Оптимизация индексов: частая ошибка DBA 🔥

Сегодня разберём распространённую ошибку, которую совершают многие администраторы баз данных — избыточные индексы.

💡Проблема
Добавление индексов — это полезно, но если их становится слишком много, то база данных начинает тормозить при вставке, обновлении и удалении данных. Почему? Потому что каждый индекс требует дополнительного обслуживания при изменениях в таблице.

💡Пример ошибки
Представим таблицу orders:

CREATE TABLE orders (
id SERIAL PRIMARY KEY,
customer_id INT NOT NULL,
order_date DATE NOT NULL,
total DECIMAL(10,2) NOT NULL
);


Допустим, мы добавляем индексы:

CREATE INDEX idx_customer ON orders(customer_id);
CREATE INDEX idx_order_date ON orders(order_date);
CREATE INDEX idx_customer_order_date ON orders(customer_id, order_date);


На первый взгляд, всё логично, но есть проблема: индекс idx_customer_order_date покрывает оба предыдущих индекса!

💡Как исправить?
Можно удалить idx_customer и idx_order_date, так как составной индекс (idx_customer_order_date) способен выполнять их работу.

📌 Как проверить ненужные индексы?

1️⃣ В PostgreSQL:

SELECT indexrelid::regclass, pg_size_pretty(pg_relation_size(indexrelid))
FROM pg_stat_user_indexes
ORDER BY pg_relation_size(indexrelid) DESC;


2️⃣ В MySQL:

SHOW INDEX FROM orders;

Здесь ищем индексы, которые дублируют друг друга.

Вывод: Чем меньше избыточных индексов — тем быстрее работает ваша база данных. Проверьте свои индексы прямо сейчас!

📲 Мы в MAX

#db

👉 @database_info
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
🚀 Подборка Telegram каналов для программистов

Системное администрирование, DevOps 📌
https://news.1rj.ru/str/bash_srv Bash Советы
https://news.1rj.ru/str/win_sysadmin Системный Администратор Windows
https://news.1rj.ru/str/sysadmin_girl Девочка Сисадмин
https://news.1rj.ru/str/srv_admin_linux Админские угодья
https://news.1rj.ru/str/linux_srv Типичный Сисадмин
https://news.1rj.ru/str/devopslib Библиотека девопса | DevOps, SRE, Sysadmin
https://news.1rj.ru/str/linux_odmin Linux: Системный администратор
https://news.1rj.ru/str/devops_star DevOps Star (Звезда Девопса)
https://news.1rj.ru/str/i_linux Системный администратор
https://news.1rj.ru/str/linuxchmod Linux
https://news.1rj.ru/str/sys_adminos Системный Администратор
https://news.1rj.ru/str/tipsysdmin Типичный Сисадмин (фото железа, было/стало)
https://news.1rj.ru/str/sysadminof Книги для админов, полезные материалы
https://news.1rj.ru/str/i_odmin Все для системного администратора
https://news.1rj.ru/str/i_odmin_book Библиотека Системного Администратора
https://news.1rj.ru/str/i_odmin_chat Чат системных администраторов
https://news.1rj.ru/str/i_DevOps DevOps: Пишем о Docker, Kubernetes и др.
https://news.1rj.ru/str/sysadminoff Новости Линукс Linux

1C разработка 📌
https://news.1rj.ru/str/odin1C_rus Cтатьи, курсы, советы, шаблоны кода 1С
https://news.1rj.ru/str/DevLab1C 1С:Предприятие 8
https://news.1rj.ru/str/razrab_1C 1C Разработчик
https://news.1rj.ru/str/buh1C_prog 1C Программист | Бухгалтерия и Учёт
https://news.1rj.ru/str/rabota1C_rus Вакансии для программистов 1С

Программирование C++📌
https://news.1rj.ru/str/cpp_lib Библиотека C/C++ разработчика
https://news.1rj.ru/str/cpp_knigi Книги для программистов C/C++
https://news.1rj.ru/str/cpp_geek Учим C/C++ на примерах

Программирование Python 📌
https://news.1rj.ru/str/pythonofff Python академия.
https://news.1rj.ru/str/BookPython Библиотека Python разработчика
https://news.1rj.ru/str/python_real Python подборки на русском и английском
https://news.1rj.ru/str/python_360 Книги по Python

Java разработка 📌
https://news.1rj.ru/str/BookJava Библиотека Java разработчика
https://news.1rj.ru/str/java_360 Книги по Java Rus
https://news.1rj.ru/str/java_geek Учим Java на примерах

GitHub Сообщество 📌
https://news.1rj.ru/str/Githublib Интересное из GitHub

Базы данных (Data Base) 📌
https://news.1rj.ru/str/database_info Все про базы данных

Мобильная разработка: iOS, Android 📌
https://news.1rj.ru/str/developer_mobila Мобильная разработка
https://news.1rj.ru/str/kotlin_lib Подборки полезного материала по Kotlin
https://news.1rj.ru/str/androidspb Разработка под Android: Kotlin, Java.

Фронтенд разработка 📌
https://news.1rj.ru/str/frontend_1 Подборки для frontend разработчиков
https://news.1rj.ru/str/frontend_sovet Frontend советы, примеры и практика!
https://news.1rj.ru/str/React_lib Подборки по React js и все что с ним связано

Разработка игр 📌
https://news.1rj.ru/str/game_devv Все о разработке игр

Библиотеки 📌
https://news.1rj.ru/str/book_for_dev Книги для программистов Rus
https://news.1rj.ru/str/programmist_of Книги по программированию
https://news.1rj.ru/str/proglb Библиотека программиста
https://news.1rj.ru/str/bfbook Книги для программистов

БигДата, машинное обучение 📌
https://news.1rj.ru/str/bigdata_1 Big Data, Machine Learning

Программирование 📌
https://news.1rj.ru/str/bookflow Лекции, видеоуроки, доклады с IT конференций
https://news.1rj.ru/str/rust_lib Полезный контент по программированию на Rust
https://news.1rj.ru/str/golang_lib Библиотека Go (Golang) разработчика
https://news.1rj.ru/str/itmozg Программисты, дизайнеры, новости из мира IT
https://news.1rj.ru/str/php_lib Библиотека PHP программиста 👨🏼‍💻👩‍💻
https://news.1rj.ru/str/nodejs_lib Подборки по Node js и все что с ним связано
https://news.1rj.ru/str/ruby_lib Библиотека Ruby программиста
https://news.1rj.ru/str/lifeproger Жизнь программиста. Авторский канал.

QA, тестирование 📌
https://news.1rj.ru/str/testlab_qa Библиотека тестировщика

Шутки программистов 📌
https://news.1rj.ru/str/itumor Шутки программистов

Защита, взлом, безопасность 📌
https://news.1rj.ru/str/thehaking Канал о кибербезопасности
https://news.1rj.ru/str/xakep_2 Хакер Free

Книги, статьи для дизайнеров 📌
https://news.1rj.ru/str/ux_web Статьи, книги для дизайнеров

Математика 📌
https://news.1rj.ru/str/Pomatematike Канал по математике
https://news.1rj.ru/str/phis_mat Обучающие видео, книги по Физике и Математике
https://news.1rj.ru/str/matgeoru Математика | Геометрия | Логика

Excel лайфхак📌
https://news.1rj.ru/str/Excel_lifehack

https://news.1rj.ru/str/mir_teh Мир технологий (Technology World)

Вакансии 📌
https://news.1rj.ru/str/sysadmin_rabota Системный Администратор
https://news.1rj.ru/str/progjob Вакансии в IT
3👎1🔥1
Как индекс может замедлить запрос?

Сейчас разберём интересный парадокс: почему индекс может замедлить выполнение запроса? 🤔

Обычно индекс ускоряет поиск данных, но есть ситуации, когда его использование ведёт к ухудшению производительности. Давайте рассмотрим несколько таких случаев.

🚀 1. Неправильный выбор индекса
Допустим, у нас есть индекс по created_at, а мы выполняем запрос:

SELECT * FROM orders WHERE YEAR(created_at) = 2024;

Проблема в том, что функция YEAR(created_at) делает так, что индекс не используется эффективно. База данных должна пройтись по всем строкам, применяя функцию ко всем значениям. Лучше переписать так:

SELECT * FROM orders WHERE created_at >= '2024-01-01' AND created_at < '2025-01-01';

Теперь индекс сможет работать оптимально. 🔥

🏗 2. Слишком широкий индекс (Over-indexing)
Если у нас слишком много индексов на таблице, это приведёт к замедлению операций INSERT, UPDATE, DELETE. Почему? Потому что каждый раз при изменении данных БД должна обновлять все индексы. Поэтому добавляйте индексы осознанно!

📦 3. Низкая селективность индекса
Допустим, у нас есть индекс по status, но всего три возможных значения ('new', 'processing', 'done'). Если в таблице миллионы строк, но мало уникальных значений, индекс бесполезен — оптимизатор может решить, что проще выполнить полный скан таблицы.

⚠️ 4. Ошибка с покрывающим индексом
Иногда индекс покрывает все нужные колонки (INDEX(col1, col2, col3)), но запрос выбирает ещё одну (col4). Тогда база вынуждена обращаться к самой таблице, что убивает эффективность индекса.

📌 Вывод: индекс — мощный инструмент, но его неправильное использование может навредить. Перед добавлением индексов всегда анализируйте планы выполнения запросов (EXPLAIN в MySQL, EXPLAIN ANALYZE в PostgreSQL).

📲 Мы в MAX

#db

👉 @database_info
Please open Telegram to view this post
VIEW IN TELEGRAM
👍81
Визуализация SQL-запросов

Ментальная модель, помогающая представить, как выполняются SQL-запросы.

Фактическая последовательность выполнения может отличаться от этой модели из-за стратегий оптимизации, применяемых оптимизатором запросов.

📲 Мы в MAX

#db

👉 @database_info
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🥴1
Андрей Бородин, руководитель разработки СУБД с открытым исходным кодом в Yandex Cloud, вошел в топ-50 главных контрибьюторов PostgreSQL

Разработчик получил статус major contributor за многолетний вклад в развитие сообщества и кодовой базы PostgreSQL: ревью патчей, менторинг младших разработчиков и улучшение инструментов WAL‑G, Odyssey и SPQR.

По данным Stack Overflow 2025 PostgreSQL используют более 55,6% опытных разработчиков баз данных в компаниях разного масштаба Особенно активно она применяется в ИИ-проектах.

Команда разработки СУБД Yandex Cloud работает в тесной связке с сообществом PostgreSQL — каждый год в релиз проекта попадает множество доработок от сотрудников компании. При этом процесс принятия изменений в ядро PostgreSQL считается одним из самых строгих в сообществе, поэтому успешный апстрим-патч — знак качества кода.

Помимо вклада в PostgreSQL, команда Андрея разработала решение с открытым исходным кодом SPQR. На его основе в 2025 году в режиме превью был запущен Managed Service for Shared PostgreSQL. Он обеспечивает горизонтальное масштабирование баз данных через шардирование — разделение данных между разными серверами.
🔥11👍41🏆1
SQL JOINs наглядно: как работать с объединением таблиц

Хотите лучше понимать SQL JOIN? Вот наглядная шпаргалка с примерами и визуализацией!

🔹 INNER JOIN – пересечение двух таблиц, возвращает только совпадающие строки.

SELECT *
FROM A
INNER JOIN B ON A.key = B.key;


🔹 FULL JOIN – объединяет все данные из обеих таблиц, заполняя пропущенные значения NULL.

SELECT *
FROM A
FULL JOIN B ON A.key = B.key;


🔹 FULL JOIN с фильтрацией NULL – выбирает только строки, которые есть только в одной из таблиц.

SELECT *
FROM A
FULL JOIN B ON A.key = B.key
WHERE A.key IS NULL OR B.key IS NULL;


🔹 LEFT JOIN – возвращает все строки из A и совпадающие строки из B.

SELECT *
FROM A
LEFT JOIN B ON A.key = B.key;


🔹 LEFT JOIN (только уникальные в A) – возвращает только строки из A, которых нет в B.

SELECT *
FROM A
LEFT JOIN B ON A.key = B.key
WHERE B.key IS NULL;


🔹 RIGHT JOIN – аналогично LEFT JOIN, но с приоритетом B.

SELECT *
FROM A
RIGHT JOIN B ON A.key = B.key;


🔹 RIGHT JOIN (только уникальные в B) – выбирает строки, которые есть в B, но отсутствуют в A.

SELECT *
FROM A
RIGHT JOIN B ON A.key = B.key
WHERE B.key IS NULL;


Сохраняйте в закладки и пользуйтесь!

📲 Мы в MAX

#db

👉 @database_info
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥52
В новой статье на Хабре Алексей Кременьков, бэкенд-разработчик в Яндекс 360, рассказывает о создании и эволюции сервиса динамического шардирования Sharpei для масштабирования PostgreSQL под нагрузкой в 300К+ RPS.

Пошагово разберём, как:

• Создали собственный инструмент для управления 700+ шардами PostgreSQL
• Справились с пиковыми нагрузками при миграциях
• Автоматизировали перенос пользователей между шардами и переехали в облако без даунтайма

Сервис Sharpei позволил Яндекс Почте перейти к гибкому горизонтальному масштабированию, полностью автоматизировать управление шардами и добиться четырёх девяток отказоустойчивости.

↘️ Подробнее читайте на Хабре
Please open Telegram to view this post
VIEW IN TELEGRAM
👍41🔥1
Оптимизация запросов: как найти узкое место? 🔍

Привет, коллеги! Сегодня я покажу вам, как находить узкие места в SQL-запросах и оптимизировать их. Если ваш запрос работает медленно, скорее всего, проблема в одном из трех мест:

1️⃣ Неверные индексы
- Проверьте EXPLAIN ANALYZE, если используется Seq Scan вместо Index Scan, значит, индексы либо отсутствуют, либо неэффективны.
- Добавьте индексы на часто фильтруемые и соединяемые поля.

2️⃣ Проблемные JOIN'ы
- Проверьте, какие типы JOIN используются. NESTED LOOP JOIN может быть проблемой на больших таблицах.
- Используйте HASH JOIN или MERGE JOIN, если это возможно.

3️⃣ Громоздкие операции (GROUP BY, ORDER BY, DISTINCT)
- Сортировка и группировка требуют много ресурсов.
- Можно ли заменить DISTINCT на EXISTS?
- Используйте индексированные столбцы в ORDER BY.



📲 Мы в MAX

#db

👉 @database_info
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
🧠 Почему PostgreSQL иногда "зависает" на UPDATE и как это пофиксить

Сегодня я расскажу про одну интересную особенность PostgreSQL, с которой сталкивался лично: внезапные подвисания при UPDATE большого количества строк. Причём CPU почти не загружен, а запрос как будто "висит".

📌 Проблема часто кроется в отсутствии индекса на колонку фильтра в WHERE. Пример:


UPDATE orders SET status = 'archived' WHERE created_at < '2022-01-01';


Если на created_at нет индекса, то PostgreSQL делает sequential scan всей таблицы. А теперь внимание: если в таблице много "мертвых" строк, которых ещё не убрал autovacuum, то PostgreSQL должен:

1. Прочитать кучу ненужных версий строк (MVCC).
2. Проверять видимость каждой строки.
3. Иногда ещё и ждать завершения других транзакций, держащих старые снапшоты.

🛠 Что делать:
- Проверить наличие индекса на колонку фильтра:

CREATE INDEX idx_orders_created_at ON orders(created_at);

- Проверить состояние autovacuum:

SELECT relname, n_dead_tup, last_vacuum, last_autovacuum
FROM pg_stat_user_tables ORDER BY n_dead_tup DESC;

- Можно вручную запустить:

VACUUM ANALYZE orders;


🔥 Лайфхак: если UPDATE всё равно медленный, попробуй его разбить на батчи по 10 000 строк. Это снизит нагрузку и ускорит выполнение.

📲 Мы в MAX

#db

👉 @database_info
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍5
Производительные или и выгодные базы данных в облаке

Безопасные, масштабируемые и отказоустойчивые базы данных — одна из ключевых потребностей любого проекта. Именно такие предлагает Selectel. СУБД под разные запросы: от универсальной PostgreSQL до поисковой и аналитической БД Opensearch

Новые клиенты сейчас могут получить до 30 000 бонусов на использование облачных баз данных Selectel. Провайдер гарантирует:

🔹Высокую производительность. Выбирайте оптимальную конфигурацию кластера на базе мощного железа и локальных NVMe-дисков.
🔹Надежность. Автоматические бесплатные бэкапы с восстановлением вплоть до секунды — на стороне Selectel. А создать отказоустойчивый кластер можно всего от двух нод и сэкономить до 33%.
🔹Гибкое масштабирование. При росте нагрузки можно поменять конфигурацию облачного сервера и количество реплик без простоя.

Успейте зарегистрироваться и оставить заявку на участие в акции, чтобы протестировать сервис бесплатно: https://slc.tl/kgir7

Реклама. АО "Селектел". erid:2W5zFGxeTWp
📊 Зачем DBA нужно уметь читать планы выполнения запросов (EXPLAIN)?

Почему навык чтения плана выполнения запроса - это не просто галочка в резюме, а реальный способ спасать прод от тормозов и неожиданных фулл-сканов.

Когда приходит запрос от разработчика: "Почему тормозит?" - ты открываешь EXPLAIN (ANALYZE, BUFFERS) и видишь:


Seq Scan on users (cost=0.00..44231.00 rows=1000000 width=64)
Filter: (status = 'active')


И тут всё понятно: фильтрация идёт по колонке без индекса, Postgres делает полный проход по таблице. Один CREATE INDEX - и запрос летит 🚀

Но не всё так просто. Иногда план говорит:


Index Scan using idx_users_status on users
Index Cond: (status = 'active')


А запрос всё равно медленный. Почему?

➡️ Buffers: shared hit=5 read=100000 dirtied=0 - вот оно. Индекс-то используется, но данные не в кэше, приходится читать с диска. А диск медленный. Решение? Подумать о горячем кэше, пачке RAM или REINDEX, если индекс раздулся.

Каждый EXPLAIN - как рентген. Не читаешь - лечишь наугад.

📲 Мы в MAX

#db

👉 @database_info
Please open Telegram to view this post
VIEW IN TELEGRAM
👍61
Миграция с MS SQL, Oracle и PostgreSQL проходит почти сама собой – возможно ли это? 🤔

📍Короткий ответ: Да.
Диасофт обновил свою СУБД Digital Q.DataBase, чтобы компании кардинально снижали сложность, сроки и стоимость импортозамещения в инфраструктуре баз данных 📉

Организации теперь могут проводить перенос данных и хранимой логики на российскую СУБД с сохранением существующих бизнес-процессов и с минимальными операционными рисками.

Это стало возможным благодаря обновлению "Полиглот" 🗣

Оно обеспечивает исполнение запросов, написанных на диалектах SQL ведущих зарубежных СУБД: Oracle, Microsoft SQL Server и PostgreSQL.

Подробно об этом расскажет спикер Диасофт на вебинаре 25 ноября.

🔗 Регистрируйтесь по ссылке!

#реклама
О рекламодателе
👍2
This media is not supported in your browser
VIEW IN TELEGRAM
Как работают джойны SQL?

На приведенной ниже схеме подробно показано, как работают 4 типа объединений SQL.

🔹INNER JOIN возвращает совпадающие строки в обеих таблицах
🔹LEFT JOIN возвращает все записи из левой таблицы и соответствующие записи из правой
🔹RIGHT JOIN возвращает все записи из правой таблицы и соответствующие записи из левой
🔹FULL OUTER JOIN возвращает все записи, в которых есть совпадения, в левой или правой таблице

📲 Мы в MAX

#db

👉 @database_info
Please open Telegram to view this post
VIEW IN TELEGRAM
👍31
26 ноября в Москве пройдет конференция «Код СберТеха» — событие для ИТ-профессионалов.
В «Кибердоме» участники смогут узнать всё о продуктах СберТеха и масштабных проектах, которые они помогают реализовать. Эксперты и продуктовые команды познакомят с инструментами для решения задач архитекторов, разработчиков, инженеров, системных аналитиков и других ИТ-специалистов.

В программе:

• Технические доклады по таким темам, как базы данных, инфраструктура, информационная безопасность, интеграционные сервисы, визуальное программирование
• Практические мастер-классы и демозоны с реальными кейсами
• Интерактивные квесты по продуктовым направлениям
• Неформальное общение — нетворкинг и музыкальная программа

Присоединяйтесь к мероприятию, чтобы заглянуть «за кулисы» проектов Сбера и других компаний. Вы увидите, как сложные системы работают в унисон, подобно слаженному оркестру, и найдёте идеи для собственных запусков.
Регистрируйтесь по ссылке.
1
Сегодня расскажу вам про одну часто недооценённую, но крайне полезную SQL-фишку — CROSS APPLY в SQL Server (и его аналог в других СУБД — LATERAL).

Когда обычный JOIN бессилен

Допустим, у нас есть таблица Orders, и мы хотим для каждой строки выбрать топ-1 продукт по сумме, но выборка зависит от строки — тут уже обычный JOIN не справится. Вот пример, где приходит на помощь CROSS APPLY:


SELECT
o.OrderID,
p.ProductName,
p.Amount
FROM Orders o
CROSS APPLY (
SELECT TOP 1 *
FROM Products p
WHERE p.OrderID = o.OrderID
ORDER BY p.Amount DESC
) p;


Что делает CROSS APPLY?

Он буквально говорит: «Для каждой строки из Orders выполни подзапрос с её параметрами». Это похоже на foreach, где внутренняя выборка может меняться в зависимости от строки внешней таблицы.

Аналог в PostgreSQL:


SELECT
o.order_id,
p.product_name,
p.amount
FROM orders o,
LATERAL (
SELECT *
FROM products p
WHERE p.order_id = o.order_id
ORDER BY p.amount DESC
LIMIT 1
) p;




🔥 Используйте CROSS APPLY, когда:
- Нужна подстрочная логика внутри запроса
- Не получается реализовать через обычный JOIN
- Вы работаете с функциями, которые возвращают таблицу (TVF)

📲 Мы в MAX

#db

👉 @database_info
Please open Telegram to view this post
VIEW IN TELEGRAM
👍92
SQL. Как работать с датами в SQL Server

Из строки в дату и обратно
Приведение строки к дате


-- формат dd.mm.yyyy
select try_convert(date, isnull(@fielddateBirth,'01.01.1980'), 104)


-- формат yyyy-mm-dd
select try_convert(date, isnull(@fielddateBirth,'1980-01-01'), 23)


Приведение даты к строке


-- формат dd.MM.yyyy
select try_convert(nvarchar(16), getdate(), 104)


-- формат yyyy-mm-dd
select convert(nvarchar, isnull(dateBirth,'1900-01-01'), 23)


Приведение даты к строке в заданном формате:


select format(getdate(), 'dd.MM.yyyy HH:mm')


Полезные функции по работе с датами


select getdate() -- получить текущую дату

select dateadd(day, 7, getdate()) -- добавить 7 дней к дате

select dateadd(month, -2, getdate()) -- отнять 2 месяца от даты

select datediff(minute, date1, date2) -- получить разницу в минутах между date2 и date1

SELECT DAY(GETDATE()) -- 28 получить день даты (аналогично month, year, week)

SELECT DATENAME(month, GETDATE()) -- July получить название месяца

SELECT DATEPART(month, GETDATE()) -- 7 получить часть даты (например, месяц, год или день)

SELECT DATEFROMPARTS(2017, 7, 28) -- 2017-07-28 строит дату из частей

SELECT ISDATE('2017-07-28') -- 1 - проверка является ли строка датой


Полезные вычисления по датам (типовые задачи)


-- начало и конец недели
SET DATEFIRST 4 /* or use any other weird value to test it */
DECLARE @d DATETIME = GETDATE()
SELECT
@d ThatDate,
cast( DATEADD(dd, 0 - (@@DATEFIRST + 5 + DATEPART(dw, @d)) % 7, @d) as date) Monday,
cast(DATEADD(dd, 6 - (@@DATEFIRST + 5 + DATEPART(dw, @d)) % 7, @d) as date) Sunday


-- начало месяца
SELECT DATEADD(month, DATEDIFF(month, 0, @d), 0) AS StartOfMonth

-- номер недели в году
set datefirst 1;
select datepart(week, '2017-02-01');

-- получение дня недели
select datename(dw,getdate()) --Thursday
select datepart(dw,getdate()) --2



📲 Мы в MAX

#db

👉 @database_info
Please open Telegram to view this post
VIEW IN TELEGRAM
👍31
🧩 Сегодня покажу вам простой, но крайне полезный приём, как находить “тяжёлые” запросы в PostgreSQL, которые тормозят базу.

📌 Если у вас база под нагрузкой, и “что-то всё стало медленно”, первым делом проверьте:


SELECT pid, now() - query_start AS duration, query
FROM pg_stat_activity
WHERE state = 'active'
ORDER BY duration DESC
LIMIT 5;


Этот запрос показывает топ-5 самых долгих активных запросов. Обратите внимание на query_start - именно он поможет понять, кто завис и тормозит остальных.

А если хотите посмотреть историю медленных запросов за последние часы/дни - подключайте pg_stat_statements:


SELECT
calls,
total_time,
mean_time,
query
FROM pg_stat_statements
ORDER BY total_time DESC
LIMIT 10;


🔍 Тут видно, какие запросы в сумме "съели" больше всего времени. И это гораздо честнее, чем смотреть только на mean_time или calls по отдельности.

💡Совет: подключите pg_stat_statements на проде и делайте такой анализ хотя бы раз в неделю. Это поможет находить проблемные места в приложении до того, как начнётся пожар.

📲 Мы в MAX

#db

👉 @database_info
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12
Миграция с MS SQL, Oracle и PostgreSQL проходит почти сама собой – возможно ли это? 🤔

📍Короткий ответ: Да.
Диасофт обновил свою СУБД Digital Q.DataBase, чтобы компании кардинально снижали сложность, сроки и стоимость импортозамещения в инфраструктуре баз данных 📉

Организации теперь могут проводить перенос данных и хранимой логики на российскую СУБД с сохранением существующих бизнес-процессов и с минимальными операционными рисками.

Это стало возможным благодаря обновлению "Полиглот" 🗣

Оно обеспечивает исполнение запросов, написанных на диалектах SQL ведущих зарубежных СУБД: Oracle, Microsoft SQL Server и PostgreSQL.

Подробно об этом расскажет спикер Диасофт на вебинаре 25 ноября.

🔗 Регистрируйтесь по ссылке!

Реклама. ООО "ДИАСОФТ ЭКОСИСТЕМА". ИНН 9715403607.
👍1