2010-02-23 4 views
24

Ich versuche mein Bestes, um meinen Chef davon zu überzeugen, dass wir fremde Schlüssel in unseren Datenbanken verwenden - bisher ohne Glück.Gibt es einen schwerwiegenden Leistungseinbruch für die Verwendung von Fremdschlüsseln in SQL Server?

Er behauptet, es kostet eine erhebliche Menge an Leistung und sagt, wir haben nur Jobs, um die ungültigen Referenzen ab und zu zu bereinigen.

Offensichtlich funktioniert dies in der Praxis nicht, und die Datenbank ist mit ungültigen Referenzen überschwemmt.

Kennt jemand einen Vergleich, Benchmark oder Ähnliches, der beweist, dass die Verwendung von Fremdschlüsseln keinen wesentlichen Leistungseinbruch verursacht? (Was ich hoffe, ihn überzeugen)

+3

Nur ein Update auf die ganze Geschichte: Wir durften jetzt Fremdschlüssel verwenden, mit der Vorstellung, dass sie möglicherweise deaktiviert werden, wenn sie zu einem Leistungsverlust führen. Also vielen Dank für Ihre guten Punkte :-) – Steffen

Antwort

29

Es gibt einen kleinen Leistungseinbruch bei Einfügungen, Aktualisierungen und Löschungen, da der FK überprüft werden muss. Für einen einzelnen Datensatz wäre dies normalerweise so gering, dass es nicht wahrnehmbar ist, es sei denn, Sie beginnen mit einer lächerlichen Anzahl von FKs, die mit der Tabelle verbunden sind (Es dauert natürlich länger, 100 andere Tabellen als 2 zu überprüfen). Dies ist eine gute Sache, keine schlechte Sache, da Datenbanken ohne Integrität nicht vertrauenswürdig und somit nutzlos sind. Sie sollten Integrität nicht für Geschwindigkeit handeln. Dieser Leistungseinbruch wird normalerweise durch die bessere Möglichkeit zur Optimierung der Ausführungspläne ausgeglichen.

Wir haben eine mittelgroße Datenbank mit etwa 9 Millionen Datensätzen und FKs überall und sollten selten einen Leistungseinbruch feststellen (außer auf einer schlecht entworfenen Tabelle mit weit über 100 Fremdschlüsseln ist das Löschen von Datensätzen etwas langsam) von diesem als alles muss überprüft werden). Fast jeder dba, der mit großen Datenbanken im Terabyte-Format zu tun hat, und der echte Bedarf an hoher Leistung bei großen Datenbeständen besteht auf Fremdschlüsseln, weil Integrität der Schlüssel zu jeder Datenbank ist. Wenn sich die Leute mit Terabyte-großen Datenbanken den sehr kleinen Performance-Hit leisten können, dann können Sie das auch.

FKs werden nicht automatisch indiziert und wenn sie nicht indiziert sind, kann dies zu Leistungsproblemen führen.

Ehrlich gesagt, würde ich eine Kopie Ihrer Datenbank nehmen, richtig indizierte FKs hinzufügen und den Zeitunterschied zum Einfügen, Löschen, Aktualisieren und Auswählen aus diesen Tabellen im Vergleich mit dem gleichen aus Ihrer Datenbank ohne die FKs zeigen. Zeigen Sie, dass Sie keinen Leistungseinbruch verursachen werden. Zeigen Sie dann die Ergebnisse von Abfragen, die verwaiste Datensätze anzeigen, die keine Bedeutung mehr haben, da die PK, auf die sie bezogen sind, nicht mehr existiert. Es ist besonders effektiv, dies für Tabellen zu zeigen, die Finanzinformationen enthalten ("Wir haben 2700 Bestellungen, die wir nicht mit einem Kunden verbinden können" wird die Geschäftsleitung aufhorchen lassen).

+6

Sehr nützliche Informationen. Ich füge derzeit eine Kopie der Datenbank Fremdschlüssel hinzu, es dauert jedoch einige Zeit, da ich zuerst 20-30 Millionen ungültige Zeilen löschen muss. Dies beweist nur, wie groß das Problem war, dass die Schlüssel fehlten. – Steffen

+0

"Sie sollten Integrität nicht gegen Geschwindigkeit handeln" - und doch ist dies das, was die meisten NoSql-Datenbanken tun ... In einigen Fällen könnte sich der Kompromiss lohnen, aber man sollte den tatsächlichen Effekt ernsthaft messen, bevor dieser Aufruf erfolgt. – noocyte

+0

@noocyte und deshalb NoSql-Datenbanken sind in der Regel nicht geeignet für jede ernsthafte Geschäftsanwendung, insbesondere in regulierten Branchen wie Finanzen und Gesundheitswesen. – HLGEM

16

Von Microsoft Patterns and Practices: Chapter 14 Improving SQL Server Performance:

Wenn Primär- und Fremdschlüssel werden definiert als Einschränkungen in der Datenbank Schema, kann der Server verwendet, dass Informationen optimal Ausführungspläne erstellen .

+2

sicher, kann es diese Indizes verwenden, um zu optimieren ... aber das bedeutet nicht automatisch, dass es keine negativen Auswirkungen auf die Leistung hat. Ich denke, es sind zu viele Faktoren beteiligt, um diese Frage mit dieser Referenz in den Schlaf zu bringen. –

+0

@Roland: Ich verstehe Ihren Standpunkt, und ich stimme Ihnen zu. Meine Absicht war jedoch, die Frage "Ich versuche mein Bestes, um meinen Chef zu überzeugen" anzusprechen. –

+1

@Roland: Darüber hinaus ist der Leistungseinbruch sehr selten schwerwiegend. Wie Sie in Ihrer Antwort gesagt haben, ist dies ohne Kenntnis der Anwendung schwer zu behaupten, aber in der Praxis werden die Vorteile von Fremdschlüsseln selten für die Leistung getauscht. Zugehöriger SO-Beitrag: http: // stackoverflow.com/questions/1744878/can-foreign-keys-hurt-query-performance/ –

3

Es ist in Ordnung, über die Leistung besorgt zu sein, paranoide Entscheidungen aber nicht zu treffen.

Sie können einfach Benchmark-Code schreiben, um die Ergebnisse selbst anzuzeigen, aber zuerst müssen Sie herausfinden, um welche Leistung Ihr Chef besorgt ist, und genau diese Metriken genau angeben.

Sofern die ungültigen Referenzen betroffen sind, erhalten Sie keine ungültigen Referenzen, wenn Sie Nullen auf Ihren Fremdschlüsseln nicht zulassen. Die Datenbank wird ausgeführt, wenn Sie versuchen, einen ungültigen Fremdschlüssel zuzuweisen, der nicht existiert. Wenn Sie "Nullen" benötigen, weisen Sie einen Schlüssel als "UNDEFINIERT" oder Ähnliches zu und machen Sie diesen zum Standardschlüssel.

Endlich, erklären Sie Ihre Datenbank Normalisierung Probleme zu Ihrem Chef, weil ich denke, Sie werden schnell feststellen, dass dieses Problem wird mehr ein Problem als ausländische Schlüssel Leistung wird.

+0

Ich bin ziemlich sicher, dass es keine genaue Leistungsmetrik ist, über die er sich Sorgen macht, da er nur sagt "es tut weh", und das ist es ziemlich genau. Offensichtlich macht es das nicht einfacher, das Gegenteil zu beweisen :-( – Steffen

+1

Wenn jemand "Nullen" braucht, kann er NULL-fähige Spalten haben, es wird keine Probleme mit FKs verursachen. Ich finde die Technik des Hinzufügens von "benutzerdefinierten" "Nullzeilen" in Primärtabellen, um keine NULL-fähige Spalte in der Fremdtabelle hinzuzufügen, ist schlimmer als gar keine FKs zu verwenden –

+0

Wenn Sie keine FKs haben, dann verhindert das Nicht-Zulassen von Nullwerten in der FK-Spalte nichts daran, dass Sie ein Ungültig 1. Und es nicht Mann, dass der Datensatz nicht verwaist, wenn der ursprüngliche PK-Eintrag gelöscht oder geändert wird. – HLGEM

4

Kennt jemand ein Vergleich, Benchmark oder ähnliches, die mit Fremdschlüssel gibt es keine nennenswerten Performance-Einbußen beweist? (Was ich hoffe, wird ihn überzeugen)

Ich denke, du gehst dies in die falsche Richtung. Benchmarks überzeugen niemanden.

Was Sie tun sollten, ist zuerst die Probleme aufzudecken, die daraus resultieren, dass Fremdschlüsseleinschränkungen nicht verwendet werden. Versuchen Sie zu quantifizieren, wie viel Arbeit es kostet, ungültige Referenzen zu entfernen. Probieren Sie außerdem aus, wie viele Fehler aufgrund dieser Fehler zum Geschäftsprozess führen. Wenn Sie einen Dollar-Betrag anhängen können - noch besser.

Jetzt für einen Benchmark - Sie sollten versuchen, Einblick in Ihre Arbeitsbelastung, identifizieren, welche Art von Operationen am häufigsten durchgeführt werden. Richten Sie dann eine Testumgebung ein und wiederholen Sie diese Vorgänge mit vorhandenen Fremdschlüsseln. Dann vergleiche.

Persönlich würde ich nicht sofort behaupten, ohne Kenntnis der Anwendungen, die auf der Datenbank ausgeführt werden, dass Fremdschlüssel keine Leistung kosten. Insbesondere wenn Sie überlappende Löschungen und/oder Aktualisierungen in Kombination mit zusammengesetzten natürlichen Primärschlüsseln haben, hätte ich persönlich einige Angst vor Leistungsproblemen, insbesondere zeitgesteuerte oder festgefahrene Transaktionen aufgrund von Nebeneffekten von Kaskadierungsoperationen.

Aber niemand kann Ihnen sagen, Sie müssen sich selbst testen, mit Ihren Daten, Ihrer Arbeitslast, Ihrer Anzahl gleichzeitiger Benutzer, Ihrer Hardware, Ihren Anwendungen.

+0

Guter Punkt über die Anwendung, aber die Tabellen sind wirklich einfach - alle Primärschlüssel sind Identitäts-Ints, und wir haben keine Kaskadierung delete/updates Also im Grunde ist es so einfach wie es geht :-D – Steffen

+0

Steffen, das ist nützliche Info.Ich hätte wahrscheinlich keine Reservierungen, es sei denn, es geht um massive Schreiblasten. –

+0

Ich glaube, wir machen viel mehr lesen als schreiben, also sollte dies auch kein großes Problem sein. Danke für den Kommentar :-) – Steffen

1

Ein wichtiger Faktor in der Kosten wäre die Größe des Index die Fremdschlüsselreferenzen - wenn es klein und häufig verwendet wird, wird die Leistung vernachlässigbar sein, große und weniger häufig verwendete Indizes werden mehr Einfluss haben, aber wenn Ihr Fremdschlüssel ist gegen einen Clustered Index, es sollte immer noch kein großer Erfolg sein, aber @ Ronald Bouman hat Recht - Sie müssen testen, um sicher zu sein.

6

Dies ist eher ein politisches als ein technisches Problem. Wenn Ihr Projektmanagement keinen Wert für die Integrität Ihrer Daten erkennt, müssen Sie sich in einem anderen Projekt befinden.

Wenn Ihr Chef nicht bereits weiß oder interessiert, dass Sie Tausende von ungültigen Referenzen haben, wird er sich nicht kümmern, nur weil Sie ihm davon erzählen. Ich sympathisiere mit den anderen Plakaten hier, die versuchen, Sie zu drängen, das "Richtige" zu tun, indem Sie den guten Kampf kämpfen, aber ich habe es schon oft ausprobiert und in der Praxis funktioniert es nicht. Die Geschichte von David und Goliath macht gute Lektüre, aber im wirklichen Leben ist es eine verlierende Angelegenheit.

+1

Ich stimme @Dave hier zu, aber ich ermutige Sie, den guten Kampf trotzdem zu kämpfen. Es ist bedauerlich, dass das Management manchmal Angst vor Dingen hat, die sie (klar, obwohl wir es leise sagen) nicht verstehen. Dies kostet die Unternehmen nicht nur in Dollar für die Zeit, die für die Behebung von Problemen aufgewendet wird, die nicht an erster Stelle stehen müssen, sondern entmutigt Kreativität und dynamische Lösungen von den Menschen, die für die Entwicklung dieser Lösungen am besten gerüstet sind. Ich behalte die "Niemals sag sterben" Haltung, bis ein solider Beweis gegeben oder widerlegt wird ... sehr zur Irritation meiner Vorgesetzten ... –

Verwandte Themen