Wie optimieren Sie Tabellen für bestimmte Abfragen?

8
  1. Welche Muster verwenden Sie, um die häufigen Abfragen zu ermitteln?
  2. Wie wählen Sie die Optimierungsfaktoren aus?
  3. Was sind die Arten von Änderungen, die man machen kann?
akiva 26.09.2008, 01:13
quelle

9 Antworten

12

Das ist eine nette Frage, wenn auch ziemlich weit gefasst (und nicht schlechter dafür).
Wenn ich Sie verstehe, dann fragen Sie, wie Sie das Optimierungsproblem von vorne angehen können.

Die erste Frage ist: " Gibt es ein Leistungsproblem? "
Wenn es kein Problem gibt, dann bist du fertig. Dies ist oft der Fall. Nett.

Auf der anderen Seite ...

Häufige Abfragen ermitteln

Mit

Logging erhalten Sie häufig gestellte Fragen.
Wenn Sie eine Datenzugriffsebene verwenden, ist es möglicherweise einfach, Code zum Protokollieren aller Abfragen hinzuzufügen.
Es ist auch eine gute Idee, zu protokollieren, wann die Abfrage ausgeführt wurde und wie lange jede Abfrage dauert. Dies kann Ihnen eine Vorstellung davon geben, wo die Probleme liegen.
Außerdem fragen die Benutzer welche Bits sie stören. Wenn eine langsame Antwort den Benutzer nicht verärgert, ist das egal.

Wählen Sie die Optimierungsfaktoren?

(Ich mag diesen Teil der Frage vielleicht falsch verstehen) Sie suchen nach Mustern in den Abfragen / Antwortzeiten.
Dies sind typischerweise Abfragen über große Tabellen oder Abfragen, die viele Tabellen in einer einzigen Abfrage verbinden. ... aber wenn Sie Antwortzeiten protokollieren, können Sie sich davon leiten lassen.

Arten von Änderungen, die man vornehmen kann?

Sie fragen speziell nach der Optimierung von Tabellen.
Hier sind einige der Dinge, nach denen Sie suchen können:

  • Denormalisierung . Dadurch werden mehrere Tabellen in einer größeren Tabelle zusammengefasst. Anstatt mehrere Tabellen miteinander zu verknüpfen, können Sie also nur eine Tabelle lesen. Dies ist eine sehr häufige und leistungsfähige Technik. NB. Ich rate dazu, die ursprünglichen normalisierten Tabellen beizubehalten und den denormalisierten Tisch zusätzlich zu bauen - auf diese Weise werfen Sie nichts weg. Wie Sie es auf dem neuesten Stand halten, ist eine andere Frage. Sie können Auslöser für die zugrunde liegenden Tabellen verwenden oder regelmäßig einen Aktualisierungsvorgang ausführen.
  • Normalisierung Dies wird nicht oft als Optimierungsprozess angesehen, aber in zwei Fällen:
    • Aktualisierungen. Die Normalisierung macht Aktualisierungen viel schneller, weil jede Aktualisierung die kleinste ist, die es sein kann (Sie aktualisieren die kleinste - in Bezug auf Spalten und Zeilen - mögliche Tabelle. Dies ist fast genau die Definition der Normalisierung.
    • Das Abfragen einer denormalisierten Tabelle, um Informationen zu erhalten, die in einer viel kleineren Tabelle (weniger Zeilen) vorhanden sind, kann ein Problem verursachen. Speichern Sie in diesem Fall sowohl die normalisierte als auch die denormalisierte Tabelle (siehe oben).
  • Horizontale Partitionierung Das bedeutet, Tabellen werden kleiner, indem einige Zeilen in eine andere identische Tabelle eingefügt werden. Ein häufiger Anwendungsfall ist, alle Zeilen dieses Monats in der Tabelle ThisMonthSales und alle älteren Zeilen in der Tabelle OldSales zu haben, in der beide Tabellen ein identisches Schema haben. Wenn es sich bei den meisten Abfragen um aktuelle Daten handelt, kann diese Strategie bedeuten, dass 99% aller Abfragen nur 1% der Daten anzeigen - ein enormer Leistungsgewinn.
  • Vertikale Partitionierung Dies ist das Hacken von Feldern von einer Tabelle und das Einfügen von Feldern in eine neue Tabelle, die durch den Primärschlüssel mit der Haupttabelle verbunden wird. Dies kann für sehr breite Tabellen nützlich sein (z. B. mit Dutzenden von Feldern) und möglicherweise hilfreich sein, wenn Tabellen nur wenig gefüllt sind.
  • Indeces . Ich bin nicht sicher, ob Ihre Frage diese abdeckt, aber es gibt viele andere Antworten auf SO bezüglich der Verwendung von Indizien. Eine gute Möglichkeit, einen Fall für einen Index zu finden, ist: eine langsame Abfrage finden. Sehen Sie sich den Abfrageplan an und suchen Sie nach einem Tabellenscan. Indexfelder in dieser Tabelle, um den Tabellenscan zu entfernen. Ich kann bei Bedarf mehr dazu schreiben - hinterlasse einen Kommentar.

Vielleicht möchten Sie auch meinen Beitrag dazu .

    
AJ. 26.09.2008, 11:48
quelle
1

Das ist schwer zu beantworten, ohne zu wissen, von welchem ​​System Sie sprechen.

In Oracle beispielsweise können Sie mit dem Enterprise Manager sehen, welche Abfragen die meiste Zeit in Anspruch genommen haben, können verschiedene Ausführungsprofile vergleichen und Abfragen über einen bestimmten Zeitraum hinweg analysieren, sodass Sie keinen Index hinzufügen gehen zu einer Abfrage auf Kosten von jedem anderen, den Sie ausführen.

    
SarekOfVulcan 26.09.2008 01:17
quelle
1

Ihre Frage ist ein bisschen vage. Welche DB-Plattform?

Wenn wir über SQL Server sprechen:

  1. Verwenden Sie die Dynamic Management-Ansichten. Verwenden Sie SQL Profiler. Installieren Sie den SP2 und die Performance-Dashboard-Berichte.
  2. Nachdem Sie die kostenintensivsten Abfragen ermittelt haben (z. B. wie oft x eine Abfrage ausgeführt wurde), untersuchen Sie deren Ausführungspläne und schauen Sie sich die Größen der beteiligten Tabellen an und ob sie überwiegend Read oder Write oder eine Mischung aus sind beides.
  3. Wenn das System unter Ihrer vollen Kontrolle steht (Apps. und DB), können Sie oft schlecht formatierte Abfragen neu schreiben (ein häufiges Vorkommnis), wie z. B. tief korrelierte Sub-Abfragen, die oft neu geschrieben werden können abgeleitete Tabelle verbindet sich mit ein wenig Nachdenken. Andernfalls haben Sie die Möglichkeit, nicht geclusterte Indizes abzudecken und sicherzustellen, dass die Statistiken auf dem neuesten Stand sind.
Mitch Wheat 26.09.2008 01:16
quelle
0
  1. Für MySQL gibt es eine Funktion namens langsame Abfragen protokollieren

Der Rest hängt davon ab, welche Art von Daten Sie haben und wie sie eingerichtet ist.

    
Ólafur Waage 26.09.2008 01:20
quelle
0

Im SQL-Server können Sie die Ablaufverfolgung verwenden, um herauszufinden, wie Ihre Abfrage funktioniert. Verwenden Sie Strg + k oder l

Wenn Sie zum Beispiel einen vollständigen Tabellenscan in einer Tabelle mit einer großen Anzahl von Datensätzen sehen, ist dies wahrscheinlich keine gute Abfrage.

Eine spezifischere Frage wird Ihnen definitiv bessere Antworten bringen.

    
user21968 26.09.2008 01:48
quelle
0

Wenn Ihre Tabelle überwiegend gelesen wird, platzieren Sie einen gruppierten Index auf die Tabelle.

    
FlySwat 26.09.2008 01:50
quelle
0

Meine Erfahrung ist in der Anfangszeit hauptsächlich mit DB2 und einer kleinen Anzahl von Oracle.

Wenn Ihr DBMS gut ist, kann es Statistiken zu bestimmten Abfragen sammeln und den Plan erklären, der zum Extrahieren der Daten verwendet wurde.

Wenn Sie beispielsweise eine Tabelle (x) mit zwei Spalten (date und diskusage) haben und nur einen Index für das Datum haben, lautet die Abfrage:

%Vor%

ist sehr effizient, da es den Index verwenden kann. Auf der anderen Seite die Abfrage

%Vor%

wäre nicht so effizient. Im ersten Fall würde der "Erklärungs-Plan" Ihnen sagen, dass er den Index verwenden könnte. Im letzteren Fall hätte es gesagt, dass es einen Tabellenscan machen müsste, um die Zeilen zu bekommen (das sieht im Grunde jede Zeile, um zu sehen, ob sie übereinstimmt).

Wirklich intelligentes DBMS kann auch erklären, was Sie tun sollten, um die Leistung zu verbessern (fügen Sie in diesem Fall einen Index für die Diskus-Datei hinzu).

Um zu sehen, welche Abfragen ausgeführt werden, können Sie diese entweder aus dem DBMS sammeln (wenn dies zulässig ist) oder alle dazu zwingen, ihre Abfragen über gespeicherte Prozeduren auszuführen, damit der Datenbankadministrator die Abfragen steuern kann Job, halten Sie die DB effizient.

    
paxdiablo 26.09.2008 01:53
quelle
0

Indizes auf PKs und FKs und eine Sache, die immer PARTITIONING hilft ...

    
tropikalista 26.09.2008 11:57
quelle
0

1. Mit welchen Mustern ermitteln Sie die häufigen Abfragen?

Hängt davon ab, auf welcher Ebene Sie mit der Datenbank arbeiten. Wenn Sie ein DBA sind oder Zugriff auf die Tools haben, können Sie mit db's wie Oracle Jobs ausführen und Statistiken / Berichte über einen bestimmten Zeitraum generieren. Wenn Sie als Entwickler eine Anwendung für eine Datenbank schreiben, können Sie einfach eine Leistungsprofilerstellung in Ihrer App durchführen.

2. Wie wählen Sie die Optimierungsfaktoren aus?

Ich versuche, ein allgemeines Gefühl dafür zu bekommen, wie die Tabelle verwendet wird und welche Daten sie enthält. Ich gehe mit den folgenden Fragen vor.

Wird es eine Tonne upgedatet und auf welchen Feldern werden Updates durchgeführt? Hat es Spalten mit geringer Kardinalität?

Lohnt es sich zu indexieren? (sehr kleine Tabellen können bei Zugriff durch einen Index verlangsamt werden)

Wie viel Pflege / Kopfschmerzen ist es wert, dass es schneller läuft?

Verhältnis von Updates / Einfügungen vs Abfragen?

usw.

3. Welche Arten von Änderungen können vorgenommen werden?

- Wenn Sie Oracle verwenden, halten Sie die Statistiken auf dem neuesten Stand! =)

- Normalisierung / De-Normalisierung entweder kann man die Leistung in Abhängigkeit von der Verwendung der Tabelle verbessern. Ich normalisiere fast immer und dann nur, wenn ich auf keine andere praktische Art die Abfrage schneller machen kann. Ein guter Weg zur Denormalisierung für Abfragen und wenn es Ihre Situation erlaubt, ist, die realen Tabellen normalisiert zu halten und eine denormalisierte "Tabelle" mit einer materialisierten Ansicht zu erstellen.

- Index vernünftig. Zu viele können auf vielen Ebenen schlecht sein. BitMap-Indizes sind in Oracle großartig, solange Sie die Spalte nicht häufig aktualisieren und diese Spalte eine geringe Kardinalität aufweist.

- Verwenden von indexierten Tabellen.

- Partitionierte und unterpartitionierte Tabellen und Indizes

- Verwenden Sie gespeicherte Prozeduren, um den Umlauf von Anwendungen zu reduzieren, die Sicherheit zu erhöhen und die Abfrageoptimierung zu aktivieren, ohne die Benutzer zu beeinträchtigen.

- Wenn nötig, Tabellen im Speicher pinnen (viel und ziemlich klein)

- Gerätepartitionierung zwischen Index- und Tabellen-Datenbankdateien.

..... die Liste geht weiter. =)

Ich hoffe, das ist hilfreich für Sie.

    
RC. 27.09.2008 05:41
quelle

Tags und Links