Если вы стоите перед выбором между 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». А на странице курса можно посмотреть записи предыдущих материалов.
ссылка на оригинал статьи https://habr.com/ru/articles/858980/
Добавить комментарий