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

от автора

Если вы стоите перед выбором между 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». А на странице курса можно посмотреть записи предыдущих материалов.


ссылка на оригинал статьи https://habr.com/ru/articles/858980/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *