Glorf.it

Glorf IT

Bedenkliches aus dem IT-Alltag

11. Februar 2010 um 22:22

müde Datenbank-Witze

Aus meinem Fundus hier ein paar (recht alte) Datenbank-Witze:

Q: Why couldn't the index become a tightrope-walker?
A: It was unbalanced

Q: Was the cube straight or gay?
A; Neither, it was BI.

Q: What on earth was the query trying to do when it set fire to its wallet?
A: It must have been trying to warm its cache.

Q: How did the police catch the serial-killer query?
A: They used a Profiler

Q: What's a dentist's favourite MDX function?
A: Extract

Q: How did the BI developer send his backed-up database to a colleague on the other side of London?
A: In a .cab file

Die Quelle notierte ich damals leider nicht.

10. Februar 2010 um 22:05

Northwind heute

In meinem SQL-Einsteiger-Kurs nutze ich immer noch die gute, alte Northwind-Datenbank. Die gibt es nämlich noch und ist nach meiner Erfahrung gerade für Einsteiger ideal geeignet, weil alles so simple ist.

Mit der beiliegenden "instnwnd.sql" könnte man die Testdaten nach etlichen Anpassungen sogar auf einem anderen Datenbanksystem einspielen.

Aber einfacher ist es freilich, wenn man sich den SQL Server 2008 Express with Advanced Services installiert und darauf übt.

Da ich für meinen Fortgeschrittenen-Kurs die AdventureWorks verwenden, hier noch der Link auf die moderneren Testdatenbanken von Microsoft.

3. Februar 2010 um 23:36

Trace auswerten: sp_cursoropen

Auf sourceforge.net findet man eine Doku von sp_cursoropen. Das ist besonders dann interessant, wenn man in einem Profiler-Trace ein sp_cursoropen findet und sich fragt, was denn da wohl für ein Cursortyp dahinter steckt.



Hex-Wert Cursortyp
0x0001 Keyset-driven cursor.
0x0002 Dynamic cursor.
0x0004 Forward-only cursor.
0x0008 Static cursor.
0x0010 Fast forward-only cursor.
0x1000 Parameterized query.
0x2000 Auto fetch.
0x4000 Auto close.
0x8000 Check acceptable types.
0x10000 Keyset-driven acceptable.
0x20000 Dynamic acceptable.
0x40000 Forward-only acceptable.
0x80000 Static acceptable.
0x100000 Fast forward-only acceptable.

Das bedeutet beispielsweise, dass eine 16 im dritten Parameter (@scrollopt) auf den Cursortypen "Fast forward-only cursor" hinweist, was dem "Default Result Set" bzw. "Firehose Cursor" entspricht. Das ist dann der Idealfall. Alle anderen Cursortypen sind langsamer, wenn nur das Lesen der Daten im Vordergrund steht.

2. Februar 2010 um 20:19

SQL-PASS Franken: Sichern, Wiederherstellen, Integrity Check und Index Optimization

SQL-PASSUnglaublich aber wahr, seit dem letzten PASS-Vortrag ist schon wieder fast ein Monat vergangen. Daher findet am nächsten Dienstag, den 9.02.2010 um 18:30 Uhr, in Nürnberg wieder der nächste Vortrag der SQL-PASS Franken statt.
Das Thema ist diesmal aus der Administration und sogar mein Lieblingsthema: Datensicherung! OK, der genaue Titel ist etwas überfrachtet, aber spannt den Bogen etwas genauer: "Sichern, Wiederherstellen, Integrity Check und Index Optimization von Datenbanken im SQL Server". Hier die offizielle Beschreibung:

Die im SQL Server gespeicherten Daten können zum wertvollsten Unternehmensbesitz gehören. Daher gilt es, diese Daten gegen mögliche Ausfälle zuverlässig zu schützen. Regelmäßige Sicherungen und das Testen der Rücksicherungsstrategien gehören daher zu den vordringlichsten Aufgaben der SQL Administration. Der Microsoft SQL Server 2008 stellt leistungsfähige Sicherungs- und Wiederherstellungsfunktionen bereit.
Das Konzipieren und Implementieren einer sorgfältig geplanten und zuverlässigen Sicherungs- und Wiederherstellungsstrategie schützt Datenbanken vor Datenverlust aufgrund von Schäden, die durch die verschiedensten Fehler verursacht werden können.

Torsten Schüßler
referiert über die Themen:

  • Was ist ein zuverlässiges Backup?
  • vollständige Datenbanksicherung und Wiederherstellung über das Netzwerk hinsichtlich eines Worst-Case Szenario
  • Backup, Integrity Check & Index Optimization ein Script von Ola Hallengren
    (Ola Hallergren bietet eine hervorragende und leicht einzurichtende (und kostenlose) Script-Lösung für SQL Server 2005/2008 für Backup, Integrity Check und Index Optimierung)

Vorstellung des Referenten

Torsten Schüßler ist seit über 12 Jahren als Datenbank- und Systemadministrator tätig. Als Datenbankadministrator für die Unternehmensgruppe Europoles, einem ehemaligen Bereich des Pfleiderer Konzerns, ist er für den erfolgreichen Betrieb der Datenbankserver verantwortlich. Europoles ist Marktführer in Europa und produziert Masten, Stützen und Türme sowie Trägersysteme für vielfältigste Anwendungsmöglichkeiten. Im Jahr 2009 erzielte Europoles mit rund 800 Mitarbeitern einen Jahresumsatz von 120 Mio. Euro.
Als einer der maßgeblichen Autoren des deutschsprachigen SQL Server Portals www.InsideSQL.org, berichtet er zusammen mit Frank Kalis und Christoph Muthmann laufend über Interessantes zum SQL Server.

Gastgeber ist diesmal wieder die New Elements GmbH (Äußere-Bayreuther-Straße. 55, 90409 Nürnberg).

Und wie jedes Mal so ist auch diesmal der Eintritt frei, auch Nicht-Mitglieder sind herzlich eingeladen. Bitte dennoch bei Michael Deinhard unter M.Deinhard(ät)newelements.de oder Klaus Oberdalhoff unter kob(ät)sqlpass.de anmelden, damit die Anzahl der benötigten Stühle abgeschätzt werden kann. Im Januar mussten wir beispielsweise wegen des Ansturms ins benachbarte Hotel umziehen.

Mehr Infos hier.

26. Januar 2010 um 20:09

Bug: Syntax-Fehler im Kommentar

Mein Kollege Diethard machte mich auf einen Fehler im Microsoft SQL Server 2005/2008 aufmerksam, der bei Microsoft schon bekannt ist: Wenn man (*) als erstes nach in einem Zeilenkommentar schreibt, dann kommt ein Syntaxfehler.

Hier ein Beispiel:

--(*)

Weil das so kurz ist, hier ein hübsches Repro von Diethard:

RAISERROR('--(*)',0,0);
GO
--(*)
GO
RAISERROR('-- (*)',0,0);
GO
-- (*)
GO
/* Results
--(*)
Msg 102, Level 15, State 1, Line 1
Falsche Syntax in der Nähe von '--(*'.
-- (*)
*/
GO
RAISERROR('COUNT(1) --(*)',0,0);
GO
SELECT COUNT(1) --(*)
	FROM sys.sysobjects
GO
RAISERROR('COUNT(1) -- (*)',0,0);
GO
SELECT COUNT(1) -- (*)
	FROM sys.sysobjects
GO
/* Results
COUNT(1) --(*)
Msg 102, Level 15, State 1, Line 1
Falsche Syntax in der Nähe von '--(*'.
COUNT(1) -- (*)

-----------
1946
*/

Weil Microsoft dem so wenig Bedeutung beimisst, wird es vermutlich erst am St.Nimmerleinstag beseitigt, bemerkte ich ihm gegenüber. Daraufhin erstellte Diethard einen Algorithmus, ob der Tag schon gekommen ist:

DECLARE @AfterStNimmerlein bit;
BEGIN TRY
  EXEC('--(*)'); SET @AfterStNimmerlein = 1; 
END TRY BEGIN CATCH
  IF ERROR_NUMBER() = 102 SET @AfterStNimmerlein = 0; 
END CATCH; 
SELECT AfterStNimmerlein=@AfterStNimmerlein;

😉

Aber was uns wirklich interessieren würde: Wie kann es zu einem Syntaxfehler in einem Kommentar kommen?

25. Januar 2010 um 20:13

Webcasts zu Performance-Monitoring und -Tuning

Klaus – unser Regionalgruppenleiter der örtlichen SQL-PASS – wies mich auf ein paar kostenlose Webcasts zu Performance-Monitoring und -Tuning mit Microsoft SQL Server bei sqlworkshops.com hin. Sie sind als Webcasts vom Level 400 ausgeschrieben.

Wenn man sich die Seite ansieht, dann wird klar, dass die Anbieter mit dieser Maßnahme auf sich aufmerksam machen wollen. Das finde ich gut: man kann sich eine Meinung über deren Angebote bilden und muss so nicht die Katze im Sack kaufen. Ich persönlich habe immer Hemmungen Schulungen zu solchen Themen zu besuchen, weil ich schon zu oft enttäuscht wurde. Das würde mir hier nicht passieren. Jetzt müsste ich mir nur die Zeit nehmen die ersten beiden Teile anzusehen (der dritte erscheint erst noch als zeitlich befristetes Angebot).

Ich habe es so verstanden, dass es sich um den darunter erwähnten Workshop von R. Meyyappan handelt, den sowohl Lubor Kollar als Itzik Ben-Gan auch loben.

Da ich es aber noch nicht geschaut habe, ist die Info nur ohne Gewähr. Aber weil sich jeder selber eine Meinung bilden kann, sollte das kein Problem sein. Außerdem habe ich jetzt schon die Empfehlung von drei SQL-Größen, was soll da noch schief gehen?

24. Januar 2010 um 16:08

Grundlagen zum Optimizer und Statistiken

Der Artikel "13 Things You Should Know About Statistics and the Query Optimizer bei Simple-Talk ist ein sehr guter Einstieg in die Grundlagen zum Optimizer und Statistiken am Microsoft SQL Server. Alle grundlegenden Begriffe werden erklärt und damit auch welche Indexe der Optimizer gerne aufgrund welcher Statistiken auswählt.

Ergänzend dazu eignet sich die Artikel "Column Statistics Give the Optimizer an Edge"
und "Making the Most of Automatic Statistics Updating" beim "SQL Server Magazine". Hier erklärt Kalen Delaney die Feinheiten bzgl. der leider nicht immer aktuellen Statistiken.

Wer das ganz lieber bei Microsoft nachlesen will, der wird in den Books Online fündig.

13. Januar 2010 um 19:58

NoSQL-Datenbanken

Über den sehr interessanten Artikel "Aufstand der NoSQL-DBs" in der Zeitschrift "database pro 1/2010" wurde ich auf die sogenannten "no-SQL-Datenbanken" aufmerksam. Den Begriff kannte ich bisher noch nicht. Das ist ein Oberbegriff für alle möglichen "neuen" Datenbanksysteme, die Bedürfnisse erfüllen, die man mit den bisherigen relationalen Systemen nicht oder nicht gut abdecken kann. Die relationalen Systeme sind sehr klar definiert und man kann relativ schnell das Grundkonzept erfassen und erläutern.

Die NoSQL-Systeme definieren sich hingegen dadurch, dass die anders funktionieren als relationale Systeme. Dementsprechend groß ist die Vielfalt der dahinter steckenden Technologien. Einen ganz guten Überblick bietet die Seite www.nosql-databases.org. Hier werden die Datenbanksysteme so kategorisiert:

  • Wide Column Stores
  • Document Stores
  • Key Value / Tuple Stores
  • Eventually Consistent Key Value Stores
  • Graph Databases
  • Object Databases
  • und sonstigen 😉

So unterschiedlich wie die eingesetzten Technologien, so unterschiedlich sind die Anforderungen, die die Systeme erfüllen wollen. Daher wird "NoSQL" mittlerweile auch mit "not only SQL" übersetzt. Im oben genannten Artikel wird NoSQL so definiert:

Neue Datenbanken und Datenbanktechnologien, die in der Mehrzahl viele der folgenden Punkte adressieren: nicht relational, verteilt, Open Source und horizontal skalierbar. Des Weiteren gelten häufig noch folgende Eigenschaften: relativ schemafrei, Replikationsunterstützung, Partitionierung- beziehungsweise Sharding-Unterstützung, einfaches API, "evantually consistent" […] und einiges mehr.

Das klingt nun nicht wirklich nach einer Definition, was aber daran liegt, dass die verschiedenen Systeme sich sehr stark voneinander unterscheiden. Ich bin mal gespannt, ob einzelne dieser Systeme sich im Markt etablieren können.

10. Januar 2010 um 14:19

SQL-PASS Franken: Unternehmensplanung mit dem SQL Server

SQL-PASSNächste Woche am Dienstag, den 19.01.2010 um 18:30 Uhr, findet in Nürnberg wieder der nächste Vortrag der SQL-PASS Franken statt. Das Thema stammt aus der Praxis und stellt ein konkretes Einsatzszenario dar, anstelle der bisher üblichen Ausschnitte einzelner Themen: "Unternehmensplanung mit dem SQL Server am Beispiel des Bekleidungshauses Rudolf Wöhrl AG". Hier die offizielle Beschreibung:

Unternehmensplanung mit dem SQL Server am Beispiel des Bekleidungshauses Rudolf Wöhrl AG

Für die erfolgreiche Steuerung von Unternehmen sind Unternehmensplanungen notwendig. Neben der standardisierten Finanzplanung (GuV, Bilanz) gibt es in jedem Unternehmen eine große Anzahl individueller, dynamischer Planungsaufgaben: Finanzplanung, Absatzplanung, Produktionsplanung, Personalplanung, Investitionsplanung, Budgetierung und Forecasting.
Unternehmensplanungen sind komplexe, sich wiederholende Prozesse, die sich in jedem Unternehmen anders gestalten. Sie sind direkt abhängig von Unternehmensabläufen und -strukturen. Häufig von mehreren Personen erstellt, durch Genehmigungsverfahren angenommen, abgelehnt, überarbeitet und schließlich in einem großen Gesamtplan zusammengeführt.

Das Bekleidungshaus Rudolf Wöhrl AG hat auf Basis des SQL Server 2008 unter anderem eine Absatz- und Ergebnisplanung für ihre 40 Standorte erfolgreich realisiert.
Herr Marcus Kresin, BI-Leiter von Wöhrl, zeigt uns die Anforderungen an eine Planungslösung und die Lösungsansätze.

Anschließend stellt uns Herr Westphal, Leiter Consulting der Firma Bissantz, die Möglichkeiten vor, Planungssysteme mit dem SQL Server 2005/2008 zu realisieren.
Der Schwerpunkt liegt hierbei auf dem Vergleich relationaler und multidimensionaler Ansätze zur Lösung von typischen Aspekten von Planungslösungen.

Vorstellung der Referenten:
Marcus Kresin leitet seit Anfang 2009 bei der Rudolf Wöhrl AG den Bereich Business Intelligence (BI). Er arbeitete zuvor im internationalen Luftfahrtbereich und seine Aufgaben lagen dort in der Optimierung von Prozessen im Operativen- und Finanzsektor mit der Hilfe von Software- und Datenbanklösungen.

Michael Westphal, Leiter Consulting der Firma Bissantz, beschäftigt sich seit Jahren intensiv mit der Konzeption und Realisation von BI- und Planungslösungen mit dem SQL Server. In einer Vielzahl von Projekten hat er einen tiefen Einblick in die unterschiedlichen Kundenanforderungen, Vorgehensweisen und Lösungsmöglichkeiten bekommen.

Gastgeber ist diesmal wieder die New Elements GmbH (Äußere-Bayreuther-Straße. 55, 90409 Nürnberg).

Und wie jedes Mal so ist auch diesmal der Eintritt frei, auch Nicht-Mitglieder sind herzlich eingeladen. Bitte dennoch bei Michael Deinhard unter M.Deinhard(ät)newelements.de oder Klaus Oberdalhoff unter kob(ät)sqlpass.de anmelden, damit man die Anzahl der benötigten Stühle abgeschätzt werden kann.

Mehr Infos hier.

3. Januar 2010 um 11:13

Vorsicht bei Cursor auf TVF/View mit PIVOT

Kürzlich wurde der kummulative Update 7 (CU7) für den SQL Server 2005 SP3 veröffentlicht. Darin wird ein Problem beseitig, das man nur schwer entdecken kann, wenn man betroffen ist: Bei einem Cursor auf eine View oder eine Table-Valued-Fumction kann der Cursor falsche Ergebnisse liefern. Hier ein Repro, dass auch mit SQL Server 2008 funktioniert:

SET NOCOUNT ON;
go
USE tempdb
go
BEGIN TRY DROP TABLE dbo.tg_table1 END TRY BEGIN CATCH END CATCH;
BEGIN TRY DROP TABLE dbo.tg_table2 END TRY BEGIN CATCH END CATCH;
BEGIN TRY DROP FUNCTION dbo.f_PivotAndOuterJoin END TRY BEGIN CATCH END CATCH;
go
– create table 1
SELECT cy, value, type
INTO dbo.tg_table1
FROM ( SELECT 2002, 1, 3 UNION ALL
SELECT 2003, 1, 3 UNION ALL
SELECT 2004, 1, 3 UNION ALL
SELECT 2005, 1, 3 UNION ALL
SELECT 2006, 1, 3 UNION ALL
SELECT 2007, 1, 3 UNION ALL
SELECT 2008, 1, 3 UNION ALL
SELECT 2009, 1, 3 UNION ALL
SELECT 2008, 1, 3 UNION ALL
SELECT 2009, 1, 3) AS x(cy, value, type);
go
– create table 2
SELECT cy
INTO dbo.tg_table2
FROM ( SELECT 2003 UNION ALL
SELECT 2004 UNION ALL
SELECT 2005 UNION ALL
SELECT 2006 UNION ALL
SELECT 2007 UNION ALL
SELECT 2008) AS x(cy);

CREATE CLUSTERED INDEX c_1 ON dbo.tg_table2 (cy);
go
CREATE FUNCTION dbo.f_PivotAndOuterJoin ()
RETURNS TABLE AS
RETURN
SELECT d.cy, [3] AS value
FROM tg_table1 AS t1
PIVOT ( MAX(value) FOR t1.type in ([3]) ) AS d
LEFT OUTER JOIN dbo.tg_table2 AS t2
ON d.cy=t2.cy

go

DECLARE @year int;

PRINT 'wrong results:';

DECLARE cCursor CURSOR FOR
SELECT cy FROM dbo.f_PivotAndOuterJoin() ORDER BY cy;

OPEN cCursor;
FETCH NEXT FROM cCursor INTO @year;

WHILE @@FETCH_STATUS = 0 BEGIN
PRINT convert(varchar, @year);

FETCH NEXT FROM cCursor INTO @year;
END
CLOSE cCursor;
DEALLOCATE cCursor;

PRINT ' '; – only to get an empty line
go
DECLARE @year int;

PRINT 'correct result (with STATIC cursor):';

– STATIC, FAST_FORWARD, or READ_ONLY are OK,
– but FORWARD_ONLY, DYNAMIC, SCROLL, or KEYSET are not OK
DECLARE cCursor CURSOR STATIC FOR
SELECT cy FROM dbo.f_PivotAndOuterJoin () ORDER BY cy;

OPEN cCursor;
FETCH NEXT FROM cCursor INTO @year;

WHILE @@FETCH_STATUS = 0 BEGIN
PRINT convert(varchar, @year);

FETCH NEXT FROM cCursor INTO @year;
END
CLOSE cCursor;
DEALLOCATE cCursor;

/* output:

wrong results:
2009
2004
2005
2006
2007
2008
2009

correct result (with STATIC cursor):
2002
2003
2004
2005
2006
2007
2008
2009
*/

Die genauen Bedingungen sind im KB-Artikel 976565 beschrieben:

# In Microsoft SQL Server 2005, you have a query that opens a cursor of type FORWARD_ONLY, DYNAMIC, SCROLL or KEYSET.
# The cursor is in an inline table-valued function or a view.
# The inline table-valued function or the view uses either a PIVOT operator or an UNPIVOT operator.
# In addition to the source table of the PIVOT or UNPIVOT operator, there is at least one other table that is referenced in the inline table-valued function or the view.

Alle Bedingungen müssen zutreffen. Meine intuitive Reaktion ist berechenbar: schon wieder ein Argument gegen Cursor. Aber leider gibt es immer noch einige Situationen in denen man unbedingt Cursor benötigt. Das oben gesagt trifft natürlich auch für client-seitige Cursor zu.

16. Dezember 2009 um 22:56

Festplatten mit 4 KByte Sektorgröße und SQL Server

Wenn man eine SQL-Server-Datenbank auf einem Festplattensystem mit einer Sektor-Größe von 512 Bytes, das ist die derzeit übliche Größe, angelegt hat, dann kann man diese Datenbanken nicht einfach dateiweise auf eine Festplatte mit einer anderen Sektorgröße verschieben und dann dort erneut anhängen.

Disclaimer: Ich meine hier nicht die "logische" Cluster-Size, die beim Formatieren der Laufwerke angegeben wird, sondern die physische Sector-Size, die vom Hersteller festgelegt wird.

Bisher hatten Festplatten eigentlich immer eine Sektor-Größe von 512 Bytes. Aber das wird sich bald ändern, weil bestimmte Größen damit nicht mehr machbar sind. Angekündigt sind die neuen Festplatten von der IDEMA ja schon lange. Aber heute las ich erstmals von Festplatten, die nun tatsächlich mit der neuen Sektor-Größe von 4096 Bytes produziert werden. Bisher hatte man nur mit SAN und manchen NAS die Möglichkeit eine andere Sektor-Größe zu konfigurieren.

Wo ist nun das Problem?

In den Dateien der SQL-Server-Datenbank ist festgehalten mit welcher Sektor-Größe die Datenbank angelegt wurde. Verschiebt man die Dateien auf eine Festplatte mit der Sektor-Größe 4096, dann weiter sich der SQL-Server die Datenbank anzuhängen. Fällt also beispielsweise die Festplatte aus und dann führt auf einer Neuen (mit abweichender Sektor-Größe) eine Rücksicherung durch, dann kann man die Datenbanken nicht mehr in Betrieb nehmen. Es gibt laut Microsoft keine Möglichkeit die Daten da wieder herauszuholen.

Das gilt leider auch, wenn man eine Sicherung mittels BACKUP anlegte, weil der RESTORE die Seiten genauso wiederherstellt. Daher hat die so wiederhergestellte Datenbank wieder eine Sektorgröße von 512 Bytes. Microsoft empfiehlt von irgendwoher eine alte Platte zu besorgen, die Datenbank dort anzuhängen, eine neue Datenbank auf der neuen Platte (leer) anzulegen und die Daten dann von der alten in die neue zu kopieren. Die Datenbanken erhalten den Stempel beim Anlegen und behalten ihn auf Lebenszeit. Die Sektor-Size wird dabei von der des Festplattensystem bestimmt. Das ist leider nicht konfigurierbar.

Der umgekehrte Fall ist hingegen unproblematisch: Wurde eine Datenbank auf einer Festplatte mit 4K Sektor-Größe angelegt, dann kann sie einfach auf Festplatten mit 512Bytes betrieben werden. Microsoft kennt das Problem und hat daher schon beim SQL Server 2005 die Systemdatenbanken mit der Sektor-Größe 4096 Bytes angelegt.

Warum muss der der SQL Server diese Infos speichern? Ich fand bisher nur konkrete Hinweise darauf, dass das Transaktionslog sektorweise geschrieben wird. Die Datenseiten werden immer gemeinsam behandelt, hier wäre das daher vermutlich nicht nötig, aber ich fand noch keinen Weg das zu umgehen. Das leigt aber vermutlich auch daran, dass ich noch kein Festplattensystem mit 4096 Bytes habe. Details zum Hintergrund finden sich im Artikel "Microsoft SQL Server I/O subsystem requirements for the tempdb database".

Zu dem Thema gäbe es noch viel zu sagen, falls Interesse besteht bitte einen Kommentar reinstellen…

11. Dezember 2009 um 20:34

Marktanteile im Datenbankmarkt

Verkaufte Einheiten von DatenbankmanagementlösungenMicrosoft informiert über den Presseverteiler über eine Statistik der Firma techconsult. Dort wurden die offenbar auf Basis der verkauften Stückzahlen die Marktanteile gegenübergestellt. Dennoch schneidet MySQL recht gut ab, obwohl da doch nur ein Bruchteil verkauft wird. Wenn man den Marktanteil in USD ausrechnen würde, dann dürfte Oracle die Nase vorn haben (die Lizenzen sind nämlich teurer). Leider fand ich bei techconsult keine Details, daher müssen wir die Infos von Microsoft als Basis nehmen:

Gemäß techconsult stieg der Anteil bei der installierten Basis im Fiskaljahr 2009 verglichen zum Vorjahr von 21,6 auf 22,5 Prozent. Für dieses Fiskaljahr wird der Anteil 23,3 Prozent betragen und damit erstmals höher liegen als derjenige der Oracle-Lösung (23,1 Prozent). Bei der Anzahl der verkauften Exemplare im letzten Fiskaljahr hat Microsoft bereits mit 26,1 Prozent Oracle (21,3 Prozent) übertroffen und ist damit Marktführer. In diesem Jahr steigt der Anteil von SQL Server auf 26,8 Prozent, während Oracle bei 21,3 Prozent stagniert.

Die von Microsoft in Auftrag gegebene Studie zeigt auch, dass die Kosten für die Microsoft-Lösung vergleichsweise niedrig sind. Der Marktanteil von Microsoft SQL Server nimmt nämlich zu, während der Anteil der Lösung an den Gesamtausgaben für alle Datenbankmanagementsysteme konstant bei 25,1 Prozent bleibt. Dagegen steigt der Anteil von Oracle an den Ausgaben von 27,4 auf 28,4 Prozent, obwohl der Marktanteil sinkt.

Immerhin geben sie zu, dass sie die Studie in Auftrag gaben…