Oracle 10g vs SQL Server 2005 (Yukon)

[Home]      [Blog]

Последнее обновление: 03/04/2011

Предисловие: Этот опус писался во времена выхода бетты MSSQL2005 и является по сути компиляцией многочисленных обсуждений на форуме сайта SQL.RU (раздел Сравнения СУБД). Сравниваются тут именно 2005 версия mssql с oracle10g. В последствии в текст много чего добавлялось и исправлялось по итогам дебатов, кое где упоминаются функции появившиеся уже в версии 2008 или 11g, но далеко не во всех разделах.

С выходом MSSQLl2005 идеологические различия с ораклом во многом сократились – версионный механизм и интеграция CLR в ядро теперь очень напоминают версионный механизм оракла и java в ядре. Самые большие разногласия теперь - подход к кластерам. Однако различия все же огромны:

Oracle MVCC vs SQL Server snapshot

Одним из главных нововведений в mssql стало добавление версионного режима, который практически полностью копирует реализацию оракла, однако некоторые архитектурные решения в mssql отличаются от подхода в оракле. В mssql версии строк хранятся в tempdb, в то время как в оракле в отдельной структуре сегментов отката (в оракле для отдельных транзакций можно создавать отдельные сегменты отката ). Tempdb часто становится головной болью администратора mssql и без версионности, проблеме i/o в tempdb на msdn посвящена не одна нота т.к. там помимо временных таблиц и табличных переменных хранятся сортировки и курсоры. Добавление в tempdb еще и версий строк делает и без того перегруженный tempdb узким местом в системе.
Следующее важное различие в том, что сегменты отката оракла защищены от безразмерного роста и место пространства отката используется циклически (размер и их кол-во может задаваться админом). При неправильном размере сегментов очень длинная транзакция может получить ошибку ORA-01555 snapshot too old, в результате чего откатится лишь одна транзакция, в то время как в mssql ни что не ограничит рост tempdb, в результате одна «неудачная» транзакция может просто переполнить tempdb и остановить работу всех пользователей (есть job которым можно как-то попробовать среагировать).
Первые зачатки версионного механизма в оракле появились еще в 3й версии (1983 год) и сегодня этот механизм умеет многое чего пока нет в mssql. Например оракл в отличии от mssql хранит не версии строк, а блоки данных, что позволяет накладывать версионность универсально на любые объекты, плюс оптимизировать операции и/о. Например при необходимости делать клон блока в памяти который уже помечен на сброс (на hdd) и не ждать пока блок дождется своей очереди и окажется на диске.
Версионный механизм позволяет ораклу делать ретроспективные (flashback) запросы и видеть состояние таблиц в прошлом.
Еще одна особенность подхода mssql - возможность одновременного использования как блокировочного так и весионного механизма одновременно. Однако тут стоит отметить, что версионных механизм включается на всю базу и транзакции использующие блокировочный механизм будут лишены преимуществ версионного подхода, но при этом будут вынуждены создавать версии строк для версионного механизма, что делает бессмысленным использование блокировочного и версионного механизма одновременно.

Snapshot VS блокировочник

Основная проблема блокировочных режимов в том, что их использование это по сути поиск компромисса между лавиной блокировок и дедлоков на уровне Serializable и неконсистентной кашей на уровне Read Committed. Запрос на блокировочный RC по мере чтения видит данные транзакции которые были удалены на момент окончания чтения, появились до начала чтения и после. и все это в перемешку. Мало того блокировочный RC в конкурентной среде может прочитать несколько раз одну и ту же запись. т.е. по сути читает полную кашу, что делает очень важным процесс проектирование архитектуры приложения использующие блокировочные уровни изолированности и требует грамотного архитектора, который обязан знать сотни нюансов работы на этих уровнях изолированности.

Что касается Serializable, то он по мере чтения накладывает блокировки (в том числе range) и тем самым не позволяет себе прочесть кашу, но во первых своими блокировками он останавливает всех писателей и катастрофически увеличивает вероятность взимоблокировок. Использование Serializable требует огромной внимательности, во избежании неожиданных эффектов, эскалаций и взаимоблокировок, что делает его использование очень затруднительным и скорее экзотичным, чем широко распространенным.

Кроме этого стоит учесть, что при использовании Snapshot разработчику все в общем-то ясно, транзакция видит те данные которые были зафиксированы на момент старта транзакции. У Serializable угадать какие транзакции он увидит, а какие нет не возможно. При определенных обстоятельствах Serializable вполне может увидеть транзакции стартанувшие после Serializable транзакции, но при этом не увидеть транзакции стартанувшие до нее. Все зависит от того как блокировки лягут.

Годами Microsoft утверждала, что блокировочный механизм лучше подходит для тяжелых OLPT задач (преимущества версионности в DSS системах Microsoft не оспаривала), однако преимущества версионного подхода были настолько очевидны, что сегодня в официальной документации говорится:

SQL Server 2005 introduces a new snapshot isolation level to enhance concurrency for OLTP applications. In earlier versions of SQL Server, concurrency was based solely on locking, which caused blocking and deadlocking problems for some applications. Snapshot isolation, by contrast, depends on enhancements to row versioning and is intended to improve performance by avoiding reader-writer blocking scenarios. ...
This non-blocking behavior also significantly reduces the likelihood of deadlocks for complex transactions.

MSDN: Using Snapshot Isolation

Уровень излолированности snapshot Microsoft использует в OLTP тестах TPC-E, который пришел на замену TPC-C.

Эскалация блокировок (row escalation)

Блокировки в mssql это структура в памяти которая не может превышать 40% от общей памяти доступной серверу. В целях экономии этой памяти mssql вынужден в определенных ситуациях блокировать не на уровне строк (строк с которыми идут операции), а всю таблицу (The Database Engine does not escalate row or key-range locks to page locks, but escalates them directly to table locks. Similarly, page locks are always escalated to table locks.MSDN). Оракл и IBM считают, что такой подход плохо влияет на конкурентный доступ и повышает вероятность взаимоблокировок. Оракл информацию о блокировках хранит прямо в блоках данных и соответственно никаких ограничений на их кол-во не накладывает и в любом случае обеспечивает блокировку на уровне строк..Статья: эскалация блокировок
Обсуждение: Эскалация блокировок - баг или фича?
Выводы от IBM: Lock escalation. For many tablespaces, it’s also probably advisable to turn off lock escalation. SAP’s cluster table interface can read cluster tables without causing a problem with lock escalation; however, with other ERPs, lock escalation is one of the biggest contributors to poor performance. подробнее.
Although the escalation process itself does not take much time, locking entire tables (versus individual rows) decreases concurrency, and overall database performance may decrease for subsequent accesses against the affected tables. подробнее

PL/SQL VS T-SQL

Главные различие в серверных языках в том, что оракл постарался сделать полноценный язык, а MSSQL процедурное расширение к декларативному языку SQL, стараясь сделать его как можно проще в использовании новичком. Отсюда и заметные отличия. Например, в оракле все входящие и выходящие данные процедуры строго перечисляются в описании процедуры, в том числе и курсоры, которые может вернуть процедура. Т.е. взглянув на описание пакета разработчик в течении нескольких секунд может однозначно понять какие данные возвращает процедура. В MSSQL ровно наоборот, любой селект в теле процедуры "вылазит" как resultset. Для новичка делающего первые шаги наверно это действительно удобно, но для серьезного проекта с несколькими поколениями разработчиков порой бывает не так уж просто разобраться в чужом коде. Ну а сопровождение может превратиться в совсем ад. Тут разбирается пример, когда разработчик добавив select в одну процедуру не заметно для себя ломает вызовы других процедур. Причем при тестировании процедур по отдельности эта ошибка не выявляется, она выявиться только при дорогом комплексном тестировании, причем нередко только на определенном наборе входных параметров (данных в таблицах).

Примерно та же ситуация с временными таблицами. Времянки в MSSQL зачастую используют для передачи данных из одной процедуру в другую, что делает возможным случайные искажения "пролетающих" времянок из одной процедуры в другую. Тут разбирается пример с "пролетающими" времянками и проблемах выявления таких проблем без дорогого всестороннего тестирования.

По сравнению с MSSQL2000 T-SQL особых изменений не претерпел, из крупных нововведений – конструкции try/catch.
Сегодня по возможностям T-SQL уступает PL/SQL из oracle7 (1992 год), уже тогда в оракле было отслеживание зависимостей, когда объекты субд (procedure/function/package/view) имеют стаус valid/invalid и субд отслеживает зависимости между ними. Например удаление таблицы повлечет за собой изменение статуса на «invalid» всех объектов, которые были связаны с этой таблицой. Это позволяет предотвращать запуск процедур которые выполнятся с ошибкой. Mssql проверяет лишь синтаксис и только во время компиляции, поэтому такая процедура будет запущена и будет работать пока не встретится ошибочная команда, результат такой работы может быть непредсказуем.
В T-SQL нет масивов, отсутствуют ООП фичи (object oriented features), возможности встроеных процедур/пакетов (DBMS_*, UTL_*) оракла гораздо шире, нет аналога пакетам.

Пакеты (Packages)

Packages - дополнительный namespace в субд oracle. В package можно объединять процедуры и функции, ими управлять (grants, valid/invalid), плюс позволяют оптимизировать доступ т.к. в память загружается весь пакет. подробней.
Пакеты позволяют давать объявления переменных, курсоров и много другого в рамках пакета, в мсскл из-за отсутствия пакета приходиться в нескольких процедурах давать одни и те же описания курсоров и переменных.

Оптимизатор

Один из важнейших параметров для сравнения рсубд это безусловно оптимизатор и статистики на которые опирается оптимизатор. Нужно признать, что в MSSQL реализован довольно сильный оптимизатор, однако в оракле он тоже достаточно силен и во многих ситуациях выходит победителем из-за того, что опирается на заметно более детализованную статистику. Кроме этого оракловый оптимизатор обучен гораздо большему кол-ву трюков. Например, за счет использование кластера (подробнее чуть ниже), поддержки большего типов индексов, наличия материализованных вью с переписыванием запроса, большего возможностей по секционированнию, возможности использования гибкого размера блоков. В оракле можно более гибко настроить и буферный кеш. Например, можно часто пользумые таблицы заставить кешироваться (alter table ... cache) или создать под них отдельные буферный кеш. В версии 11g  оптимизатор научили по особенному работать с SSD дисками.
В оракле есть возможность в ручную зафиксировать план запроса и гораздо более обширный набор подсказок оптимизатору для случаев если он не достаточно хороший план подобрал.

Размер блока (db_block_size)

В mssql размер страницы (page size) равен 8К и не может быть изменен, что сильно ограничивает возможность настройки системы, особенно DSS систем. В оракле размер блока задается во время создания бд. Кроме этого размер блока может быть задан для отдельных таблиц. Так в тесте TPC-C оракл используют  8К и 16К страницы.

http://www.ixora.com.au/tips/block_size.htm

Кластер

Кластер в Оракле это способ хранения группы таблиц, имеющих один или несколько общих столбцов, в одних и тех же блоках базы данных, так что взаимо-связанные данные хранятся в одном блоке. Этот способ позволяет серьезно экономить и/о и ресурсы процессора, т.к. по сути в одном блоке лежат готовые и уже заджоиненые данные. Oracle часто использует эту возможность в тестах TPC-C. Аналога в MSSQL этому способу нет.

Кластерная таблица в MSSQL является аналогом Index Orgonized Table (IOT) в Оракле.

Рекурсия

T-SQL mssql2005 по прежнему имеет ограничение на глубину рекурсии (32 вызова), что делает проблематичным использование рекурсивных алгоритмов. Оракл таких ограничений не имеет.

Stored procedures are nested when one stored procedure calls another or executes managed code by referencing a CLR routine, type, or aggregate. You can nest stored procedures and managed code references up to 32 levels.

Server 2005 Books Online, Nesting Stored Procedures

Тригеры

В mssql2005 нет before, on connect, отсутствует отложеная проверка. (в SP2 появился logon и DDL тригеры) также имеет ограничение в 32 рекурсивных вызова.

Nested Triggers
Triggers can be nested to a maximum of 32 levels. If a trigger changes a table on which there is another trigger, the second trigger is activated and can then call a third trigger, and so on. If any trigger in the chain sets off an infinite loop, the nesting level is exceeded and the trigger is canceled.


http://msdn2.microsoft.com/en-us/library/ms189799.aspx

SQL

В msssql2005 SQL диалект обновился: появилися стайтмент WITH и аналитические функции. В оракле аналитические функции более разнообразны, кроме этого оракл поддерживает MERGE INTO statement, model clause и регулярные выражения в SQL. В оракле версии 10g стейтмент WITH не умеет рекурсии и для рекурсивных запросов используется синтаксис select ... connect by prior, в версии 11.2 WITH может использоваться и для рекурсивных запросов.

Временные таблицы

Главное различие во временных таблицах - время создания, в оракле они создаются как обычные таблицы заранее, у mssql налету в момент исполнения процедуры. в оракле временные таблицы можно использовать во view, создавать любые индексы, вешать тиреры, в mssql нельзя использовать во view, у них нет тригеров, но можно создавать индексы. Использование временных таблиц в mssql может губительно сказаться на масштабируемости системы. Поэтому если объем позволяет Microsoft рекомендует отказатся от использования временных таблиц и заменить их табличными переменными, однако они транзакционно независимы и на них нельзя вешать индексы. в плане сравнения их логичней сравнивать с объектами и массивами в оракле.

Автономные транзакции

Microsoft SQL Server 2005 и 2008 не поддерживает автономные транзакции, хотя они очень полезны при надобности запустить транзакцию внутри транзакции или при регистрации аудитной информации. Например регистрация попыток запуска процедур или записи в служебные таблицы, которые окончились откатом транзакции.
http://www.oracle.com/global/ru/oramag/may2001/at.html

Администрирование

Маркетинг Microsoft старательно упирает на простоту администрирования mssql, поддерживая мифы о сложности администрирования оракла. Иллюзию простоты администрирования подтверждают оплаченные Microsoft "исследования" непонятных компаний в которых сравнивается непонятно, что с непонятно чем. Оракл отвечает достойно - не менее проплаченными исследованиями где выясняется, что обладает значительным преимуществом перед Microsoft SQL Server 2005 в области управляемости. Наиболее яркий пример:Отчет Edison group (рус.)

Если отвлечься от подобных "исследований", то мы увидим, что GUI ораклового Enterprise Manager (OEM) от 10g как минимум не уступает в удобстве Microsoft (скриншоты посмотреть можно тут), а возможностей предоставляет на порядок больше. Возможности таких вещей как RMAN, FLASHBACK, отслеживание зависимостей объектов, ограничение ресурсов и прочие делают администрирование Oracle гораздо проще в реальной жизни. Как пример можно рассмотреть процедуру накатывания патча на систему с T-SQL кодом. Администратор mssql не имеет возможности определить не изменил ли DDL из патча, так что процедура которая до сих пор работала, теперь станет обращаться к несуществующим объектам субд (SCHEMABINDING, sp_depends и sys.sql_modules не помогут во всех случаях). С другой стороны оракл пометит такие процедуры как инвалидные и предупредит администратора, который сможет одной командой вернуть бд в исходное состояние.

DDL в транзакциях и процедурах

В принципе в оракле нельзя использовать DDL в процедурах, а в транзакции DDL вызывает завершение транзакции. Связавно это с тем, что у оракла реализована система отслеживания зависимостей (которой нет в mssql). Например, если бы у нас была табличка a c полем b(int) и такой код

alter table a (b char(1)) ;
insert into a values ('a') ;

то оракл на этапе компиляции не смог бы точно определить, пройдет ли alter успешно и будет ли следующий insert верным. Проверку зависимостей в принципе можно обмануть используя DDL в автономных транзакциях делая вызовы из динамического sql, однако мне сложно представить задачу, где такой подход был бы оправдан.

sequence vs autoincrement

сиквенс это универсальный объект для сквозных нумераций (например в нескольких таблицах). заменить его можно create table xxx (id identity); однако такое решение будет не масштабируемым (в плане большого количества конкурирующих транзакций). эмулировать автоинкремент в оракле можно простейшим триггером:
create or replace trigger my_trigger before insert on my_table for each row
begin
if :new.my_autoencriment is null then
select my_sequence.NEXTVAL from dual;
end if;
end;

Добавление от 26/11/2010: В mssql который выйдет после 2008 версии (кодовое имя Denali) будут реализованы сиквенсы

Индексы (Indexes)

В Microsoft сервере отсутсвуют многие типы индексов, которые доступны в Оракле, что занчительно влияет на планы запросов или конкурентный доступ и может в некоторых случаях дать преимущество оптимизатору Оракла на порядок:

Типы индексов Oracle Database 10g/SQL Server 2005
B-tree indexes Yes / Yes
B-tree cluster indexes Yes / No
Hash cluster indexes Yes / No
Reverse key indexes Yes / No
Bitmap indexes Yes / No
Bitmap join indexes Yes / No
Function-based indexes Yes / Yes *
Domain indexes Yes / No
Index-organized tables Yes / Yes (clustered tables)

* аналогом FBI в мсскл можно назвать индекс на Computed колонку, вычисляемой функцией, не помеченной как PERSISTED.

В терминалогии Оракла index organized table соответствует clustered table в MSSQL, кластер в Оракле — это способ хранения группы таблиц, имеющих один или несколько общих столбцов, в одних и тех же блоках базы данных, так что взаимо-связанные данные хранятся в одном блоке.

Reverse индекс позволяет при тяжелой OLTP нагрузки уменьшить конкуренцию за небольшой набор leaf блоков индекса.

Indexed views VS oracle materialized views

SQL Server 2005 имеет гораздо больше ограничений по сравнению с materialized view в Оракле, что делает практически не возможным их использовать.  Indexed View не может быть использовано с:

ANY, NOT ANY

OPENROWSET, OPENQUERY, OPENDATASOURCE

arithmetic on imprecise (float, real) values

OPENXML

COMPUTE, COMPUTE BY

ORDER BY

CONVERT producing an imprecise result

OUTER join

COUNT(*)

reference to a base table with a disabled clustered index

GROUP BY ALL

reference to a table or function in a different database

Derived table (subquery in FROM list)

reference to another view

DISTINCT

ROWSET function

EXISTS, NOT EXISTS

self-join

expressions on aggregate results (e.g. SUM(x)+SUM(x))

STDEV, STDEVP, VAR, VARP, AVG

full-text predicates (CONTAINS, FREETEXT, CONTAINSTABLE, FREETEXTTABLE)

Subquery

imprecise constants (e.g. 2.34e5)

SUM on nullable expressions

inline or table-valued functions

table hints (e.g. NOLOCK)

MIN, MAX

text, ntext, image, filestream, or XML columns

non-deterministic expressions

TOP

non-unicode collations

UNION

contradictions SQL Server 2005 can detect that mean the view would be empty (e.g. where 0=1 and ...)


Note The indexed view may contain float and real columns; however, such columns cannot be included in the clustered index key if they are non-persisted computed columns.

If GROUP BY is present, the VIEW definition:

Must contain COUNT_BIG(*).

Must not contain HAVING, CUBE, ROLLUP, or GROUPING()

http://www.microsoft.com/technet/prodtechnol/sql/2005/ipsql05iv.mspx

Flashback 

В оракле есть две "фичи" на тему флешбэк. Flashback query и Flashback database/table. Flashback query есть в любой редакции в том числе в бесплатной XE, Flashback database/table присутсвует только EE редакции. В mssql таких возможностей нет.

Flashback query

Бывают моменты когда очень хочется быстро поглядеть, что же было в табличке пару часов назад, чтоб попытаться понять как мы добились таких результатов. Очень помогают такие запросы

SELECT * FROM TABLE AS OF TIMESTAMP  (SYSDATE-3/24) where ...

Flashback database/table

Flashback Database может быстро откатывать всю базу данных или таблицу назад во времени, например если накатив патч (например набор DDL скриптов) обнаружили, что данные неверно обрабатываются можно одной командой вернуть состояние базы данных на время перед накатом патча, не прибегая к сложной процедуре восстанавления всей базы данных из бэкапа и наката лога транзакции на определенное время.

RMAN (Backup+Recovery).

  • Oracle позволяет заранее определить время восстановления работы экземпляра в случае краха экземпляра

  • в Oracle есть возможность это время мониторить и корректировать.

  • в Oracle есть возможность назначить ограничение на i/o при бэкапе

  • удаляемые таблицы не удаляются сразу а помещаются в recycle bin что позволяет востановить табличку после drp table одной командой SQL

Oracle Label Security

Опция Oracle Label Security – это набор процедур и ограничений целостности, встроенных в машину базы данных (Enterprise edition), которые обеспечивают принудительный контроль доступа на уровне строк для отдельной таблицы или всей схемы. Для того чтобы использовать Oracle Label Security, вы создаете одно или более правил разграничения доступа, каждое из которых содержит набор меток. Вы используете метки для указания, какие пользователи имеют права доступа к тем или иным типам данных. После создания правил вы прикрепляете их к таблицам, которые требуется защищать, и предоставляете метки вашим пользователям, и это все, что нужно сделать. Опция Oracle Label Security прозрачно для пользователей модифицирует запросы и "на ходу" оценивает уровни доступа для принудительного исполнения ваших новых правил.
Как только сервер Oracle9
i Database выполнит синтаксический разбор очередного SQL-оператора, он определит, не защищены ли какие-то таблицы правилами разграничения доступа. В зависимости от прав доступа пользователей сервер Oracle9i Database добавляет предикаты защиты к WHERE-предложению оператора. Это происходит внутри машины базы данных, поэтому механизм защиты невозможно обойти независимо от источника происхождения SQL-оператора. Теперь защищаем каждую строку

ANSI уровни изолированости

В стандарте ANSI SQL дается определение феноменам и уровням изолированности, однако этот стандарт создавался под блокировочный механизм, в результате уровни изолированности версионика оракла точно стандарту не соответствуют. Например оракловый read commited, гораздо сильней описанного в ansi стандарте и используется в подавляющем большинстве оракловых приложений, в то время как в mssql этот уровень не гарантирует даже консистентного чтения. До 1999 года уровень serializable определялся через определения феноминов, т.к. serializable оракла защищал от всех феноменов, то этот режим вполне удовлетворял требования стандарта (ansi sql92). Однако стандарт был изменен и в 1999 формулировку serializable изменили, теперь в нем требуется эффекта последовательного выполнения транзакций. Такое требование идет в разрез с идеологией не блокируемого чтения и ораклом не обеспечивается, т.к. требует блокируемое чтениние и приводит к деградации масштабируемости, взаимоблокировкам и т.п. В последнее время Micrfosoft соглашается с этим мнением, однако надо заметить, что версионный вариант snapshot реализованный Microsoft более сильный, чем оракловый serializible т.к. использует блокировки предикатов, которые в оракле не реализованы (скорее всего опять же из-за проблем масштабируемости которые эти блокировки создают).

Кластер & Grid

По сути у MSSQL есть только отказоустойчивый кластер. Mirosoft для распределения нагрузки кластера может предложить лишь "размазать" таблицы по нескольким нодам кластера, такая технология в оракле доступна еще с 80х годов. Начиная с 9i oracle предлагает технолонию shared-disk cluster (RAC/Grid) и пока это единственный производитель субд с таким подходом. По сути оракл создал программный аналог ccNUMA, что объединяет

Архитектура базы данных: Кластерная против Федеративной

Oracle RAC обзор возможностей

Кроме этого MSSQL2005 sp1 добавлена фича DB mirroring, однако "зеркало" нельзя использовать т.к. оно постоянно в режиме восстановления:

Because the mirror database is in a recovering state, it cannot be accessed directly. You can create database snapshots on the mirror to indirectly read the mirror database at a point in time. (See 'Database Mirroring and Database Snapshots' later in this paper.)

Опрерационные системы

MSSQL работает только на опреционной системе от Майкростофт, на Windows, Oracle кроме ОС Windows может использоваться на всевозможных Unix системах (AIX, HPUX, Solaris, Solaris x86) и Linux. Это заметный плюс оракла, т.к. на начальном уровне Linux может давать заметную разницу в стоимости, а в энтерпрайз секторе заметные бонусы в масштабируемости и TCO. Например, на середину 2011 года Майкрософт уже отказалась от развития Итаниум линейки, которые серьезно отстают в производительности Unix систем от IBM, при том что Итаниум это самые мощные сервера, на которых можно запускать MSSQL.
Версия 10g была выпущена и для zOS, но было объявлено, что 11g уже для мейнфреймов не будет выпущена.

История& тесты TPC

Первые тесты MSSQL2K5 индустрия ждала с нетерпением, даже волновалась. Однако первый тест за пару месяцев до релиза все же появился, но особого впечатления не произвел. Этот тест с трудом превзошел 2.5 годовалый тест оракла на системе с 1.5Ghz итаниумах и что интересней не дотянул до примерно того же времени теста RAC на тех-же 1.5Ghz итаниумах. На своем сайте Intell заявляет, что 1.6Ghz на 25% быстрее:

Intel® Itanium® 2 processor 1.60 GHz with 9MB L3 Cache expected to deliver up to 25% performance boost compared to Itanium® 2 processor 1.50 GHz with 6MB L3 Cache.

Однако превзойти оракл удалось лишь со второй попытки, но всего лишь на 4%, т.е. имея в распоряжении 64 процессора, новую систему i/o, процессоры на 25% быстрее и памяти на 25% больше удалось показать лишь 4% выигрыш. В то же время этот результат почти на треть хуже чем другой результат оракла на 32х процессорах power5 (64 ядра).

Да и что интересно – первый тест загадочно исчез и теперь имеет статус WithdrawnCategory 1

Промышленые тесты на идентичном железе:

1. SAP-SD тест на HP Integrity rx6600, 4 processors / 8 cores / 16 threads, Dual-Core Intel Itanium 2 9050 1.6 GHz, 32 KB(I) + 32 KB(D) L1 cache, 2 MB(I) + 512 KB(D) L2 cache, 24 MB L3 cache

Oracle на HP-UX 11iV3 быстрей MSSQL2k5 почти на 30%
http://www.sap.com/solutions/benchmark/pdf/cert7006.pdf
http://www.sap.com/solutions/benchmark/pdf/cert8306.pdf

----------------------------------

2. TPC-C тест на практически идентичном железе, у MSSQL2k5 заметно сильней i/o система, но несмотря на это оракл впереди:
Oracle10g
MSSQL2k5

----------------------------------

3. Первый тест oracle10g в SAP-SD на идентичном железе от Fujistu опередил mssql2k5 на 41%.
63400 против 44680 SAPS
http://www.sap.com/solutions/benchmark/pdf/cert6806.pdf
http://www.sap.com/solutions/benchmark/pdf/cert7106.pdf

--------------------------------

4. SAP-SD тест от Fujitsu на идентичном железе, старенький oracle9 оказался на 24% быстрее: 25,050 saps против 20,180 saps у mssql2k5.

Oracle9
MSSQL2K5

-----------------------------

Переносы

Дата выхода MSSQL переносилась 4 раза и задержалась на 3 года, в результате клиенты выбравшие "product upgrades during a two- or three-year window" не получили обещаных обновлений:

Under Microsoft's licensing programs, customers can choose to get product upgrades during a two- or three-year window rather than buy a new licence when new products come out. The annuity program, in which customers pay a discounted licence fee and then a percentage of that fee over the contract's life, is intended to simplify purchases and save customers money, while giving Microsoft more predictable revenue.
....
With the delay of Yukon, companies that purchased a three-year upgrade licence for SQL Server in 2001 will not receive anything for their investment, Helm noted. Disgruntled customers might then shy away from the automatic upgrade option, and even stop buying upgrades altogether, he said.

http
://news.zdnet.co.uk/software/windows/0,39020396,39148257,00.htm

Доля на рынке

Worldwide 2005 Vendor Revenue Estimates from RDBMS Software, Based on Total Software Revenue (Millions of Dollars)

Company

2005

2005 Market Share (%)

2004

2004 Market Share (%)

2004-2005 Growth (%)

Oracle

6,721.1

48.6

6,234.1

48.9

7.8

IBM

3,040.7

22.0

2,860.4

22.4

6.3

Microsoft

2,073.2

15.0

1,777.9

13.9

16.6

Teradata

440.7

3.2

412.1

3.2

6.9

Sybase

407.0

2.9

382.8

3.0

6.3

Other Vendors

1,134.7

8.2

1,090.4

8.5

4.1

Total

13,817.4

100.0

12,757.8

100.0

8.3

Source: Gartner Dataquest (May 2006)

Более свежие данные за 2007 год

Более свежие данные за 2008 год

Цены

MSSQL

Oracle

Express Edition

бесплатно

Express

бесплатно

Workgroup Edition

$3,899

max 2 CPU

RAM 3 GB

Standart one

max 2 CPU

RAM Unlimited

$5,000

Standard Edition

$5,999

max 4 CPU

Standart

max 4 CPU

$15,000

Enterprise Edition

$24,999

Enterprise

$40,000

Т.е. получается, что на стандартную 2CPU 8-cores машину из расчета хотя бы 1GB RAM на одно процессорное core oracle standart one окажется дешевле mssql2k5, т.к. workgroup edition Майкрософт ограничивает 3Gb RAM, которых явно мало на 8 ядер и mssql2k5 прийдется лицензировать на Standart Edition. Кроме этого у оракла существует вариант не бесконечной по времени лицензии, а на 3-5 лет, которая дешевле.

Еще стоит учесть, что в оракле лицензируется Edition, а не версия. у Майкрософт при переходе с 2005 на 2008 версию придется доплачивать.

В 2008 году цены на Оракл поднялись на 15%. Standart Edition One теперь стоит $5,800, Standart edition $17,500

Интересная лит-ра:

Edison Group, Comparative Management Costs Study: Oracle Database 11g vs. Microsoft SQL Server 2008