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 различает их. Это классический источник тонких багов при переезде.
  • Типы. NUMBERnumeric/bigint, VARCHAR2varchar, DATE (с временем) → timestamp. Даты особенно коварны: DATE в Oracle хранит и время.
  • Хинты и план. Oracle-подсказки оптимизатору в запросах (/*+ ... */) в PostgreSQL не работают — план настраивают статистикой, индексами и переписыванием запроса.

Как выглядит миграция

Переезд — это не только перенос данных, но и порт логики:

  1. Схема и данные. Инструмент ora2pg конвертирует схему, типы и данные и оценивает сложность миграции хранимого кода.
  2. Хранимые процедуры. PL/SQL переписывают на PL/pgSQL или, что чаще правильнее, выносят логику в приложение — так её проще тестировать и версионировать.
  3. Правки в приложении. SQL с Oracle-специфичным синтаксисом (ROWNUM, NVL, SYSDATE, CONNECT BY) заменяют на стандартный (LIMIT, COALESCE, now(), рекурсивные CTE).
  4. Проверка поведения. Отдельно тестируют места, где различается семантика: пустые строки, сортировка NULL, точность чисел и работа с датами.

Миграции схемы в обеих базах ведут версионированными шагами — см. Миграции в PostgreSQL.

Коротко

  • Возможности баз близки; главная разница — Oracle проприетарный и платный, PostgreSQL открытый и бесплатный, что и мотивирует большинство переездов.
  • Для разработчика отличия — в хранимой логике (PL/SQL vs PL/pgSQL), автоинкременте, типах и обработке пустой строки и NULL.
  • Миграция: ora2pg для схемы и данных, перенос хранимого кода в приложение, замена Oracle-специфичного SQL на стандартный.
  • Самые тонкие грабли — семантика: '' = NULL в Oracle, DATE со временем, сортировка NULL, точность чисел.
  • Oracle оправдан там, где уже глубоко вложились в его экосистему или нужен его специфический масштаб; для нового проекта разумный выбор по умолчанию — PostgreSQL.

Что почитать дальше

  • PostgreSQL или MongoDB — как выбирать между реляционной и документной моделью.
  • Миграции в PostgreSQL — как менять схему версионированными шагами.
  • Раздел PostgreSQL — индексы, партиционирование, планы запросов и эксплуатация.