Oracle для профессионалов



              

Независимость от СУБД? - часть 3


no rows selected

В первый раз это может показаться странным: в Oracle NULL не равен и не не равен NULL. СУБД SQL Server по умолчанию ведет себя не так: в SQL Server и Sybase NULL равен NULL. Ни Oracle, ни Sybase, ни SQL Server не выполняет операторы SQL неправильно — они просто делают это по-разному. Все эти СУБД якобы соответствуют стандарту ANSI, но все равно работают по-разному. Есть неоднозначности, проблемы совместимости с прежними версиями и так далее, которые необходимо решать. Например, СУБД SQL Server поддерживает метод сравнения со значением NULL, диктуемый стандартом ANSI, но не по умолчанию (это нарушило бы работу тысяч уже существующих приложений, созданных для этой СУБД).

Одним из решений проблемы могло быть переформулирование запроса следующим образом:

select * from t where ( x = l_some_variable OR (x is null and l_some_variable is NULL ))

Однако это привело бы к еще одной проблеме. В СУБД SQL Server при выполнении этого запроса использовался бы индекс по столбцу X. В СУБД Oracle индекс на основе B*-дерева (подробнее о методах индексирования читайте в главе 7) не позволяет индексировать значения ключа NULL. Поэтому, если необходимо найти неопределенные значения, индексы на основе B*-деревьев не сильно помогут.

В рассматриваемом случае, чтобы свести к минимуму изменения в коде, столбцу X присваивалось значение, которого не могло быть в реальных данных. Так, X, по определению, был числом положительным, поэтому было выбрано значение -1. Запрос приобрел следующий вид:

select * from t where nvl(x,-1) = nvl(l_some_variable,-1)

Мы создали индекс по функции:

create index t_idx on t( nvl(x,-1) );

С минимальными изменениями мы добились того же результата. Отсюда можно сделать следующие важные выводы.

  • СУБД — различны. Опыт работы с одной может оказаться полезен в другой, но нужно быть готовым к ряду принципиальных отличий и многим очень мелким.
  • Мелкие различия (вроде обработки NULL-значений) могут иметь такое же влияние, как и принципиальные (например, механизм управления одновременным доступом).



  • Содержание  Назад  Вперед