566 Stimmen

Fehler bei der Datenbankentwicklung, die von Anwendungsentwicklern gemacht werden

Was sind häufige Fehler bei der Datenbankentwicklung, die von Anwendungsentwicklern gemacht werden?

31voto

Christophe Herreman Punkte 15654

Keine Indizes verwenden.

28voto

adam Punkte 31

Schlechte Leistung verursacht durch korrelierte Unterabfragen

In den meisten Fällen sollten Sie korrelierte Unterabfragen vermeiden. Eine Unterabfrage ist korreliert, wenn innerhalb der Unterabfrage ein Verweis auf eine Spalte aus der äußeren Abfrage vorhanden ist. In diesem Fall wird die Unterabfrage für jede zurückgegebene Zeile mindestens einmal ausgeführt, und sie könnte noch öfter ausgeführt werden, wenn nach der Bedingung, die die korrelierte Unterabfrage enthält, andere Bedingungen angewendet werden.

Verzeihen Sie das konstruierte Beispiel und die Oracle-Syntax, aber nehmen wir an, Sie möchten alle Mitarbeiter finden, die in einer Ihrer Filialen eingestellt wurden, seit die Filiale das letzte Mal weniger als 10.000 $ Umsatz an einem Tag gemacht hat.

select e.first_name, e.last_name
from employee e
where e.start_date > 
        (select max(ds.transaction_date)
         from daily_sales ds
         where ds.store_id = e.store_id and
               ds.total < 10000)

Die Unterabfrage in diesem Beispiel ist über die store_id mit der äußeren Abfrage korreliert und würde für jeden Mitarbeiter in Ihrem System ausgeführt werden. Eine Möglichkeit, diese Abfrage zu optimieren, besteht darin, die Unterabfrage in eine Inline-Ansicht zu verschieben.

select e.first_name, e.last_name
from employee e,
     (select ds.store_id,
             max(s.transaction_date) transaction_date
      from daily_sales ds
      where ds.total < 10000
      group by s.store_id) dsx
where e.store_id = dsx.store_id and
      e.start_date > dsx.transaction_date

In diesem Beispiel ist die Abfrage in der from-Klausel nun eine Inline-Ansicht (wieder eine Oracle-spezifische Syntax) und wird nur einmal ausgeführt. Abhängig von Ihrem Datenmodell wird diese Abfrage wahrscheinlich viel schneller ausgeführt. Sie würde mit zunehmender Anzahl der Mitarbeiter besser funktionieren als die erste Abfrage. Die erste Abfrage könnte sogar besser funktionieren, wenn es nur wenige Mitarbeiter und viele Filialen gäbe (und vielleicht viele der Filialen keine Mitarbeiter hätten) und die Tabelle daily_sales auf store_id indiziert wäre. Dies ist kein wahrscheinliches Szenario, zeigt aber, wie eine korrelierte Abfrage möglicherweise besser abschneiden könnte als eine alternative.

Ich habe schon oft erlebt, dass Junior-Entwickler Unterabfragen korrelieren, und das hat in der Regel erhebliche Auswirkungen auf die Leistung. Wenn Sie jedoch eine korrelierte Unterabfrage entfernen, achten Sie darauf, dass Sie die Plan erläutern vorher und nachher, um sicherzustellen, dass Sie die Leistung nicht verschlechtern.

21voto

Kb. Punkte 6960

Meiner Erfahrung nach:
Nicht mit erfahrenen DBAs zu kommunizieren.

17voto

Nathan Voxland Punkte 14475

Verwendung von Access anstelle einer "echten" Datenbank. Es gibt viele großartige kleine und sogar kostenlose Datenbanken wie SQL Express , MySQL y SQLite die viel besser funktionieren und skalierbar sind. Apps müssen oft auf unerwartete Weise skaliert werden.

16voto

TheTXI Punkte 36691

Sie haben vergessen, Beziehungen zwischen den Tabellen einzurichten. Ich erinnere mich, dass ich dies zu Beginn meiner Tätigkeit bei meinem jetzigen Arbeitgeber bereinigen musste.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X