Beschleunigung einer SQL-Abfrage mit Indizes

8

Ich habe eine Tabelle namens Products .

Diese Tabelle enthält mehr als 3 Millionen Einträge. Jeden Tag gibt es etwa 5000 neue Einträge. was nur während der Nacht in 2 Minuten passiert.

Aber diese Tabelle wird jeden Abend vielleicht über 20 000 mal mit dieser Abfrage abgefragt.

%Vor%

Tabellenstruktur:

%Vor%

Ich kann sehen, dass diese Abfrage ungefähr eine Sekunde dauert, um ein Ergebnis von Products table zurückzugeben.

Es gibt keine Spalte productId in der Tabelle, da sie nicht benötigt wird. Also gibt es keinen Primärschlüssel in der Tabelle.

Ich möchte diese Abfrage irgendwie verbessern, um das Ergebnis schneller zurückzugeben.

Ich habe noch nie zuvor Indizes verwendet. Was wäre der beste Weg, Indizes für diese Tabelle zu verwenden?

Wenn ich einen Primärschlüssel zur Verfügung stelle, würde er das Abfrageergebnis beschleunigen? Denken Sie daran, dass ich die Tabelle noch abfragen muss, indem ich 3 Parameter als

zur Verfügung stelle %Vor%

Dies ist obligatorisch.

Wie ich bereits erwähnt habe, bekommt der Tisch jeden Tag in der Nacht neue Einträge in 2 Minuten. Wie würde dies die Indizes beeinflussen?

Wenn ich Indizes verwende, welche Spalte würde ich am besten verwenden und ob ich gruppierte oder nicht gruppierte Indizes verwenden soll?

    
akd 15.06.2015, 23:37
quelle

1 Antwort

9

Die beste Aufgabe hängt davon ab, welche anderen Felder die Tabelle hat und welche anderen Abfragen für diese Tabelle ausgeführt werden.

Ohne weitere Details verbessert ein nicht gruppierter Index für (code, company, createddate), der die Spalte "price" enthält, die Leistung.

%Vor%

Das liegt daran, dass SQL, wenn Sie diesen Index an Ort und Stelle haben, nicht auf die tatsächliche Tabelle zugreifen wird, wenn er die Abfrage ausführt, da er alle Zeilen mit einem gegebenen "code, company, createddate" im Index finden kann in der Lage sein, dies wirklich schnell zu tun, da der Index genau einen schnellen Zugriff ermöglicht, wenn die Felder verwendet werden, die den Schlüssel definieren, und er wird auch den "Preis" -Wert für jede Zeile haben.

In Bezug auf die Einfügungen muss SQL Server sie für jede hinzugefügte Zeile ebenfalls zum Index hinzufügen, so dass die Leistung für die Einfügungen beeinträchtigt wird. Ich denke, Sie sollten erwarten, dass die Gewinne bei der SELECT-Leistung die Auswirkungen auf die Einsätze überwiegen, aber Sie sollten das testen.

Außerdem werden Sie mehr Speicherplatz verwenden, da der Index alle Felder für jede Zeile neben dem von der ursprünglichen Tabelle belegten Speicherplatz speichert.

Wie andere in den Kommentaren angemerkt haben, ist das Hinzufügen eines PK zu Ihrer Tabelle (auch wenn das Hinzufügen einer ProductId-Spalte, die Sie eigentlich nicht brauchen ), eine gute Idee.

    
eugenioy 16.06.2015, 00:00
quelle