Donnerstag, 29. November 2012

Idealer Datentyp für Clustered Index – GUID vs. INT

Am heutigen Tag war ich bei einem Kunden und sollte mir ein System anschauen, bei dem es Streitigkeiten zwischen Entwicklern und Systemadministratoren gab. Bei der Auswahl von Attributen für einen Surrogatschlüssel als Primary Key sollte dargelegt werden, welcher Datentyp und welche Verwendung ideal für einen optimierten Zugriff ist.

Montag, 26. November 2012

Optimierung von Datenbankmodellen–SARGable Abfragen

Ich bekam heute eine recht interessante Aufgabe auf den Tisch. Ein Kunde beklagte sich über die schlechte Ausführungsgeschwindigkeit einer Abfrage, der er von einem Programmierer erhalten hatte. Mir wurde der Code für die View zugeschickt und das Problem war sehr schnell gefunden. Statt eines Indexseek hat die Abfrage nur einen Indexscan durchgeführt. Ursache war, das die WHERE-Klausel keine SARGable Argumente verwendete. Mit diesem Artikel möchte ich aufzeigen, was SARGable ist und wie es funktioniert.

Sonntag, 25. November 2012

Tücken bei der Verwendung von sp_executeSQL

Mit Hilfe der Systemprozedur sp_executeSQL werden Transact-SQL-Anweisungen oder –Batches ausgeführt, die bzw. der mehrfach wiederverwendet werden kann oder dynamisch erstellt wurde. Insbesondere wird sp_executeSQL eingesetzt, um kompilierte Pläne für die erneute Verwendung in den Plancache zu laden. Das kann aber auch zu Problemen führen, die der nachfolgende Artikel behandelt.

Neue DMV für Struktur der Datenseiten (Pages)

Im Artikel “Optimierung von Datenbankmodellen – Richtige Wahl von Datentypen und Indexen (Teil 2)” habe ich gezeigt, wie man mit dem undokumentierten Befehl DBCC IND in Verbindung mit dem – ebenfalls undokumentierten – Befehl DBCC PAGE die Aufteilung der Daten in den einzelnen Datenseiten (Pages) analysieren kann. Das Problem von DBCC IND ist jedoch, dass die Ausgabe nicht sortiert werden kann. Also wurde als Workaround eine Tabelle angelegt, in die das Ergebnis von DBCC IND mittels sp_executeSQL in die Tabelle umgeleitet. Seit der Version von Microsoft SQL Server 2012 gibt es endlich eine – leider auch undokumentierte – DMV, mit deren Hilfe die Aufteilung der Daten ohne DBCC IND ausgegeben und unmittelbar weiterverarbeitet (filtern, sortieren) kann.

Samstag, 24. November 2012

Zertifikate für die Ausführung von Prozeduren verwenden

Bein einem internationalen Unternehmen, für das ich häufiger tätig bin, wurde eine Anforderung gestellt, einem Team [sysadmin]-Berechtigungen zu erteilen. Auf die Frage nach dem Grund für diese weitreichenden Berechtigungen wurde uns mitgeteilt, dass man Informationen über Jobs und deren Ausführungen, Fehler, Ausführungsdauer, usw. benötige. Diese Informationen wolle man mittels Reporting Services verarbeiten und ausgeben. Wir waren gefordert, eine Lösung anzubieten, die mit dem “minimal rights Prinzip” vereinbar ist. Lesen Sie in diesem Artikel, wie Sie einen Zugriff auf Objekte kontrolliert einschränken können, ohne Benutzern weitreichende Berechtigungen zu erteilen.

Mittwoch, 21. November 2012

Optimierung von Datenbankmodellen – die Verwendung von Planguides

Der Einsatz bei einem Kunden, dessen Datenbanksystem in einem Teilbereich sehr schlecht lief bildet die Grundlage dieses Artikels. Folgender Sachverhalt liegt dem folgenden Artikel zugrunde. Der Kunde hat eine “Out-Of-The-Box”-Applikation, die unter anderem ein Adressbuch beinhaltet. Dieses Adressbuch wird von den Mitarbeitern hoch frequentiert und von Zeit zu Zeit kommt es vor, dass die Performance massiv einbricht. Abfragen, die vorher in wenigen Sekunden ihre Daten an den Client lieferten, dauerten plötzlich bis zu 3 Minuten. Was ist da passiert?

Sonntag, 18. November 2012

Temporäre Tabellen vs. Tabellenvariablen (Funktionalität und Gültigkeit)

Mit diesem Beitrag möchte ich mich intensiv mit einem Thema beschäftigen, das in der Community teilweise sehr heftig diskutiert wird. Seit der Version Microsoft SQL Server 2000 gibt es die Möglichkeit, Tabellenvariablen zu benutzen. Seit es Tabellenvariablen gibt, werden die Vor- und Nachteile aufs heftigste diskutiert und um die Pros und Contras ranken sich viele Mythen. Einige von diesen “Mythen” möchte ich – durch Beispiele untermauert – widerlegen.

Freitag, 16. November 2012

Optimierung von Datenbankmodellen – Richtige Wahl von Datentypen und Indexen (Teil 5)

Mit diesem Beitrag möchte ich aufzeigen, wie wichtig es ist, auch bei Abfragen immer darauf zu achten, dass bei der Verwendung von Ausdrücken in der Einschränkung (WHERE-Klausel) Sorgfalt geboten ist. Wenn man Abfragepläne untersucht und stellt fest, dass ein Indexscan statt eines Indexseek verwendet wird, kann es an der Verwendung falscher Datentypen in der WHERE-Klausel liegen

Mittwoch, 14. November 2012

Optimierung von Datenbankmodellen – Richtige Wahl von Datentypen und Indexen (Teil 4)

Mit diesem Beitrag möchte ich aufzeigen, welche Auswirkungen die richtige Auswahl von Attributen für die Definition eines Indexes hat. Während meiner langjährigen Praxis habe ich immer wieder Datenmodelle gefunden, bei denen auf nahezu jedem Attribut der Relation ein dedizierter Index angewendet wurde. Warum hat sich die Performance eher verschlechtert als verbessert? Diesem Fehler möchte ich auf den Grund gehen und durch Beispiele die Wichtigkeit der sorgfältigen Planung von Indexen aufzeigen.

Dienstag, 13. November 2012

Optimierung von Datenbankmodellen–Richtige Wahl von Datentypen und Indexen (Teil 3)

In Teil 1 habe ich den Einfluss der Datentypen auf die Performance von Abfragen beschrieben und in Teil 2 wurde beschrieben, wie sich die Auswahl des geeigneten “Clustered Index” auf die Performance und das Datenvolumen auswirkt. In diesem Teil möchte ich die Besonderheiten von Indexen im Zusammenhang mit “Parameter Sniffing” etwas genauer beleuchten und durch Beispiele die Fallen aufzeigen.

Sonntag, 11. November 2012

Optimierung von Datenbankmodellen – Richtige Wahl von Datentypen und Indexen (Teil 2)

Nachdem im ersten Beitrag die Datenstruktur auf den Prüfstand kam und bereits Optimierungspotential bei der Auswahl der richtigen Datentypen und Datengrößen bestand, möchte ich mit dem aktuellen Beitrag etwas detaillierter auf Indexe und deren Optimierung eingehen. Der nachfolgende Beitrag beschäftigt sich zunächst einmal mit dem “Clustered Index” der im Beispiel verwendeten Struktur der Relation dbo.tbl_Companies

Samstag, 10. November 2012

Auswirkung von vollständig qualifizierten Objekten auf den Plancache von SQL Server

Einleitung

Bei meiner Arbeit mit SQL Server in mittelständischen und großen Unternehmen kam es immer wieder vor, dass Programmcodes von uns in die Testsysteme und Produktionssysteme implementiert werden mussten. Dabei war ein zentraler Aufgabenbereich die Überprüfung der Codes auf Fehler / Sicherheitsproblem. Mir ist sehr häufig aufgefallen, dass die Programmierer (ca. 70%) eine einfache Notation für die Aufrufe von Prozeduren oder für die Generierung von SQL-Abfragen verwendet haben.

Optimierung von Datenbankmodellen – Richtige Wahl von Datentypen und Indexen (Teil 1)

Mit dem nachfolgenden Thema möchte ich aus dem "Daily Business" berichten, in dem ich gebeten wurde, die Performance von Abfragen zu optimieren. Als Beispiel soll die folgende Datenstruktur (inklusive Indexes) verwendet werden. Dieses Beispiel werde ich für diesen wie auch die folgenden Themenkomplexe verwenden, um zu zeigen, wie man professionell an die Analyse und die Optimierung von Relationen und Indexes geht.