ORACLE vs. SQL Server: Wie Werbung blind für die Realität macht!

Die Lektüre eines Whitepaper von ORACLE kann einem tatsächlich die Galle hochkommen lassen ob der vielen tollen Dinge, die ORACLE beherrscht; während der Microsoft SQL Server – scheinbar – nur eine bessere Tabellenkalkulation zu sein scheint (so liest sich dieses Whitepaper zumindest). Über eine Beschreibung bin ich gestolpert, über die ich selbst bereits geschrieben habe – die Behauptung von ORACLE ist schlicht und einfach FALSCH!

Behauptung

Im Dokument “Technical Comparision of ORACLE Database 12c vs. Microsoft SQL Server 2012 – Focus on High Availability” (Stand November 2013) heißt es auf Seite 60:

Fast Online Add Column

With Oracle, adding new columns with DEFAULT value and NOT NULL constraint does not require the default value to be stored in all existing records. Instead, default values of columns are simply maintained in the data dictionary. This not only enables a schema modification in sub-seconds and independent of the existing data volume, it also consumes virtually no space. SQL Server does not offer online add column, as a schema lock is required, nor does it offer this fast add column optimization [22]:”

Mit Fußnote 22 ist ein Link auf die msdn-Seiten von Microsoft verbunden, der die einzelnen LOCK Modes beschreibt (http://msdn.microsoft.com/en-us/library/ms175519.aspx).

Realität

Diese Aussage ist schlicht und einfach falsch. Microsoft SQL Server 2012 speichert bei Erstellung von neuen Attributen mit DEFAULT-Werten diese neuen Werte NICHT in den Datenzeilen. Vielmehr werden DEFAULTS immer als Schema-Informationen in der dmo  [sys].[system_internals_partition_columns] hinterlegt.

SELECT  c.name                    AS column_name,
        pc.modified_count,
        pc.max_inrow_length,
        pc.has_default,
        pc.default_value
FROM    sys.system_internals_partitions p INNER JOIN sys.system_internals_partition_columns pc
        ON (p.partition_id = pc.partition_id) INNER JOIN sys.columns c
        ON (
             p.object_id = c.object_id AND
             pc.partition_column_id = c.column_id
           )
WHERE    p.object_id = object_id('dbo.foo')
ORDER BY
        c.column_id ASC;

Ich habe zu diesem Thema bereits im Juli 2013 einen umfangreichen Artikel mit nachvollziehbaren Beispielen geschrieben, der hier nachgelesen werden kann (“Verhalten von DEFAULT-Einschränkungen bei nachträglich hinzugefügten Attributen").

Vielleicht bin ich einfach nur altmodisch - Microsoft ist auch in vielen Dingen nicht fair gegenüber dem Markt - aber ich wünschte mir, die Unternehmen würden mehr auf die Vorteile ihres Produkts hinweisen als verkrampft danach zu suchen, was der Konkurrent – angeblich – nicht kann oder hat!

Sorry, das musste jetzt einfach mal gesagt werden…