it-swarm.com.de

Verbessert der Fremdschlüssel die Abfrageleistung?

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;

Beim Erstellen eines Ausführungsplans führt die Tabelle ProductCategories eine Clusterindexsuche durch. Dies ist wie erwartet. Bei Tabellenprodukten führt es jedoch einen Cluster-Index-Scan durch, der mich zweifeln lässt. Warum hilft FK nicht, die Abfrageleistung zu verbessern?

Also muss ich einen Index für Products.CategoryId erstellen. Beim erneuten Erstellen eines Ausführungsplans führen beide Tabellen eine Indexsuche durch. Und die geschätzten Teilbaumkosten werden erheblich reduziert.

Meine Fragen sind:

  1. Hat FK neben der Beziehung zu Beziehungsproblemen auch einen anderen Nutzen? Verbessert es die Abfrageleistung?

  2. Soll ich einen Index für alle FK-Spalten (wie "Products.CategoryId") in allen Tabellen erstellen?

Fremdschlüssel sind ein referenzielles Integritätswerkzeug, kein Leistungswerkzeug. Zumindest in SQL Server erstellt das Erstellen eines FK keinen verknüpften Index. Sie sollten Indizes für alle FK-Felder erstellen, um die Suchzeiten zu verbessern. 

172
cmsjr

Fremdschlüssel können die Leistung verbessern (und verletzen)

  1. Wie hier angegeben: Fremdschlüssel steigern die Leistung

  2. Sie sollten immer Indizes für FK-Spalten erstellen, um die Suche zu reduzieren. SQL Server führt dies nicht automatisch aus.

Bearbeiten

Da der Link jetzt als tot erscheint (kudos an Chris für das Erkennen), zeigt das folgende Gist, warum Fremdschlüssel die Leistung verbessern (und verletzen) können.

Kann ein Fremdschlüssel die Leistung verbessern

Fremdschlüsseleinschränkung verbessert die Leistung zum Zeitpunkt des Lesens Daten, aber gleichzeitig verlangsamt es die Leistung zum Zeitpunkt von Daten einfügen/ändern/löschen.

Beim Lesen der Abfrage kann der Optimierer Fremdschlüsseleinschränkungen für .__ verwenden. Erstellen Sie effizientere Abfragepläne als Fremdschlüssel Einschränkungen sind vordefinierte Regeln. Dies beinhaltet normalerweise das Überspringen von einen Teil des Abfrageplans, da beispielsweise der Optimierer .__ sehen kann. dass aufgrund einer Fremdschlüsseleinschränkung die Ausführung von .__ nicht erforderlich ist. dieser bestimmte Teil des Plans.

51

Ein Fremdschlüssel ist ein DBMS-Konzept zur Sicherstellung der Datenbankintegrität. 

Jegliche Auswirkungen auf die Leistung/Verbesserungen sind spezifisch für die verwendete Datenbanktechnologie und sind dem Zweck eines Fremdschlüssels untergeordnet.

In SQL Server wird empfohlen, sicherzustellen, dass alle Fremdschlüssel mindestens einen nicht gruppierten Index enthalten.

Ich hoffe, das klärt die Dinge für Sie, aber fordern Sie bitte weitere Einzelheiten an.

13
John Sansom

Ihre beste Performance-Wette ist die Verwendung von Indizes für häufig verwendete Felder. Wenn Sie SQL Server verwenden, können Sie den Profiler verwenden, um eine bestimmte Datenbank zu profilieren, die ausgegebene Datei zu übernehmen und den Optimierungsassistenten zu verwenden, um 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 schlechtesten Straftäter, die ich jede Woche veröffentliche. 

4
Al Katawazi

Sie können damit eine Abfrage effizienter gestalten. Sie können Abfragen in SQL Server so umstrukturieren, dass ein Outer-Join anstelle eines inneren Joins verwendet wird, wodurch SQL-Server entfernt werden müssen, um zu überprüfen, 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:

    select p.ProductId, p.Name, c.CategoryId, c.Name AS Category 
from Products p inner join ProductCategories c on p.CategoryId = c.CategoryIdwhere c.CategoryId = 1;

Wird dies:

SELECT p.ProductId, p.Name, c.CategoryId, c.Name AS Category 
FROM ProductCategories c 
LEFT OUTER JOIN Products P ON
c.CategoryId = p.CategoryId 
WHERE c.CategoryId = 1;

Dies führt nicht unbedingt zu einer großen Leistung in kleinen Abfragen, aber wenn Tabellen groß werden, können sie effizienter sein. 

3
kemiller2002

Ich weiß nicht viel über den SQL-Server, aber im Falle von Oracle reduziert eine Fremdschlüsselspalte die Performance des Datenladens. Dies liegt daran, dass die Datenbank die Datenintegrität für jede Einfügung überprüfen muss. Und ja, wie bereits erwähnt, ist ein Index der Fremdschlüsselspalte eine gute Praxis.

1
Shamik

Durch das Hinzufügen eines Fremdschlüssels in einer Tabelle wird die Leistung nicht verbessert. Es wird lediglich gesagt, wenn Sie einen Datensatz in eine ProductCategories-Tabellendatenbank einfügen, wird versucht, die Fremdschlüsselspalte mit einem Wert zu versehen, der im Primärschlüsselwert einer Produkttabelle vorhanden ist. Der Vorgang kostet Ihre Datenbank jedes Mal, wenn Sie einen neuen Eintrag in der ProductCategories-Tabelle hinzufügen. Durch das Hinzufügen eines Fremdschlüssels wird die Datenbankleistung jedoch nicht verbessert, es wird jedoch für die Integrität Ihrer Datenbank gesorgt Verbessern Sie die Leistung Ihrer Datenbank, wenn Sie die Integrität mithilfe eines Fremdschlüssels prüfen, anstatt viele Abfragen auszuführen, um zu überprüfen, ob der Datensatz in der Datenbank in Ihrem Programm vorhanden ist.

1
Pankaj Khairnar

Bei MySQL 5.7 können Abfragen mit mehreren Joins auf jeden Fall erstaunlich gut beschleunigt werden!

Ich verwendete "explain", um meine Anfrage zu verstehen, und stellte fest, dass ich an 4-5 Tabellen zusammenarbeitete - wo überhaupt keine Schlüssel verwendet wurden. Ich habe nur einen Fremdschlüssel zu diesen Tabellen hinzugefügt und das Ergebnis war eine um 90% verkürzte Ladezeit. 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 Vorteil, die Integrität der Beziehungen zu gewährleisten. 

Darüber hinaus hat die Sicherstellung der referentiellen Integrität auch eigene Leistungsvorteile. Die zweite Ordnung bewirkt, dass die Tabellen, die den Fremdschlüssel enthalten, mit der Fremdtabelle auf dem neuesten Stand sind. Angenommen, Sie haben eine Benutzertabelle und eine Kommentartabelle, und Sie führen Statistiken für die Kommentartabelle aus. Wahrscheinlich, wenn Sie den Benutzer hart löschen, möchten Sie auch nicht mehr deren Kommentare. 

1
Peter Bartlett

Ab SQL Server 2008 können Fremdschlüssel die Leistung beeinflussen, indem sie die Art und Weise beeinflussen, wie das Datenbankmodul die Abfrage optimiert. Siehe Star Join Heuristik im folgenden Artikel: https://technet.Microsoft.com/en-us/library/2008.04.dwperformance.aspx

0
LucasF