2009-04-03 33 views
0

Ich habe eine große SQL Server-Tabelle, die etwa wie folgt aussieht:Umgang mit duplizierten Daten in SQL Server

 
ImageId int 
Page int 
FSPath varchar(256) 
ImageFrame int 
... 

Die Tabelle speichert einen Eintrag für jede Seite einer Reihe von Bilddateien. Dies geschieht, um die Tabelle zu ermöglichen, Bilder darzustellen, wobei jede Seite durch eine andere Datei dargestellt wird, und mehrseitige Bilddateien, die die Seiten in derselben Datei enthalten. Wenn ich mit einem mehrseitigen Setup zu tun habe, ist der Wert der FSPath Spalte genau für jede Seite im gleichen Dokument dupliziert, die vielen Platz frisst (dieser Tisch allein zur Zeit ist ~ 5GB). Es scheint sehr verschwenderisch zu sein, die Daten auf diese Weise zu duplizieren, aber ich war nicht in der Lage, eine alternative Lösung zu finden, mit der ich zufrieden bin.

Das Verwendungsmuster für diese Tabelle wird von Suchvorgängen basierend auf dem Primärschlüssel (ImageId/Page) für den Pfad (und andere Spalten) dominiert, aber ich muss auch effizient neue Daten einfügen und gelegentlich löschen können.

Wenn ich eine Nachschlagetabelle für die Pfadelemente erstellen und eine Pfadelement-ID in die Seitentabelle einfügen, müsste ich sie sowohl durch die ID als auch durch den Pfad indizieren, was das Szenario mit einem eindeutigen Pfad verletzen würde Stück für jede Seite und komplizieren das Einfügen neuer Daten, wo der Pfad in der Nachschlagetabelle vorhanden sein kann oder nicht. Außerdem würde das Löschen einer Zeile in der Hauptseitentabelle dazu führen, dass ich den zugehörigen Pfadeintrag bereinige, wenn er nicht mehr verwendet wird.

Ich hatte gehofft, dass ich eine aktualisierbare Sicht auf die verbundenen Tabellen erstellen konnte und SQL Server die Magie für mich tun, aber ich bekomme die Nachricht: Ansicht oder Funktion 'Scrap.dbo.PageView' ist nicht aktualisierbar, weil die Die Änderung betrifft mehrere Basistabellen. Versuchen, eine Einfügung durchzuführen.

Gibt es eine vernünftige Art und Weise, dies zu tun, die ich gerade fehlt bin, oder bin ich kein Glück?

Antwort

1

Dies greift das Duplikate-Einträge-Problem nicht an, weil ich nicht 100% meinen Kopf über Ihr Schema bekommen kann, aber hier ist eine Idee, die ich auf potenzielle Größe reduzieren musste, vorausgesetzt, Sie speichern Pfadinformationen als auch als Dateigröße.

Was ist das Dateisystem aussehen? Wenn es sich um eine tiefe Verzeichnisstruktur handelt, können Sie diese in einer separaten Nachschlagetabelle abstrahieren, anstatt die Pfadinformationen jedes Mal zu speichern? Zum Beispiel so etwas wie:

Tabelle WEGE:

 
ID PATHNAME  PARENT 
int varchar(128) int, FK on PATHS.ID 
--- ------------ -------------------- 
1 /    NULL 
2  images   1 
3  dir1   2 
4  dir2   2 

Oder für eine noch schnellere Rekonstruktion des Weges, speichern Sie einfach die ganze Sache, solange Sie nur jeden Pfad einmal zu speichern. Auf diese Weise müssen Sie an die Wurzel keine Sorgen über Rekursion zurück durch den Pfad jedes Mal zu montieren:

 
ID PATHNAME 
int varchar(128) 
--- ------------ 
1 /
2  /images 
3  /images/dir1 
4  /images/dir2 

Dann können Sie Ihre Tabelle Definition ändern zu sein:

 
ImageId int 
Page int 
FileName varchar(256) 
Path int, FK to PATHS.ID 
ImageFrame int 
... 

und vielleicht sparen ein bisschen Platz, besonders wenn es sehr tief ist.

0

Ich glaube, Sie haben Recht - Erstellung eine neue Tabelle nur die einzigartigen Wege speichern kann in der ursprünglichen Tabelle tatsächlich mehr Platz als die duplizierten Daten zu verlassen. Außerdem erschwert es die Abfragen und Updates. Dies hängt natürlich von der Anzahl der Duplikate ab.

0

Ich bin verwirrt über das eigentliche Problem? Hast du Probleme mit der Performance oder sind 5 Gigs wirklich so teuer?Wenn Leistung das Problem ist, ist eine kleinere Tabelle möglicherweise nicht die Lösung. Ich würde untersuchen, FSPath in char (256) zu ändern. Es nimmt mehr Platz in Anspruch, aber Ihre Daten werden besser auf der Festplatte ausgerichtet und sollte Leistung helfen. Ich würde auch die Änderung des Schemas unterstützen, wie Sie beschrieben haben, aber wenn es nicht durchführbar ist, weil Verbraucher Code nicht ändern können/werden, müssen Sie möglicherweise einen Test erstellen, um zu zeigen, dass sich die Änderung lohnt.

+0

Ich habe einige Performance-Probleme aufgrund der Datenträger-Seitenwechsel, die beim Laden dieser Einträge auftritt. Ich habe eine feste Breite char Ansatz untersucht, aber meine durchschnittliche Pfadlänge ist jetzt 25 Zeichen, Wechsel zu char (256) würde fast 10x meine Speicheranforderungen und mehr Festplattenfehler verursachen. –