Новый бесплатный курс от Anthropic!
Agent Skills: пошагово и с нуля
✓ Создание навыков (Skills) и лучшие практики
✓ Отличия от Tools и MCP
✓ Для Claude Code и Visual Studio Code
2 часа контента и 10 видеоуроков
→ deeplearning.ai/short-courses/agent-skills-with-anthropic/
👉 @SQLPortal
Agent Skills: пошагово и с нуля
✓ Создание навыков (Skills) и лучшие практики
✓ Отличия от Tools и MCP
✓ Для Claude Code и Visual Studio Code
2 часа контента и 10 видеоуроков
→ deeplearning.ai/short-courses/agent-skills-with-anthropic/
Please open Telegram to view this post
VIEW IN TELEGRAM
www.deeplearning.ai
Agent Skills with Anthropic
Equip agents with expert on-demand knowledge to enable reliable coding, research, and data analysis workflows
Лето начинается: водные развлечения, гриль на острове и новые маршруты в бутик-отеле «Заонежье»
Для гостей бутик-отеля «Заонежье» к новому сезону подготовлены лесные трассы для первых заездов на новых квадроциклах — они позволяют исследовать дикие уголки карельской тайги и скалистые берега озер. Велопрогулки по дорогам Заонежья стали еще комфортнее благодаря электробайкам, которые этой весной пополнили велопарк отеля.
В мае, в отеле открылся сезон водных развлечений: гостям доступны сапы, каяки и весельные лодки. В этом году пользование ими - комплементарное для всех гостей. Также появились новые маршруты для катеров по заливам Онежского озера.
Ресторан «Руна» представляет летнюю серию гриль-сетов, которые можно приготовить самостоятельно на одном из необитаемых островов или устроить барбекю на лужайке у дома. В меню — овощные и рыбные сеты, а также мясное ассорти.
Бутик-отель «Заонежье» приглашает к активному отдыху среди озер и северной природы Карелии.
Для гостей бутик-отеля «Заонежье» к новому сезону подготовлены лесные трассы для первых заездов на новых квадроциклах — они позволяют исследовать дикие уголки карельской тайги и скалистые берега озер. Велопрогулки по дорогам Заонежья стали еще комфортнее благодаря электробайкам, которые этой весной пополнили велопарк отеля.
В мае, в отеле открылся сезон водных развлечений: гостям доступны сапы, каяки и весельные лодки. В этом году пользование ими - комплементарное для всех гостей. Также появились новые маршруты для катеров по заливам Онежского озера.
Ресторан «Руна» представляет летнюю серию гриль-сетов, которые можно приготовить самостоятельно на одном из необитаемых островов или устроить барбекю на лужайке у дома. В меню — овощные и рыбные сеты, а также мясное ассорти.
Бутик-отель «Заонежье» приглашает к активному отдыху среди озер и северной природы Карелии.
😁1
Начиная с Oracle 21c, массивы PL/SQL можно инициализировать через конструкторы с циклом
Такие конструкторы позволяют перебирать:
значения —
результат курсора —
Для задания собственных индексов можно использовать необязательное выражение
👉 @SQLPortal
FOR.array := arr_type ( FOR i IN ... )
Такие конструкторы позволяют перебирать:
значения —
IN x .. yрезультат курсора —
IN ( SELECT ... )Для задания собственных индексов можно использовать необязательное выражение
INDEX.Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Появился
По многочисленным просьбам автор вынес один из самых полезных инструментов своего агентного пайплайна в отдельный skill для Claude Code, Codex и других агентных сред.
После того как агент внёс изменения, достаточно выполнить:
Дальше инструмент автоматически проверит изменения и поможет найти проблемы до коммита.
По словам автора, код, сгенерированный ИИ, даже лучшими моделями, пока нельзя безоговорочно принимать и мержить без тщательной проверки.
Его собственная статистика:
68% изменений содержали проблемы
эти проблемы могли попасть в основную ветку, если бы их не обнаружил no-mistakes
Раньше инструмент запускался только через:
Теперь доступен и как skill.
Исходный код открыт и распространяется бесплатно: https://github.com/kunchenguid/no-mistakes
Для настройки в репозитории:
👉 @SQLPortal
/no-mistakes.По многочисленным просьбам автор вынес один из самых полезных инструментов своего агентного пайплайна в отдельный skill для Claude Code, Codex и других агентных сред.
После того как агент внёс изменения, достаточно выполнить:
/no-mistakesДальше инструмент автоматически проверит изменения и поможет найти проблемы до коммита.
По словам автора, код, сгенерированный ИИ, даже лучшими моделями, пока нельзя безоговорочно принимать и мержить без тщательной проверки.
Его собственная статистика:
68% изменений содержали проблемы
эти проблемы могли попасть в основную ветку, если бы их не обнаружил no-mistakes
Раньше инструмент запускался только через:
git push no-mistakesТеперь доступен и как skill.
Исходный код открыт и распространяется бесплатно: https://github.com/kunchenguid/no-mistakes
Для настройки в репозитории:
no-mistakes initPlease open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
😁1
«Но ведь запрос был быстрым на dev и staging!»
Какие признаки говорят о том, что запрос работает быстро локально, но в production потребует отдельного внимания к производительности?
Есть две точки, после которых простой запрос начинает заметно замедляться:
Сортировка перестаёт помещаться в память.
Сканирование таблицы начинает читать данные с диска.
Примеры ниже показаны на небольших стендах с ограниченными ресурсами. В крупных системах картина будет такой же, только с гораздо большим количеством строк.
Простой запрос:
Без индекса PostgreSQL приходится сканировать всю таблицу, чтобы найти события пользователя, даже если нужных строк совсем немного.
(Небольшая оговорка: если для пользователя нет ни одной строки, PostgreSQL может решить вообще не сканировать таблицу, используя статистику по таблице и колонкам.)
Фаза 1. Всё помещается в память
Таблица содержит 10 000 строк.
Для
Что видно ((фото1):
Все 5 000 строк были отсортированы прямо в RAM.
PostgreSQL всё равно прочитал остальные 5 000 строк и отбросил их.
Все страницы уже находились в памяти (
Фаза 2. Сортировка начинает писать на диск
Теперь в таблице 200 000 строк.
У пользователя уже 100 000 событий.
Что изменилось (2):
Сортировка больше не помещается в память и начинает использовать временные файлы.
PostgreSQL записал 843 временные страницы на диск и затем прочитал их обратно во время merge-фазы.
Ещё 100 тысяч строк были прочитаны только для того, чтобы потом их выбросить.
Фаза 3. Таблица перестаёт помещаться в буферный кеш
Всего уже 600 000 строк.
Из них 100 000 принадлежат нужному пользователю, остальные 500 000 — другим пользователям.
PostgreSQL всё равно вынужден читать их.
Размер таблицы становится больше
(3 фото)
Планировщик запустил 2 параллельных воркера.
Сканирование и сортировка были распределены между 3 процессами, поэтому каждый сортировал примерно по 33 000 строк вместо 100 000.
Но основные проблемы остались:
Таблица перестала помещаться в буферный кеш. Более 3 000 страниц пришлось читать с диска.
Было прочитано и выброшено около 500 тысяч строк.
Все три сортировки всё равно использовали
Параллелизм уменьшил объём работы на каждый процесс, но не убрал запись на диск.
Решение зависит от конкретного приложения.
Самый очевидный вариант:
Такой индекс позволяет резко сократить объём сортировки и избежать полного сканирования таблицы.
Но индекс далеко не единственный вариант.
В зависимости от нагрузки могут помочь:
- кэширование на уровне приложения;
- materialized views;
- партиционирование таблиц;
- изменение модели хранения данных.
Главный вывод простой:
Если в
большие значения
то запрос, который отлично работал на dev-базе с 10 тысячами строк, уже начинает показывать, что будет происходить в production на миллионах записей.
👉 @SQLPortal
Какие признаки говорят о том, что запрос работает быстро локально, но в production потребует отдельного внимания к производительности?
Есть две точки, после которых простой запрос начинает заметно замедляться:
Сортировка перестаёт помещаться в память.
Сканирование таблицы начинает читать данные с диска.
Примеры ниже показаны на небольших стендах с ограниченными ресурсами. В крупных системах картина будет такой же, только с гораздо большим количеством строк.
Простой запрос:
SELECT user_id, event_type, created_at
FROM events
WHERE user_id = 1
ORDER BY created_at DESC
Без индекса PostgreSQL приходится сканировать всю таблицу, чтобы найти события пользователя, даже если нужных строк совсем немного.
(Небольшая оговорка: если для пользователя нет ни одной строки, PostgreSQL может решить вообще не сканировать таблицу, используя статистику по таблице и колонкам.)
Фаза 1. Всё помещается в память
Таблица содержит 10 000 строк.
Для
user_id = 1 найдено 5 000 событий.work_mem = 1MB.Что видно ((фото1):
Sort Method: quicksort Memory: 427kBВсе 5 000 строк были отсортированы прямо в RAM.
Rows Removed by Filter: 5000PostgreSQL всё равно прочитал остальные 5 000 строк и отбросил их.
Buffers: shared hit=74Все страницы уже находились в памяти (
shared_buffers).Фаза 2. Сортировка начинает писать на диск
Теперь в таблице 200 000 строк.
У пользователя уже 100 000 событий.
work_mem всё ещё равен 1 MB.Что изменилось (2):
Sort Method: external merge Disk: 3352kBСортировка больше не помещается в память и начинает использовать временные файлы.
temp read=836 written=843PostgreSQL записал 843 временные страницы на диск и затем прочитал их обратно во время merge-фазы.
Rows Removed by Filter: 100000Ещё 100 тысяч строк были прочитаны только для того, чтобы потом их выбросить.
Фаза 3. Таблица перестаёт помещаться в буферный кеш
Всего уже 600 000 строк.
Из них 100 000 принадлежат нужному пользователю, остальные 500 000 — другим пользователям.
PostgreSQL всё равно вынужден читать их.
Размер таблицы становится больше
shared_buffers.(3 фото)
Планировщик запустил 2 параллельных воркера.
Сканирование и сортировка были распределены между 3 процессами, поэтому каждый сортировал примерно по 33 000 строк вместо 100 000.
Но основные проблемы остались:
shared read=3049Таблица перестала помещаться в буферный кеш. Более 3 000 страниц пришлось читать с диска.
Rows Removed by Filter: 166667 × 3Было прочитано и выброшено около 500 тысяч строк.
Все три сортировки всё равно использовали
external mergeПараллелизм уменьшил объём работы на каждый процесс, но не убрал запись на диск.
Решение зависит от конкретного приложения.
Самый очевидный вариант:
CREATE INDEX idx_events_user_created_at
ON events (user_id, created_at DESC);
Такой индекс позволяет резко сократить объём сортировки и избежать полного сканирования таблицы.
Но индекс далеко не единственный вариант.
В зависимости от нагрузки могут помочь:
- кэширование на уровне приложения;
- materialized views;
- партиционирование таблиц;
- изменение модели хранения данных.
Главный вывод простой:
Если в
EXPLAIN ANALYZE появляются:external mergetemp read / temp writtenбольшие значения
Rows Removed by Filtershared readто запрос, который отлично работал на dev-базе с 10 тысячами строк, уже начинает показывать, что будет происходить в production на миллионах записей.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤1
VIEW (представления)
🧠 Что такое VIEW?
VIEW — это виртуальная таблица, построенная на основе SQL-запроса.
Данные в ней не хранятся
Хранится только запрос
Проще говоря:
Зачем нужны VIEW?
- упрощают сложные запросы
- позволяют переиспользовать логику
- помогают скрывать чувствительные данные
- делают SQL-код понятнее
Создание VIEW
Использование VIEW
Работает почти так же, как обычная таблица.
Обновление VIEW
Удаление VIEW
Практический пример
Создадим представление со средней зарплатой по отделам:
Использование:
Важные моменты
VIEW не хранит данные
изменения в исходной таблице сразу отражаются в VIEW
VIEW можно использовать в запросах как обычную таблицу
Практика
Создайте VIEW для сотрудников с зарплатой выше 40 000
Создайте VIEW для сотрудников отдела IT
Создайте VIEW со средней зарплатой по отделам
Выполните запросы к созданным VIEW
Удалите одно из представлений
Решения
1. Сотрудники с зарплатой выше 40 000
2. Сотрудники отдела IT
3. Средняя зарплата по отделам
4. Запросы к представлениям
5. Удаление представления
Мини-задача
Создайте VIEW, который показывает 3 сотрудников с самой высокой зарплатой.
Решение
Использование:
Где VIEW используют чаще всего?
- дашборды
- системы отчётности
- аналитические проекты
Потому что представления позволяют скрыть сложную SQL-логику за простым запросом.
👉 @SQLPortal
VIEW — это виртуальная таблица, построенная на основе SQL-запроса.
Данные в ней не хранятся
Хранится только запрос
Проще говоря:
VIEW = сохранённый SQL-запрос, который можно использовать как таблицу
Зачем нужны VIEW?
- упрощают сложные запросы
- позволяют переиспользовать логику
- помогают скрывать чувствительные данные
- делают SQL-код понятнее
Создание VIEW
CREATE VIEW high_salary_emp AS
SELECT name, salary
FROM employees
WHERE salary > 50000;
Использование VIEW
SELECT * FROM high_salary_emp;
Работает почти так же, как обычная таблица.
Обновление VIEW
CREATE OR REPLACE VIEW high_salary_emp AS
SELECT name, salary, department
FROM employees
WHERE salary > 50000;
Удаление VIEW
DROP VIEW high_salary_emp;
Практический пример
Создадим представление со средней зарплатой по отделам:
CREATE VIEW dept_avg_salary AS
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department;
Использование:
SELECT * FROM dept_avg_salary;
Важные моменты
VIEW не хранит данные
изменения в исходной таблице сразу отражаются в VIEW
VIEW можно использовать в запросах как обычную таблицу
Практика
Создайте VIEW для сотрудников с зарплатой выше 40 000
Создайте VIEW для сотрудников отдела IT
Создайте VIEW со средней зарплатой по отделам
Выполните запросы к созданным VIEW
Удалите одно из представлений
Решения
1. Сотрудники с зарплатой выше 40 000
CREATE VIEW high_salary_emp AS
SELECT *
FROM employees
WHERE salary > 40000;
2. Сотрудники отдела IT
CREATE VIEW it_employees AS
SELECT *
FROM employees
WHERE department = 'IT';
3. Средняя зарплата по отделам
CREATE VIEW dept_avg_salary AS
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department;
4. Запросы к представлениям
SELECT * FROM high_salary_emp;
SELECT * FROM it_employees;
SELECT * FROM dept_avg_salary;
5. Удаление представления
DROP VIEW high_salary_emp;
Мини-задача
Создайте VIEW, который показывает 3 сотрудников с самой высокой зарплатой.
Решение
CREATE VIEW top_3_salary AS
SELECT *
FROM employees
ORDER BY salary DESC
LIMIT 3;
Использование:
SELECT * FROM top_3_salary;
Где VIEW используют чаще всего?
- дашборды
- системы отчётности
- аналитические проекты
Потому что представления позволяют скрыть сложную SQL-логику за простым запросом.
Таблица хранит данные.
VIEW хранит запрос.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
PostgreSQL защищает «горячие» данные от вытеснения во время больших последовательных сканирований с помощью Sequential Scan Ring Buffer.
В этом посте посмотрим, сколько раз можно употребить термин
Без Sequential Scan Ring Buffer один запрос вида
Что такое ring buffer?
Когда PostgreSQL обнаруживает большое последовательное сканирование, он переключается на стратегию ring buffer: временное циклическое окно, выделенное внутри
По мере выполнения сканирования страницы проходят через этот буфер по кругу и сразу становятся кандидатами на вытеснение после использования. Благодаря этому основной кеш остаётся изолированным.
Размер ring buffer зависит от типа операции:
Большие последовательные сканирования — базовый размер составляет 32 страницы (256 КБ), но в PostgreSQL 17+ может немного увеличиваться для асинхронного ввода-вывода.
VACUUM — по умолчанию 256 страниц (2 МБ), начиная с PostgreSQL 16. Настраивается через
COPY и другие операции массовой записи — 2048 страниц (16 МБ).
Срабатывает при 25% от
Порог рассчитывается как:
Если размер сканируемой таблицы превышает четверть
Для операций обслуживания действуют отдельные правила. Размер ring buffer для VACUUM задаётся параметром
Что это означает на практике. Данные приложения защищены от вытеснения большими сканированиями. Если рабочий набор помещается в
Результаты последовательного сканирования таблиц, размер которых превышает
Каждый параллельный воркер, выполняющий последовательное сканирование, использует собственный ring buffer. Это увеличивает пропускную способность больших сканирований и одновременно защищает основной пул буферов.
Таблицы, размер которых находится чуть ниже порога в 25% от
👉 @SQLPortal
В этом посте посмотрим, сколько раз можно употребить термин
shared_buffers... поехали.Без Sequential Scan Ring Buffer один запрос вида
SELECT * FROM large_table загрузил бы все страницы большой таблицы в shared_buffers, вытеснив всё, что уже находилось в кеше. Один «холодный» аналитический запрос мог бы полностью разрушить рабочий набор данных всех остальных сессий.Что такое ring buffer?
Когда PostgreSQL обнаруживает большое последовательное сканирование, он переключается на стратегию ring buffer: временное циклическое окно, выделенное внутри
shared_buffers.По мере выполнения сканирования страницы проходят через этот буфер по кругу и сразу становятся кандидатами на вытеснение после использования. Благодаря этому основной кеш остаётся изолированным.
Размер ring buffer зависит от типа операции:
Большие последовательные сканирования — базовый размер составляет 32 страницы (256 КБ), но в PostgreSQL 17+ может немного увеличиваться для асинхронного ввода-вывода.
VACUUM — по умолчанию 256 страниц (2 МБ), начиная с PostgreSQL 16. Настраивается через
vacuum_buffer_usage_limit.COPY и другие операции массовой записи — 2048 страниц (16 МБ).
Срабатывает при 25% от
shared_buffersПорог рассчитывается как:
shared_buffers / 4Если размер сканируемой таблицы превышает четверть
shared_buffers, PostgreSQL использует стратегию ring buffer.Для операций обслуживания действуют отдельные правила. Размер ring buffer для VACUUM задаётся параметром
vacuum_buffer_usage_limit, но PostgreSQL автоматически ограничивает этот буфер значением не более 1/8 от размера shared_buffers.Что это означает на практике. Данные приложения защищены от вытеснения большими сканированиями. Если рабочий набор помещается в
shared_buffers, он останется в кеше даже при запуске крупного последовательного сканирования.Результаты последовательного сканирования таблиц, размер которых превышает
shared_buffers, не будут сохраняться в кеше PostgreSQL. При этом повторные чтения всё ещё могут обслуживаться из page cache операционной системы без обращения к физическому диску.Каждый параллельный воркер, выполняющий последовательное сканирование, использует собственный ring buffer. Это увеличивает пропускную способность больших сканирований и одновременно защищает основной пул буферов.
Таблицы, размер которых находится чуть ниже порога в 25% от
shared_buffers, всё ещё могут вызывать вытеснение данных из кеша.Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
This media is not supported in your browser
VIEW IN TELEGRAM
Вышел Extend UI — open-source набор компонентов для документных агентов.
Что внутри:
✓ 14 готовых компонентов и примеров
✓ Просмотр PDF, DOCX и XLSX
✓ Bounding box citations
✓ Загрузка файлов
✓ Электронная подпись
✓ Полная кастомизация
✓ MIT-лицензия
Команда перепробовала десятки просмотрщиков документов и UI-библиотек, но ни одна не закрывала все их требования по функциональности и UX.
В итоге они собрали собственное решение для Extend.
Изначально проект был внутренним инструментом, но после многочисленных запросов клиентов его решили открыть для сообщества.
Подойдёт для агентных систем, пользовательских документных сценариев и внутренних корпоративных инструментов.
Бонус: компонентами уже ежедневно пользуются на миллионах страниц документов внутри Extend, так что проект успел пройти хорошую проверку в продакшене.
👉 @SQLPortal
Что внутри:
✓ 14 готовых компонентов и примеров
✓ Просмотр PDF, DOCX и XLSX
✓ Bounding box citations
✓ Загрузка файлов
✓ Электронная подпись
✓ Полная кастомизация
✓ MIT-лицензия
Команда перепробовала десятки просмотрщиков документов и UI-библиотек, но ни одна не закрывала все их требования по функциональности и UX.
В итоге они собрали собственное решение для Extend.
Изначально проект был внутренним инструментом, но после многочисленных запросов клиентов его решили открыть для сообщества.
Подойдёт для агентных систем, пользовательских документных сценариев и внутренних корпоративных инструментов.
Бонус: компонентами уже ежедневно пользуются на миллионах страниц документов внутри Extend, так что проект успел пройти хорошую проверку в продакшене.
Please open Telegram to view this post
VIEW IN TELEGRAM