
Если вы стоите перед выбором между 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 по следующим пунктам:
Стоимость: бесплатный, без лицензий.
Типы данных: JSONB, массивы, уникальные индексы.
Индексация: гибкость, скорость, оптимизация.
Расширяемость: плагины и модули, такие как PostGIS.
Масштабируемость: удобные и бесплатные инструменты.
Простота интеграции: с языками вроде Python, Go и Java.
Oracle DB остаётся сильным игроком для крупных корпораций с большими бюджетами и жёсткими SLA, это часто оправдано благодаря поддержке и интеграции с другими инструментами. Но PostgreSQL предлагает почти тот же уровень функциональности (а где‑то и превосходит) без огромных затрат.
А какое решение лучше на ваш взгляд? Если остались вопросы — пишите в комментариях.
И приходите на бесплатный вебинар «Python для миграции данных: Oracle <-> PostgreSQL». А на странице курса можно посмотреть записи предыдущих материалов.