2013-05-14 5 views
6

Ich habe Daten, die eine Matrix von ganzzahligen Werten ist, die eine gebänderte Verteilungskurve angeben. Ich optimiere die SELECT-Leistung gegenüber der INSERT-Leistung. Es gibt maximal 100 Bands. Ich werde in erster Linie diese Daten durch Summieren oder Mittelung von Bändern über einen Zeitraum hinweg abfragen.Verbessert die Denormalisierung von Zeilen in Spalten die Leistung in SQL Server?

Meine Frage ist kann ich erreichen bessere Leistung durch Abflachung dieser Daten über eine Tabelle mit 1 Spalte für jedes Band, oder mit einer einzigen Spalte, die den Bandwert darstellt?

Flattened Daten

UserId ActivityId DateValue Band1 Band2 Band3....Band100 
10001 10002  1/1/2013 1  5  100  200 

ODER Normalized

UserId ActivityId DateValue Band BandValue 
10001 10002  1/1/2013 1 1 
10001 10002  1/1/2013 2 5 
10001 10002  1/1/2013 3 100 

Beispielabfrage

SELECT AVG(Band1), AVG(Band2), AVG(Band3)...AVG(Band100) 
FROM ActivityBands 
GROUP BY UserId 
WHERE DateValue > '1/1/2012' AND DateValue < '1/1/2013' 

Antwort

8

Speichern Sie die Daten im normalisierten Format.

Wenn Sie von diesem Schema keine akzeptable Leistung erhalten, sollten Sie sich zunächst überlegen, welche Indizes Sie in der Tabelle haben, anstatt das Denormalisieren durchzuführen. Vermutlich fehlt Ihnen ein Index, der dafür sorgt, dass er ähnlich wie die denormalisierte Tabelle funktioniert. Versuchen Sie als Nächstes, eine Abfrage zu schreiben, um Daten aus der normalisierten Tabelle abzurufen, sodass die Ergebnismenge wie die denormalisierte Tabelle aussieht, und verwenden Sie diese Abfrage, um eine indexed view zu erstellen. Dadurch erhalten Sie eine ausgewählte Leistung, die mit der denormalisierten Tabelle identisch ist, aber die Vorteile einer ordnungsgemäßen Normalisierung der Datenorganisation beibehalten.

1

Wenn Sie Daten möchten sehr schnell holen, dann sollten Sie die Tabelle und Indizes verflachen Verbesserung der Auswahl über einen breiten Spaltenbereich, der dem entspricht, was Sie vorgeschlagen haben. Wenn Sie jedoch an der Erstellung von Daten für schnelle Aktualisierungen interessiert sind, sollte die Verwendung der Normalisierung auf der 3. oder 4. Ebene in Kombination mit einer Vielzahl von Tabellen-Joins eine bessere Leistung bieten.

2

Wenn Sie auf alle (oder die meisten) Bänder in jeder Zeile zugreifen, ist die denormalisierte Form besser. Viel besser in meiner Erfahrung.

Der Grund ist einfach. Die Größe der Daten in den Seiten ist viel kleiner, so dass viel weniger Seiten gelesen werden müssen, um die Abfrage zu erfüllen. Der Overhead zum Speichern eines Bandes pro Reihe beträgt etwa 4 ganze Zahlen oder 32 Bytes. Also, 100 Bänder sind ungefähr 3200 Bytes. Innerhalb eines einzelnen Datensatzes beträgt die Datensatzgröße 100 * 4 + 8 oder etwa 408 Bytes. Wenn Ihre Abfrage eine signifikante Anzahl von Datensätzen liest, reduziert dies die E/A-Anforderungen erheblich.

Es gibt einen Vorbehalt. Wenn Sie nur einen Datensatz lesen, passen 100 Datensätze auf eine einzelne Seite in SQL und ein Datensatz passt auf eine einzelne Seite. Die E/A für eine einzelne Seite gelesen könnte in beiden Fällen identisch sein. Der Vorteil entsteht, wenn Sie mehr und mehr Daten lesen.

Ihre Beispielabfrage liest Hunderte oder Tausende von Zeilen. Die Denormalisierung sollte daher für eine solche Abfrage von Vorteil sein.

4

Die Denormalisierung optimiert genau einen Zugriff auf die Daten auf Kosten von (fast allen) anderen.

Wenn Sie nur eine Zugriffsmethode haben, die leistungskritisch ist, wird Denormalisierung wahrscheinlich helfen; obwohl eine korrekte Indexauswahl von größerem Nutzen ist. Wenn Sie jedoch mehrere performancekritische Zugriffspfade auf die Daten haben, suchen Sie besser nach anderen Optimierungen.

Erstellung eines geeigneten gruppierten Index; Setzen Sie Ihre nicht geclusterten Indizes auf SSDs. Speicher auf Ihrem Server erhöhen; sind alle Techniken, die die Leistung für alle * Zugriffe verbessern, anstatt zwischen verschiedenen Zugriffen zu handeln.

Verwandte Themen