Как стать автором
Обновить
588.3
OTUS
Цифровые навыки от ведущих экспертов

Где PostgreSQL выигрывает у Oracle DB

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

Если вы стоите перед выбором между PostgreSQL и Oracle DB, то эта статья для вас. Разберем где PostgreSQL побеждает Oracle. Будет код и примеры — всё, что нужно для практического сравнения.

P.S: эта статья не про то, какой PSQL хороший в отличии от Oracle, а про то, в чем PSQL по мнению автора лучше.


PostgreSQL как подарок судьбы

Начнём с самого очевидного: PostgreSQL — бесплатный и Open Source. Это очень приятный бонус. Вы получаете всю мощь системы без необходимости покупать лицензии, платить за дополнительные модули или беспокоиться о процессорных ограничениях.

Oracle DB работает иначе. Вы платите за каждое ядро, за кластеризацию, за функции вроде Oracle Spatial или GoldenGate. Иногда суммы доходят до сотен тысяч долларов в год.

Помимо этого, за счет Open Source у PSQL намного лучше развивается сообщество.

Индексация

PostgreSQL предлагает потрясающую гибкость в индексации. Помимо стандартного B‑tree, можно использовать:

  • GIN — для работы с JSONB или массивами.

  • GiST — для пространственных данных и полнотекстового поиска.

  • BRIN — если у вас огромные таблицы с миллиардами записей.

Пример GIN‑индексации в PostgreSQL:

CREATE INDEX idx_orders_data ON orders USING GIN (data);

Теперь можно искать вложенные элементы JSON с достаточно высокой скоростью.

Расширяемость

Расширяемость PostgreSQL — это не просто удобная фича, а одна из основных причин, почему эту СУБД выбирают для сложных и нестандартных задач. Oracle тоже поддерживает расширения и дополнительные функции, но с некоторыми отличиями:

Например, существует PostGIS — мощное расширение для работы с геоданными. Оно имеет множество инструментов для работы с пространственными объектами, такими как точки, линии и полигоны. Пример кода:

CREATE EXTENSION postgis;

CREATE TABLE locations (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100),
    geom GEOMETRY(Point, 4326)
);

-- Добавляем точку
INSERT INTO locations (name, geom)
VALUES ('Гора Фудзи', ST_SetSRID(ST_MakePoint(138.7274, 35.3606), 4326));

-- Найдём ближайший объект к заданным координатам
SELECT name
FROM locations
ORDER BY ST_Distance(geom, ST_SetSRID(ST_MakePoint(138.73, 35.36), 4326))
LIMIT 1;

Oracle предлагает схожий функционал через модуль Oracle Spatial. Пример работы с пространственными данными:

CREATE TABLE locations (
    id NUMBER PRIMARY KEY,
    name VARCHAR2(100),
    geom SDO_GEOMETRY
);

CREATE INDEX locations_geom_idx ON locations (geom) INDEXTYPE IS MDSYS.SPATIAL_INDEX;

-- Вставка точки
INSERT INTO locations (id, name, geom)
VALUES (
    1,
    'Гора Фудзи',
    SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(138.7274, 35.3606, NULL), NULL, NULL)
);

-- Поиск ближайшего объекта
SELECT name
FROM locations
WHERE SDO_NN(geom, SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(138.73, 35.36, NULL), NULL, NULL), 'sdo_num_res=1') = 'TRUE';

PostGIS: бесплатно, простое подключение через CREATE EXTENSION. Большой набор функций.

Oracle Spatial: требует лицензии, синтаксис сложнее, а производительность может проседать на больших данных из‑за высоких накладных расходов.

Помимо этого PostgreSQL имеет Foreign Data Wrappers для подключения к другим базам данных (включая Oracle), файловым системам и REST API. Это стандартная функциональность, которая легко настраивается.

CREATE EXTENSION oracle_fdw;

CREATE SERVER foreign_oracle_db
FOREIGN DATA WRAPPER oracle_fdw
OPTIONS (dbserver '192.168.1.10/oracledb');

-- Импорт таблиц из Oracle
IMPORT FOREIGN SCHEMA public
FROM SERVER foreign_oracle_db
INTO local_schema;

-- Работаем с удалёнными данными как с локальными
SELECT * FROM local_schema.some_table;

А вот в Oracle интеграции с PostgreSQL или другими источниками данных используется Oracle Database Gateway и этот инструмент не включён в базовую поставку, требует отдельной лицензии и дополнительной настройки.

А теперь допустим, что нужно реализовать функцию, которая принимает JSON‑данные, извлекает из них определённое поле и возвращает его в виде строки.

В PostgreSQL это можно сделать очень просто с помощью встроенного типа JSONB и функций для работы с JSON.

CREATE FUNCTION extract_json_field(data JSONB, key TEXT) RETURNS TEXT
AS $$
BEGIN
    RETURN data->>key;
END;
$$ LANGUAGE plpgsql;

-- Пример вызова
SELECT extract_json_field('{"name": "Kolya", "age": 30}'::JSONB, 'name');
-- Результат: Kolya

В Oracle работа с JSON поддерживается через PL/SQL и требует более сложного синтаксиса. К тому же необходимо предварительно убедиться, что JSON правильно проанализирован.

-- Создаём функцию для извлечения поля из JSON
CREATE OR REPLACE FUNCTION extract_json_field(
    data IN CLOB,
    key IN VARCHAR2
) RETURN VARCHAR2 IS
    json_obj JSON_OBJECT_T;
BEGIN
    -- Преобразуем CLOB в JSON-объект
    json_obj := JSON_OBJECT_T.parse(data);

    -- Возвращаем значение по ключу
    RETURN json_obj.get_string(key);
EXCEPTION
    WHEN OTHERS THEN
        RETURN NULL; -- В случае ошибки возвращаем NULL
END;
/

-- Пример вызова
DECLARE
    result VARCHAR2(100);
BEGIN
    result := extract_json_field('{"name": "Kolya", "age": 30}', 'name');
    DBMS_OUTPUT.PUT_LINE(result); -- Результат: Kolya
END;
/

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

Масштабируемость и репликация

PostgreSQL имеет свободу выбора: стриминговая репликация, логическая репликация, шардинг с помощью Citus. Всё это бесплатно.

# Включаем репликацию в конфигурации
wal_level = replica
max_wal_senders = 10

Oracle, конечно, тоже умеет масштабироваться, но за это придётся платить: GoldenGate, RAC — это всё про деньги.


Итог

PostgreSQL выигрывает у Oracle DB по следующим пунктам:

  1. Стоимость: бесплатный, без лицензий.

  2. Типы данных: JSONB, массивы, уникальные индексы.

  3. Индексация: гибкость, скорость, оптимизация.

  4. Расширяемость: плагины и модули, такие как PostGIS.

  5. Масштабируемость: удобные и бесплатные инструменты.

  6. Простота интеграции: с языками вроде Python, Go и Java.

Oracle DB остаётся сильным игроком для крупных корпораций с большими бюджетами и жёсткими SLA, это часто оправдано благодаря поддержке и интеграции с другими инструментами. Но PostgreSQL предлагает почти тот же уровень функциональности (а где‑то и превосходит) без огромных затрат.

А какое решение лучше на ваш взгляд? Если остались вопросы — пишите в комментариях.

И приходите на бесплатный вебинар «Python для миграции данных: Oracle <-> PostgreSQL». А на странице курса можно посмотреть записи предыдущих материалов.

Теги:
Хабы:
Всего голосов 48: ↑37 и ↓11+33
Комментарии88

Публикации

Информация

Сайт
otus.ru
Дата регистрации
Дата основания
Численность
101–200 человек
Местоположение
Россия
Представитель
OTUS