Oracle десятилетиями был выбором по умолчанию для корпоративных баз, и во многих банках и enterprise-системах он до сих пор в основе. Но новые проекты всё чаще стартуют на PostgreSQL, а старые — переезжают на него. Разберём, чем базы реально отличаются и что значит переезд с Oracle на PostgreSQL на практике.
Главное отличие: стоимость и модель
Обе базы — зрелые реляционные СУБД с транзакциями, аналитическими функциями и богатым SQL. Ключевая разница не в возможностях, а в модели:
- Oracle — проприетарный продукт с лицензированием по ядрам; полный набор возможностей (партиционирование, сжатие, продвинутая диагностика) часто идёт отдельными платными опциями. Сильные стороны — экосистема, поддержка, инструменты для очень крупных инсталляций.
- PostgreSQL — открытый и бесплатный; те же партиционирование, оконные функции, JSON и расширения доступны из коробки. Именно устранение лицензионных платежей — самый частый мотив миграции.
Для большинства нагрузок PostgreSQL закрывает потребности полностью; Oracle остаётся оправдан там, где уже вложились в его экосистему или упираются в специфические возможности очень большого масштаба.
Отличия, которые видит разработчик
- Хранимая логика. Oracle — PL/SQL, PostgreSQL — PL/pgSQL: синтаксис близок, но не совпадает; пакеты (
PACKAGE) в PostgreSQL заменяются схемами и наборами функций. - Автоинкремент. В Oracle —
SEQUENCE(а раньше — связка последовательности и триггера), в PostgreSQL —SEQUENCEили прощеGENERATED AS IDENTITY/serial. - Пустая строка и NULL. Oracle трактует пустую строку
''какNULL— PostgreSQL различает их. Это классический источник тонких багов при переезде. - Типы.
NUMBER→numeric/bigint,VARCHAR2→varchar,DATE(с временем) →timestamp. Даты особенно коварны:DATEв Oracle хранит и время. - Хинты и план. Oracle-подсказки оптимизатору в запросах (
/*+ ... */) в PostgreSQL не работают — план настраивают статистикой, индексами и переписыванием запроса.
Как выглядит миграция
Переезд — это не только перенос данных, но и порт логики:
- Схема и данные. Инструмент
ora2pgконвертирует схему, типы и данные и оценивает сложность миграции хранимого кода. - Хранимые процедуры. PL/SQL переписывают на PL/pgSQL или, что чаще правильнее, выносят логику в приложение — так её проще тестировать и версионировать.
- Правки в приложении. SQL с Oracle-специфичным синтаксисом (
ROWNUM,NVL,SYSDATE,CONNECT BY) заменяют на стандартный (LIMIT,COALESCE,now(), рекурсивные CTE). - Проверка поведения. Отдельно тестируют места, где различается семантика: пустые строки, сортировка
NULL, точность чисел и работа с датами.
Миграции схемы в обеих базах ведут версионированными шагами — см. Миграции в PostgreSQL.
Коротко
- Возможности баз близки; главная разница — Oracle проприетарный и платный, PostgreSQL открытый и бесплатный, что и мотивирует большинство переездов.
- Для разработчика отличия — в хранимой логике (PL/SQL vs PL/pgSQL), автоинкременте, типах и обработке пустой строки и
NULL. - Миграция:
ora2pgдля схемы и данных, перенос хранимого кода в приложение, замена Oracle-специфичного SQL на стандартный. - Самые тонкие грабли — семантика:
''=NULLв Oracle,DATEсо временем, сортировкаNULL, точность чисел. - Oracle оправдан там, где уже глубоко вложились в его экосистему или нужен его специфический масштаб; для нового проекта разумный выбор по умолчанию — PostgreSQL.
Что почитать дальше
- PostgreSQL или MongoDB — как выбирать между реляционной и документной моделью.
- Миграции в PostgreSQL — как менять схему версионированными шагами.
- Раздел PostgreSQL — индексы, партиционирование, планы запросов и эксплуатация.