title

text

Никита Глухов
Никита Глухов Postgres Professional Старший разработчик
Олег Бартунов
Олег Бартунов Postgres Professional генеральный директор
: декабря
45 мин

Элегантный поиск ближайших соседей в PostgreSQL

С необходимостью эффективного поиска ближайших соседей можно встретиться в разных задачах, например, поиск ближайших к заданной точке объектов на карте. Задача, на непрограммистский взгляд кажущаяся тривиальной (действительно, человек довольно легко справляется с ней глядя на карту) , на самом деле не имеет общего и доступного решения, что приводит к головной боли разработчиков, которые придумывают ad hoc решения (вставляют костыли). Эти решения, обычно некрасивые, портят настроение творческой натуры программиста, которому требуется посещение пивной, чтобы пережить когнитивный диссонанс :)

Действительно, если у человека есть карта, у которой есть определенный масштаб, и характерный размер поля зрения, то у программиста есть только координаты заданной точки и множество точек, которых может быть очень много (миллиарды звезд !), и к которому может идти большое количество конкурентных запросов, причем не только на чтение. Язык SQL позволяет очень красиво записать запрос, но реальный план его выполнения удручает - требуется прочитать всю таблицу, вычислить все расстояния от заданной точки, отсортировать по убыванию и оставить требуемое количество записей. Наличие индексов не спасает, а только приводит к полному обходу поискового дерева и чтения всей таблицы в случайном порядке, что гораздо медленнее простого чтения таблицы.

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

Слайды

Видео

Видео доступно участникам мероприятия, выполнившим вход в личный кабинет

Другие доклады

  • Алексей Фадеев
    Алексей Фадеев Sibedge Старший разработчик .NET, евангелист Postgres.
    90 мин

    Plv8 Framework: разработка на plv8 в IDE, с ES6, отладкой, автотестами и деплоем

    Многие разработчики прикладного ПО не любят выносить логику на сторону БД (в функции) из-за отсутствия удобных средств разработки, особенно командной. С plv8 ситуация осложняется тем, что функция содержит симбиоз кода SQL и JavaScript, популярные IDE такое не поддерживают. На этом мастер классе я представлю свою разработку "Plv8 Framework", позволяющую существенно облегчить создание кода на plv8.

    Суть в следующем: тот же JS-код, который будет выполняться на стороне БД, можно запустить локально, прямо на машине разработчика, с помощью node.js, который работает на основе того же интерпретатора v8. Спецфункция plv8.execute подменяется на функцию из npm-библиотеки pg-native, т.е. происходит обращение к внешней СУБД. Я продемонстрирую авторский набор средств, позволяющий:
    - писать js-код в вашей любимой IDE с подсветкой синтаксиса;
    - отлаживать код в реальном времени (с breakpoint, watch и т.д.);
    - писать автотесты (unit-тесты), с вариантами: постгрес, SQLite, моки;
    - выполнять deploy кода в СУБД;
    - использовать дополнительные npm-пакеты (проблема в том, что весь код функции на plv8 должен находиться в теле этой функции, т.е. в одном файле).

    Инструмент можно использовать независимо от того, на чём вы разрабатываете бэкенд. Но особенную гибкость он придаёт, если вы используете языки со статической типизацией (java, C# и т.д.). Например для задач, где бэкенд является промежуточным слоем между фронтендом и СУБД, логика (или её часть) может быть вынесена в plv8/js с динамической типизацией, что может весьма облегчить процесс разработки.

    Помимо возможности разрабатывать новые функции на plv8, фреймворк предоставляет набор готовых функций для выполнения CRUD-операций. Функции универсальные, не привязаны к структуре конкретной БД и могут работать на любых проектах. Их использование поможет сократить объём бэкенд разработки, на некоторых проектах - значительно.

    Пожалуй, самое сложное с plv8 - установить это расширение. Но у меня хорошая новость: мои коллеги помогли подготовить докер-файлы и докер-образы для PostgreSQL версии 13 с уже установленным plv8! Теперь начать разработку на plv8 просто: нужно лишь развернуть контейнер одной командой.
    Докер-файл: PostgreSQL 13 + plv8 v2.13.15
    Демо-проект для участия в мастер-классе
    Так же для мастер-класса пригодятся:
    Node.js (желательно LTS)
    IDE для js (например, бесплатная Visual Studio Code)
    GraphQL Playground

  • Алексей Фирсов
    Алексей Фирсов S7 techlab руководитель разработки
    45 мин

    Что такое PostgreSQL для Python-разработчика?

    Я не буду вас учить, как строить БД, как писать запросы и т.д. В этом докладе мы с вами поговорим про драйвера Python, как вообще можно использовать PostgreSQL в Python, какие инструменты для этого есть в синхронном и асинхронном мире, и почему так сложилось. Будем разговаривать про такие библиотеки Python, как: aiopg, psycopg2, asyncpg, pgbouncer, ну и, конечно же, как это все дружит с Postgres.

  • Антон Дорошкевич
    Антон Дорошкевич ИнфоСофт Руководитель ИТ
    45 мин

    Неравный бой с "распуханием" в реалиях баз 1С

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

  • Олег Бартунов
    Олег Бартунов Postgres Professional генеральный директор
    45 мин

    Json or not Json. Плюсы и минусы использования Json в PostgreSQL

    Json сейчас является де-факто стандартом для разработчиков стартапов. Почему это происходит и что надо делать — учить разработчиков приложений, как правильно проектировать базу данных согласно канонам реляционной теории (которой Postgres очень хорошо соответствует) или сделать СУБД более дружественной для Json?