Ich habe eine Datenbank in Produktion seit fast 3 Jahren, auf Sql 2008 (war '05, davor). aber es ist nicht sehr performant. Also bin ich Tweaking das Schema und Abfragen, um zu helfen, einige Dinge zu beschleunigen.Außerdem enthalten eine Punktzahl von Haupttabellen etwa 1-3 Mill Reihen, pro Tabelle (um ua Schätzung der Größen zu geben).Bitte erklären Sie mir, wenn ich mein DB-Schema aus Gründen der Leistung zerstöre :(
Hier ist ein Beispieldatenbank Diagramm (Soz unter NDA, so kann ich das Original nicht angezeigt): -
alt text http://img11.imageshack.us/img11/4608/dbschemaexample.png
Dinge zu beachten (die direkt auf meine pro verbunden sind blem): -
- Ein Fahrzeug kann 0 (NULL) oder 1 Radio haben. (Linke äußere Verbindung)
- Ein Fahrzeug kann 0 (NULL) oder 1 Cupholder (linke äußere Verbindung) haben
- Ein Fahrzeug hat 1 Reifentyp (Inner Join).
Erstens sieht dies wie ein normalised database schema aus. Ich sauge und DB-Theorie, also ich vermute, das ist 3NF (mindestens) ... berühmte letzte Worte :)
Nun, dies ist meine Datenbank-Performance zu töten, weil diese beiden äußeren Joins und inneren Join aufgerufen werden ein viel Und es gibt auch ein paar mehr Joins in vielen Aussagen.
Um dies zu beheben, dachte ich, ich könnte versuchen und indizierte Sicht. Das Erstellen der Ansicht ist ein Kinderspiel. Aber es Indizierung funktioniert nicht -> kann nicht indizierte Sichten erstellen mit Verknüpfungen OR selbstbeziehende Tabellen (auch eine andere prob :()
Also, ich habe stundenlang geweint (und /wrists, dyed hair und wrote an emo song über. es und legt es auf myfailspace) und hat folgendes ...
- Added eine neue Zeile in jeden 'optional' Outer-Join-Tabellen (in diesem Beispiel Radios und Cupholder). ID = 0, Rest der Daten = 'Unknown Blah' oder 0's
- Elterntabellen aktualisieren, so dass alle NULL-Daten jetzt eine 0 haben
- Update relat Ionenschaft von äußeren Verbindungen zu inneren Verbindungen.
Jetzt funktioniert das. Ich kann sogar meine indizierte Sicht erstellen, die jetzt sehr schnell ist.
Also ... ich habe Schmerzen. Das widerspricht einfach allem, was ich gelernt habe. Ich fühle mich dreckig. Allein. Infiziert.
Ist das eine schlechte Sache zu tun? Ist das ein übliches Szenario
der Denormalisierung einer Datenbank
aus Gründen der Leistung?
würde ich einige Gedanken zu diesem lieben, bitte
PS :). Diese Bilder findet ein zufälliger Google - also nicht ich.
Sie sagen, ein innerer Join ist schneller als ein äußerer Join? Es sollte nicht sein - kannst du ein Beispiel angeben, was langsam ist? –
BTW: Sie haben Ihre Normalisierung nicht beeinflusst - es gibt viele Diskussionen über die Verwendung von Null in Tabellen und einige würden Ihre Änderung als eine Verbesserung sehen. –
Welche Indizes haben Sie in Ihrer vorhandenen Vehikeltabelle? Ein Beispiel für eine langsame Abfrage wäre auch nützlich. – EvilRyry