Как стать автором
Обновить
81.4

SQL *

Формальный непроцедурный язык программирования

Сначала показывать
Период
Уровень сложности

Django против N+1 запросов: оптимизация с помощью select_related и prefetch_related

Уровень сложностиПростой
Время на прочтение5 мин
Количество просмотров1.6K

Привет, Хабр!

Сегодня рассмотрим проблему N+1 запросов в Django. N+1 запросы появляются, когда ваш код делает много мелких SQL-запросов вместо нескольких крупных.

Читать далее

SQL HowTo: поиск в словаре и массивах, сортировка «пузырьком» (Advent of Code 2024, Day 5: Print Queue)

Уровень сложностиСредний
Время на прочтение8 мин
Количество просмотров1.6K

В этой челлендж-серии статей попробуем использовать PostgreSQL как среду для решения задач Advent of Code 2024.

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

В этой части воспользуемся обширными возможностями поиска в массивах и реализуем рекурсивную сортировку «пузырьком».

Читать далее

Поиск «токсичных» SQL-запросов

Уровень сложностиСредний
Время на прочтение12 мин
Количество просмотров11K

Мы, студенты из МИФИ, Даниил и Александр, пришли на стажировку в Сбербанк в департамент SberData, который занимается развитием внутренней корпоративной аналитической платформы (КАП).Это современная платформа с удобными инструментами созданная для закрытия полного спектра потребностей Сбера в работе с данными, таких как хранение, интеграция, разнообразная аналитика, отчетность, моделирование и контроль качества данных. Все эти направления было бы трудно развивать без отдельного R&D подразделения, в составе которого мы и работаем. Сегодня мы хотим поделиться нашим исследованием в области проектирования алгоритмов в выявлении «токсичных» SQL‑запросов с помощью машинного обучения. Почему же запросы называются именно «токсичные»? Они затрачивают на своё выполнение слишком большое количество ресурсов, а именно времени. На самом деле не только время, но для упрощения мы будем считать только время, так как это ключевой параметр.

Статья посвящена исследованию существующих подходов и их апробации на открытых данных. В качестве общедоступных данных были выбраны данные из таких бенчмарков, как TPC‑H и BIRD. Помимо этого, в статье рассматриваются некоторые трудности, с которыми мы столкнулись при работе над задачей, например, генерация данных и SQL‑запросов, а также миграция между диалектами SQL. В конце статьи мы опишем оригинальный подход, к которому по итогу пришли. В следующей статье мы расскажем о применении полученного опыта для реальной промышленной системы.

Читать далее

BI для оценки полезности BI: огранка логов по методу АЛРОСА

Уровень сложностиСредний
Время на прочтение9 мин
Количество просмотров1.4K

В наше время цифровизация процессов и событий вокруг нас имеет всё большую и большую востребованность. По этой причине важно понимать не только плановые и фактические показатели, но также и динамику их изменений. В этой статье я расскажу, как мы реализовали систему мониторинга востребованности дашбордов. Разработчики называют это визуализацией над визуализацией. Под катом подробный рассказ с примером кода, так что все желающие смогут повторить подобное на своей BI системе, если вы также выбрали гибкую платформу для своих задач.

Читать далее

Как мы ускорили Trino, научив оптимизатор удалять ненужные Join

Уровень сложностиПростой
Время на прочтение10 мин
Количество просмотров2.9K

Как мы ускорили запросы в Trino, научив оптимизатор удалять из плана лишние операторы Join.

Обсудим, почему в аналитических запросах часто возникают избыточные Join, почему это плохо для SQL-движков, какие эквивалентные преобразования позволяют избавиться от ненужных Join, и с какими проблемами мы столкнулись при интеграции данного функционала в наш форк Trino.

Читать далее

Работа с данными в DuckDB или не pandas’ом единым сыт DS

Время на прочтение9 мин
Количество просмотров2.2K

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

Этот этап требует не только времени, но и вычислительных ресурсов, особенно когда речь идет о больших объемах информации. В этой статье я расскажу о своем небольшом исследовании DuckDB — инструменте, который может значительно упростить и ускорить работу с данными.

Читать далее

Как заставить вашу базу данных летать, а не ползать. Часть 1 масштабирование и репликация

Уровень сложностиСредний
Время на прочтение10 мин
Количество просмотров12K

Всем привет! Меня зовут Илья Криволапов, тружусь системным аналитиком в SENSE на проекте одного из цветных банков РФ. В профессии я уже пятый год и, несмотря на фамилию, ломал прод всего лишь несколько незначительных раз (надеюсь). 

На досуге я преподаю в университете дисциплину «Хранение и обработка больших объемов данных» и за все время у меня накопилось много полезной информации. Непростительно хранить такой клад у себя в столе, поэтому я подготовил для читателей Хабра ультимативный гайд по оптимизации или хорошему такому, грамотному проектированию баз данных с расчетом на масштабирование.

Всего в цикле будет 3 статьи. В первой поговорим о двух разных подходах масштабирования БД и о том, как лучше его делать и как лучше не делать (Никогда. Пожалуйста). 

Кому будет полезно? Всем отвечающим за «здоровье» базы данных: DBA, архитекторам, DevOps-инженерам, аналитикам и разработчикам. 

Согласны? Узнали? Тогда поехали!

Читать далее

SQL и нейросети: изучаем логику моделей через анализ и визуализацию весов

Уровень сложностиПростой
Время на прочтение27 мин
Количество просмотров4.1K

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

В статье разберём, как хранить и извлекать веса, вычислять ключевые метрики и строить графики.

Читать далее

Что нужно знать, чтобы писать быстрые SQL-запросы

Уровень сложностиСредний
Время на прочтение21 мин
Количество просмотров31K

Привет, я Марк Шевченко, ведущий разработчик, ИТ‑холдинг Т1. SQL — мощный декларативный язык, который скрывает от программиста большинство технических деталей. Проектировщики языка предполагали, что его простота поможет не‑программистам работать с данными самостоятельно. К сожалению, простота имеет свою цену, и эта цена — производительность. Некоторые несложные запросы работают слишком медленно, что становится неприятным сюрпризом как для программистов, так и для пользователей.

В попытках повысить производительность начинающие программисты зачастую действуют методом перебора, а это не самый быстрый способ обучения. Для того чтобы писать эффективные запросы, требуется понимание принципов работы СУБД.

В этой статье я расскажу о производительности запросов SELECT. Акцент буду делать не на подробности конкретных реализаций, а на фундамент. В то же время буду иллюстрировать общие положения реальными примерами.

Читать далее

pg_auto_embeddings — считаем эмбеддинги для текста прямо в Postgres, без экстеншенов

Уровень сложностиПростой
Время на прочтение4 мин
Количество просмотров2.2K

У вас есть Postgres, где хранится множество текстовых данных. Вы хотите использовать векторные представления (embeddings), к примеру, от OpenAI/Anthropic, чтобы построить систему рекомендаций, улучшенный поиск или реализовать RAG для работы с LLM. Но при этом ставить расширения (extensions) не хочется, а может, и вовсе нельзя — например, в облачных Managed PostgreSQL зачастую нет нужных прав.

Под катом описание open-source решения pg_auto_embeddings, которое вам поможет.

Скорее под кат!

«Колонизаторы» на SQL

Уровень сложностиСредний
Время на прочтение13 мин
Количество просмотров4.2K

Думаю, почти все читатели хотя бы раз играли в Колонизаторов.
Настольная игра "Колонизаторы" стала одним из лучших новогодних подарков для автора текста.
Мы с друзьями провели много времени, играя в эту игру, и, должен сказать, нам было довольно весело.

В этой небольшой статье мы нарисуем игровое поле для Колонизаторов с помощью SQL.

Читать далее

Асинхронный SQLAlchemy 2: улучшение кода, методы обновления и удаления данных

Время на прочтение20 мин
Количество просмотров13K

Третья статья цикла по асинхронному SQLAlchemy 2 посвящена оптимизации кода, обновлению и удалению данных. Рассмотрены улучшения базового класса, подходы к обновлению записей и методы удаления, с акцентом на повышение производительности. Нажмите «Читать», чтобы ознакомиться с материалом.

Читать далее

Мысли вслух. Создание распределенного вычислительного кластера для СУБД

Время на прочтение14 мин
Количество просмотров3.7K

Привет, меня зовут Владимир Сердюк. Я основатель компании Софтпоинт и этой статьей хочу открыть цикл, посвященный распределенным кластерам СУБД с возможностью равномерного распределения нагрузки по всем его серверам.

Идеи создания распределенного вычислительного кластера СУБД (далее РВК) посещали меня достаточно давно. Если упрощенно описать, то программное обеспечение РВК позволяет объединить множество серверов в один суперсервер (кластер), осуществляющий равномерную балансировку всех запросов между отдельными серверами. При этом для приложения, которое работает на РВК все будет выглядеть как будто оно работает с одним сервером и одной базой данных (далее БД), это будут не разрозненные базы данных на распределенных серверах, а как будто одна виртуальная. Все сетевые протоколы, репликационные обмены, прокси-перенаправления будут скрыты внутри РВК. При этом будут эффективно и равномерно использоваться все ресурсы распределенных серверов, в частности, оперативная память и процессорное время.

Читать далее

Ближайшие события

Преимущества DAX на примерах

Уровень сложностиПростой
Время на прочтение3 мин
Количество просмотров5.3K

Популярным языком запросов от Microsoft является DAX. В отличие от диалектов SQL, DAX позволяет аналитикам сфокусироваться на решении задач бизнес-аналитики, вместо того, чтобы заниматься рутинными техническими задачами (например, вопросами производительности).

Безусловно, DAX не является панацеей для решения любых задач, но, если честно, ознакомление с этим функциональным языком может быть своего рода открытием, что создать единый язык для всех SQL диалектов - это вообще "doable", причем поддерживаются практически все имеющиеся базы данных многих видов (например, реляционные, колоночные), а также обеспечивается высокая производительность запросов.

В этой статье рассматриваются преимущества DAX на конкретных примерах, таким образом, если Вам интересен Business Intelligence на DAX - добро пожаловать :)

Читать далее

Паттерн Unit of Work в Python с SQLAlchemy

Уровень сложностиПростой
Время на прочтение7 мин
Количество просмотров6.8K

Unit of Work отслеживает все объекты, которые были загружены в память и изменены в ходе выполнения программы. Он управляет их состояниями и сохраняет изменения в базе данных в конце транзакции. Это делается с использованием сессий, которые действуют как контейнеры для всех изменений.

Когда работа завершена, Unit of Work выполняет commit для всех изменений, сохраняя их в базе данных. Если что-то пошло не так, выполняется rollback, и база данных возвращается в состояние до начала транзакции.

В данной статье рассмотрим, как реализовать паттерн Unit of Work с использованием SQLAlchemy.

Читать далее

Три фичи PostgreSQL, которые будут полезны каждому новичку

Время на прочтение5 мин
Количество просмотров22K

Думаю, вы знаете, что поиск эффективных решений – это половина успеха. Я сам прошел через все эти тернии, когда работа с данными казалась слишком сложной и запутанной. И именно тогда я открыл для себя потрясающие возможности PostgreSQL, которые значительно упростили мою жизнь.

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

Эти фичи уже не раз выручали меня в сложных проектах, и я уверен, что они станут надежными помощниками и в вашей разработке.

Читать далее

«IT-Планета 2025»: задачи второго этапа по PostgreSQL

Уровень сложностиПростой
Время на прочтение29 мин
Количество просмотров2.8K

Мы продолжаем свое участие в международной олимпиаде «IT-Планета».  Как и в прошлые годы, проводился конкурс по SQL, состоящий из трех этапов: теоретический и практический туры, проходящие онлайн, и финальный очный тур.

В первом туре участвовало свыше 4 500 человек, из которых 245 были отобраны во второй. В этом году я занимался разработкой задач и проведением первых двух туров. Предлагаю перейти к рассмотрению задач практического этапа.

Читать далее

Записки оптимизатора 1С (ч.12).  СрезПоследних в 1C: Предприятие на PostgreSQL. Почему же так долго?

Уровень сложностиСредний
Время на прочтение11 мин
Количество просмотров4.3K

Этой проблеме уже не менее 15 лет.

На входе: большая база на PostgreSQL. Вполне себе типовые отчеты с не менее типовыми запросами 1C, содержащие обращение к виртуальной таблице СрезПоследних какого-нибудь регистра сведений с большим количеством строк, выполняются неприлично длительное время. Вплоть до нескольких часов.

Причина – оптимизатор строит неверный план запроса. Причем тот же запрос на MS SQL выполняется быстро и оптимизатор не ошибается.

Сейчас будем разбираться в чем ошибается оптимизатор и какие пути решения тут возможны.

Читать далее

Массивы вместо self-join: как писать быстрые запросы в ClickHouse

Уровень сложностиПростой
Время на прочтение5 мин
Количество просмотров4.4K

Привет, Хабр! Я — Максим Шитилов, продуктовый аналитик в каршеринг-сервисе Ситидрайв. Каждый день мы обрабатываем большие объёмы данных, и ClickHouse — один из наших ключевых инструментов. Если вы когда-либо пытались связать события с временными интервалами или рассчитать метрику за определённое окно после события, то наверняка сталкивались с типичной конструкцией на self-join. Вроде бы работает, но запрос становится громоздким, ресурсоёмким и плохо масштабируется.

В этой статье я расскажу, как решать такие задачи проще и эффективнее — с помощью массивов, arrayFilter и arrayMap. Покажу, как отказаться от self-join’ов без потери точности, ускорить обработку и упростить код. Примеры — из реальных бизнес-кейсов: телеметрия, аренды, GMV и события, которые нужно связать между собой по времени. Так как схожих решений на просторах интернета я не нашёл, предлагаю назвать этот подход «Array Join Pattern». Если метод окажется полезным для сообщества, то такой паттерн легко будет найти другим аналитикам и девам.

Читать далее

Как LLM могут помочь аналитикам баз данных в работе с SQL-запросами

Уровень сложностиСложный
Время на прочтение9 мин
Количество просмотров3.6K

В современных компаниях корпоративные хранилища данных (Data Warehouse) играют критически важную роль, обеспечивая централизованное хранение и обработку больших объёмов информации. Данные поступают из разнообразных источников: операционных систем, CRM, ERP, IoT-устройств, веб-аналитики, мобильных приложений и других платформ, отражая все аспекты деятельности организации. На основе этой информации компании формируют разного рода отчётность, отслеживают ключевые показатели эффективности (KPI), оптимизируют бизнес-процессы, прогнозируют рыночные тенденции и принимают стратегические решения.

Эффективная работа с хранилищем невозможна без участия бизнес- и системных аналитиков, которые проектируют структуры данных, очищают и объединяют информацию, адаптируя решения под меняющиеся задачи. С ростом объёмов данных и требований к скорости анализа даже опытные команды сталкиваются с вызовами. Рутинные операции — проектирование схем, поиск таблиц, проверка качества данных — требуют не только технических навыков, но и глубокого понимания бизнес-контекста. Большую часть времени занимает написание и оптимизация SQL-запросов, что становится «узким местом» в условиях динамично меняющихся требований.

Ошибки в SQL-запросах или недостаточное знание структуры данных приводит к потерям времени и снижению точности аналитики. Для решения этих проблем на помощь приходят технологии на основе больших языковых моделей (LLM), таких как GigaChat, GPT, BERT или DeepSeek. Обученные на исторических данных и журналах запросов, они способны автоматизировать подбор таблиц, JOIN-условий и шаблонов SQL. 

Читать далее

Вклад авторов