Samstag, 22. Juni 2013

Bedeutung von aktuellen Statistiken für Indexe

In einem Projekt, zu dem ich erst vor kurzem hinzu gezogen wurde, ging es um die Verwendung von Indexen sowie die richtige Indexstrategie in einem Herstellerprodukt, das regelmäßig gegen Mittag manche Abfragen in der Ausführungszeit verdoppelte. Meine Aufgabe bestand darin, die Ursache zu finden und geeignete Strategien für den Kunden zu erarbeiten. Bei dieser Aufgabe wurden eine Vielzahl von Problemen offenkundig, von denen insbesondere der Sachverhalt dieses Artikels einen direkten Zusammenhang zwischen Statistiken und der Verwendung von Indexen zeigt.

Sonntag, 16. Juni 2013

FILLFACTOR – Vor- und Nachteile

Die Option FILLFACTOR ermöglicht bei der Erstellung von Indexen einen Füllgrad in Prozent zu bestimmen, mit dem Microsoft SQL Server die Indexseiten mit bestehenden Daten auffüllen soll. Bei einem Kunden wurde diese Option ebenfalls verwendet, jedoch wurden für ALLE Indexe ein serverweiter FILLFACTOR von 80% konfiguriert! Diese Strategie führte leider in in manchen Bereichen der Anwendung eher zu Nach- als zu Vorteilen. Interessant bei diesem Sachverhalt war jedoch die Aussage des IT-Leiters, dass ihnen die Einstellung eines pauschalen Wertes empfohlen wurde, um für alle Indexe kostspielige Page Splits zu vermeiden. .

Samstag, 8. Juni 2013

TRUNCATE TABLE <tablename> wird nicht protokolliert?

Diese Aussage habe ich heute während eines Kundentermins von einem DBA gehört. Solche “Mythen” werden immer wieder mal über die SQL Foren verbreitet und dann – leider – durch Mundpropaganda gerne in die Unternehmen getragen. Diese Aussage ist FALSCH! Selbstverständlich wird ein TRUNCATE TABLE protokolliert– und zwar genau so, wie ein DELETE dbo.relation. Dieser Artikel beschreibt und belegt detailliert, dass man Aussagen, wie den obigen möglichst skeptisch gegenüber stehen sollte und nicht immer alles glauben darf, was man so hört.

Freitag, 7. Juni 2013

Dynamische Standardwerte für Attribute einer Relation

Der nachfolgende Artikel beschreibt einen Lösungsansatz für einer Anfrage aus den Microsoft Foren zu Microsoft SQL Server. Die Anforderung besteht darin, für ein Attribut einer Relation die DEFAULT-Eigenschaft zu variieren ohne dabei die Einschränkung selbst mit ALTER TABLE… zu ändern. Der hier beschriebene Lösungsansatz basiert auf der Verwendung einer Relation für die Speicherung von Standardvorgaben für Attribute. Diese Informationen werden dann mittels Funktion (die Basis der DEFAULT-Einschränkung ist) als Standardvorgaben verwendet. Der nachfolgende Artikel geht sehr detailliert auf die Vor- und Nachteile verschiedener Lösungsansätze ein.

Donnerstag, 6. Juni 2013

Aggregationsfunktionen beschleunigen

Wie häufig werden in Abfragen Aggregationen verwendet, um die Anzahl von Datensätzen, das Minimum, das Maximum oder andere Aggregationen zu ermitteln? Solche Aufgabenstellungen kommen in fast jeder Datenbankanwendung – irgendwie – vor. Die Standardabfragen hierzu lautet in der Regel:

SELECT AGGREGATION(*) FROM dbo.myRelation [WHERE Attribute = Predicate]

SELECT [Attribute], AGGREGATION(*) FROM dbo.myRelation [WHERE Attribute = Predicate] GROUP BY [Attribute]

Sehr häufig lassen sich solche Abfragen deutlich in der Ausführung beschleunigen, wenn man ein paar Hinweise für die Verwendung von Aggregationen berücksichtigt. Der nachfolgende Artikel verwendet COUNT()/COUNT_BIG() als Beispiel; es lässt sich aber auch auf alle anderen Aggregatsfunktionen anwenden.

Sonntag, 2. Juni 2013

IDENTITY-Werte…–warum wird der Wert um <increment> erhöht, obwohl die Transaktion nicht beendet werden kann

Wer kennt nicht den folgenden Sachverhalt? Eine Relation besitzt ein Attribut mit der Eigenschaft IDENTITY. Ein Datensatz soll eingetragen werden und dieser Prozess schlägt – aus welchen Gründen auch immer – fehl. Obwohl der Datensatz nicht erfolgreich eingetragen werden konnte, wurde der IDENTITY-Wert um <increment> erhöht. Warum passiert das und wie lässt sich der Grund für dieses Verhalten nachvollziehen? Das in diesem Artikel gezeigte Beispiel beschreibt die Hintergründe für dieses Verhalten in detaillierter Form.