Angenommen, ich habe 2 Tabellen, Produkte und Produktkategorien. Beide Tabellen haben eine Beziehung zu CategoryId. Und das ist die Frage.
SELECT p.ProductId, p.Name, c.CategoryId, c.Name AS Category
FROM Products p
INNER JOIN ProductCategories c ON p.CategoryId = c.CategoryId
WHERE c.CategoryId = 1;
Wenn ich einen Ausführungsplan erstelle, führt die Tabelle ProductCategories die erwartete Clusterindexsuche durch. Bei Tabellenprodukten wird jedoch ein Cluster-Index-Scan durchgeführt, was mich zweifeln lässt. Warum hilft FK nicht, die Abfrageleistung zu verbessern?
Also muss ich einen Index für Products.CategoryId erstellen. Wenn ich den Ausführungsplan erneut erstelle, führen beide Tabellen eine Indexsuche durch. Die geschätzten Teilbaumkosten werden erheblich reduziert.
Meine Fragen sind:
Hat FK neben den Hilfen bei Beziehungsbeschränkungen noch andere Vorteile? Verbessert es die Abfrageleistung?
Sollte ich einen Index für alle FK-Spalten (beliebte Products.CategoryId) in allen Tabellen erstellen?
quelle
Fremdschlüssel können die Leistung verbessern (und beeinträchtigen)
Wie hier angegeben: Fremdschlüssel steigern die Leistung
Sie sollten immer Indizes für FK-Spalten erstellen, um Suchvorgänge zu reduzieren. SQL Server führt dies nicht automatisch aus.
Bearbeiten
Da der Link nun tot zu sein scheint (ein großes Lob an Chris, dass er es bemerkt hat) , zeigt das Folgende, warum Fremdschlüssel die Leistung verbessern (und beeinträchtigen) können.
Kann Fremdschlüssel die Leistung verbessern?
quelle
Ein Fremdschlüssel ist ein DBMS-Konzept zur Gewährleistung der Datenbankintegrität.
Alle Auswirkungen / Verbesserungen auf die Leistung sind spezifisch für die verwendete Datenbanktechnologie und dem Zweck eines Fremdschlüssels untergeordnet.
In SQL Server wird empfohlen, sicherzustellen, dass alle Fremdschlüssel mindestens einen nicht gruppierten Index haben.
Ich hoffe, dies klärt die Dinge für Sie auf, aber bitte fordern Sie weitere Details an.
quelle
Ihre beste Leistung besteht darin, Indizes für Felder zu verwenden, die Sie häufig verwenden. Wenn Sie SQL Server verwenden, können Sie den Profiler verwenden, um eine bestimmte Datenbank zu profilieren, die ausgegebene Datei zu übernehmen und mithilfe des Optimierungsassistenten Empfehlungen zum Platzieren Ihrer Indizes zu erhalten. Ich benutze auch gerne den Profiler, um lang laufende gespeicherte Prozeduren auszuspülen. Ich habe eine Liste der zehn schlimmsten Straftäter, die ich jede Woche veröffentliche, und halte die Leute ehrlich: D.
quelle
Sie können es verwenden, um eine Abfrage effizienter zu gestalten. Sie können Abfragen in SQL Server so umstrukturieren, dass anstelle eines inneren Joins ein äußerer Join verwendet wird, sodass SQL Server nicht mehr überprüft werden müssen, ob die Spalte eine Null enthält. Sie müssen dieses Qualifikationsmerkmal nicht eingeben, da die Fremdschlüsselbeziehung dies bereits für Sie erzwingt.
Also das:
Wird dies:
Dies führt bei kleinen Abfragen nicht unbedingt zu einer großen Leistung, aber wenn Tabellen groß werden, kann dies effizienter sein.
quelle
Für MySQL 5.7 kann es Abfragen mit mehreren Joins auf jeden Fall erstaunlich gut beschleunigen!
Ich habe 'EXPLAIN' verwendet, um meine Abfrage zu verstehen, und festgestellt, dass ich 4-5 Tabellen verknüpft habe - wobei überhaupt keine Schlüssel verwendet wurden. Ich habe diesen Tabellen nur einen Fremdschlüssel hinzugefügt, und das Ergebnis war eine Reduzierung der Ladezeit um 90%. Abfragen, die> 5 Sekunden dauerten, dauern jetzt 500 ms oder weniger.
Das ist eine enorme Verbesserung!
UND, wie andere bereits erwähnt haben, erhalten Sie den zusätzlichen Bonus, die relationale Integrität sicherzustellen.
Darüber hinaus hat die Gewährleistung der referenziellen Integrität auch eigene Leistungsvorteile. Dies hat den Effekt zweiter Ordnung, dass sichergestellt wird, dass die Tabellen mit dem Fremdschlüssel mit der Fremdtabelle auf dem neuesten Stand sind. Angenommen, Sie haben eine Benutzertabelle und eine Kommentartabelle und führen Statistiken zur Kommentartabelle durch. Wenn Sie den Benutzer schwer löschen, möchten Sie wahrscheinlich auch seine Kommentare nicht mehr.
quelle
Das Hinzufügen eines Fremdschlüssels zur Tabelle verbessert die Leistung nicht. Wenn Sie lediglich einen Datensatz in eine ProductCategories-Tabellendatenbank einfügen, wird versucht, die Fremdschlüsselspalte mit einem Wert zu ermitteln, der im Primärschlüsselwert einer Produkttabelle vorhanden ist. Jedes Mal, wenn Sie einen neuen Eintrag in der ProductCategories-Tabelle hinzufügen, ist der Betrieb Ihrer Datenbank mit einem Overhead verbunden. Wenn Sie also einen Fremdschlüssel hinzufügen, wird Ihre Datenbankleistung nicht verbessert, aber die Integrität Ihrer Datenbank wird berücksichtigt. Ja, es verbessert die Leistung Ihrer Datenbank, wenn Sie die Integrität mithilfe eines Fremdschlüssels überprüfen, anstatt viele Abfragen auszuführen, um zu überprüfen, ob der Datensatz in der Datenbank Ihres Programms vorhanden ist.
quelle
Ich weiß nicht viel über SQL Server, aber im Fall von Oracle verringert eine Fremdschlüsselspalte die Leistung beim Laden von Daten. Dies liegt daran, dass die Datenbank die Datenintegrität für jede Einfügung überprüfen muss. Und ja, wie bereits erwähnt, ist es eine gute Praxis, einen Index für die Fremdschlüsselspalte zu haben.
quelle
Ab SQL Server 2008 können Fremdschlüssel die Leistung beeinflussen, indem sie die Art und Weise beeinflussen, wie das Datenbankmodul die Abfrage optimiert. Weitere Informationen finden Sie unter Star Join Heuristics im folgenden Artikel: https://technet.microsoft.com/en-us/library/2008.04.dwperformance.aspx
quelle